hqt

Hong Quan - Graph

hqt
Aug 25th, 2013
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.07 KB | None | 0 0
  1. #include "stdio.h"
  2. #include "conio.h"
  3. #include "malloc.h"
  4. #define MAX 100
  5.  
  6. struct node
  7. {
  8.     int key;
  9.     struct node *next;
  10. };
  11.  
  12. struct node *a[MAX];
  13. struct node *z;
  14.  
  15. int val[MAX];
  16. int n;
  17. int id = 0;
  18.  
  19. void init(int r)
  20. {
  21.     int i;
  22.    
  23.     z =(struct node *) malloc(sizeof *z);
  24.     z->key = -1;
  25.     z->next = z;
  26.    
  27.     for(i = 1; i <= r; ++i)
  28.     {
  29.         a[i] =(struct node *) malloc(sizeof *a[i]);
  30.         a[i]->key = -1;
  31.         a[i]->next = z;
  32.     }
  33. }
  34.  
  35. int index(char c)
  36. {
  37.     int t;
  38.     t = c - 'A' + 1;
  39.     return t;
  40. }
  41.  
  42. void show(struct node *t)
  43. {
  44.     struct node *k;
  45.     k = t->next;
  46.     while(k != z)
  47.     {
  48.         printf("%3d", k->key);
  49.         k = k->next;
  50.     }
  51. }
  52.  
  53. void insert(int x, struct node *q, struct node *k)
  54. {
  55.     struct node *p;
  56.    
  57.     q->key = x;
  58.     q->next = z;
  59.     p = k;
  60.    
  61.     if(p->next == z)
  62.     {
  63.         k->next = q;
  64.     }
  65.     else
  66.     {
  67.         while(p->next != z)
  68.         {
  69.             p = p->next;
  70.         }
  71.         p->next= q;
  72.     }
  73. }
  74.  
  75. void vist(int k)
  76. {
  77.     struct node *t;
  78.     val[k] = ++id;
  79.     //printf("\n Tada %d", val[k]);
  80.     printf("\n\nVisited vertex %d", k);
  81.     for(t = a[k]->next; t!= z; t = t->next)
  82.     {
  83.         if(val[t->key] == 0)
  84.             vist(t->key);
  85.     }
  86. }
  87.  
  88. void listdfs()
  89. {
  90.     int i;
  91.     for(i = 1; i <= n; ++i)
  92.     {
  93.         val[i] = 0;
  94.     }
  95.     for(i = 1; i <= n; ++i)
  96.     {
  97.         if(val[i] == 0) vist(i);
  98.     }
  99. }
  100.  
  101. void del_node(int x, int y)
  102. {
  103.     struct node *t;
  104.     struct node *k;
  105.     struct node *m;
  106.    
  107.     k = a[y];
  108.     t = a[x];
  109.    
  110.     if(k->key == x)
  111.     {
  112.         m = k;
  113.         k = k->next;
  114.         free(m);
  115.     }
  116.     else
  117.     {
  118.         while(k->next->key != x)
  119.         {
  120.             k = k->next;
  121.             if(k->next == z)
  122.             {
  123.                 printf("\nThere is no edge between %d and %d", x, y);
  124.                 goto tt;
  125.             }
  126.         }
  127.         m = k->next;
  128.         k->next = k->next->next;
  129.         free(m);
  130.     }
  131.    
  132.     if(t->key == y)
  133.     {
  134.         m = t;
  135.         t = t->next;
  136.         free(m);
  137.     }
  138.     else
  139.     {
  140.         while(t->next->key != y)
  141.         {
  142.             t = t->next;
  143.         }
  144.         m = t->next;
  145.         t->next = t->next->next;
  146.         free(m);
  147.     }
  148.     tt:;
  149. }
  150.  
  151. void sort(int i)
  152. {
  153.     struct node *t;
  154.     int ks[MAX];
  155.     int d = 0;
  156.     int j, r, q;
  157.    
  158.     for(t = a[i]; t != z; t = t->next)
  159.     {
  160.         d += 1;
  161.         ks[d] = t->key;
  162.     }
  163.    
  164.     for(j = 1; j <= d; ++j)
  165.     {
  166.         for(r = j + 1; r <= d; ++r)
  167.         {
  168.             if(ks[j] > ks[r])
  169.             {
  170.                 q = ks[r];
  171.                 ks[r] = ks[j];
  172.                 ks[j] = q;
  173.             }
  174.         }
  175.     }
  176.    
  177.     d = 0;
  178.     for(t = a[i]; t != z; t = t->next)
  179.     {
  180.         d += 1;
  181.         t->key = ks[d];
  182.     }
  183. }
  184.  
  185. int main()
  186. {
  187.     struct node *q;
  188.     int x, i, stop;
  189.     FILE *fp;
  190.    
  191.     //open file
  192.     fp = fopen("alo.txt", "r");
  193.     if(fp == NULL)
  194.     {
  195.         printf("\nError");
  196.         return 0;
  197.     }
  198.    
  199.     //scan n
  200.     fscanf(fp, "%d\n", &n);
  201.     printf("\n\nGraph G has: %d vertexes", n);
  202.     init(n);
  203.    
  204.     //...
  205.     while(!feof(fp))
  206.     {
  207.         fscanf(fp, "%d\n", &i);
  208.         stop = 0;
  209.         while(!stop)
  210.         {
  211.             fscanf(fp, "%d\n", &x);
  212.             if(x != 0)
  213.             {
  214.                 q =(struct node *) malloc(sizeof *q);
  215.                 insert(x, q, a[i]);
  216.             }
  217.             else stop = 1;
  218.         }
  219.     }
  220.    
  221.     //close file
  222.     fclose(fp);
  223.    
  224.     //del sth
  225.     del_node(1, 2);
  226.     del_node(1, 3);
  227.     del_node(5, 4);
  228.    
  229.     //sort sth
  230.     /*for(i = 1; i <= n; ++i)
  231.     {
  232.         sort(i);
  233.     }*/
  234.    
  235.     //print
  236.     for(i = 1; i <= n; ++i)
  237.     {
  238.         printf("\n\tVertex %d:", i);
  239.         show(a[i]);
  240.     }
  241.    
  242.     printf("\n\nStarting visit :");
  243.     listdfs();
  244.    
  245.     printf("\n\n");
  246.     getch();
  247. }
Advertisement
Add Comment
Please, Sign In to add comment