CH6_4.C
上传用户:lgb298
上传日期:2013-03-22
资源大小:1025k
文件大小:2k
源码类别:

软件工程

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <alloc.h>
  3. #define M 10
  4. typedef struct node
  5. {   int vex;
  6.     struct node *next;
  7. }JD;
  8. typedef struct tnode
  9. {   int vexdata;
  10.     int in;
  11.     struct node *link;
  12. }TD;
  13. void toposort(TD g[],int n)
  14. {  int top,m,k,j;
  15.    JD *p;
  16.    top=0; m=0;
  17.    for(j=1;j<=n;j++)
  18.      if(g[j].in==0)
  19.      {  g[j].in=top; 
  20.         top=j;
  21.      }
  22.    while(top>0)
  23.    {  j=top;
  24.       top=g[top].in;
  25.       printf("%d  ",j);
  26.       m++;
  27.       p=g[j].link;
  28.       while(p!=NULL)
  29.       {  k=p->vex;
  30.  g[k].in--;
  31.  if(g[k].in==0)
  32.  {   g[k].in=top;
  33.      top=k;
  34.  }
  35.  p=p->next;
  36.       }
  37.    }
  38.    printf("nm=%dn",m);
  39.    if(m<n)  printf("The network has a cyclen");
  40. }
  41. int loc_vertex(TD g[],int vex,int n)
  42. {   int i,j;
  43.     for(i=1;i<=n;i++)
  44.        if(g[i].vexdata==vex)
  45.    return(i);
  46.     return(0);
  47. }
  48. int crt_linklist(TD g[])
  49. {   int n,e,i,j,k,vt,vh,flag;
  50.     JD *p;
  51.     printf("Input and the number of node,arc:");
  52.     scanf("%d,%d",&n,&e);
  53.     for(i=1;i<=n;i++)
  54.     {  printf("g[%d].vexdata=",i);
  55.        scanf("%d",&g[i].vexdata);
  56.        g[i].in=0;
  57.        g[i].link=NULL;
  58.     }
  59.     for(k=1;k<=e;k++)
  60.     {   printf("Vt,Vh:");
  61. scanf("%d,%d",&vt,&vh);
  62. i=loc_vertex(g,vt,n);
  63. j=loc_vertex(g,vh,n);
  64. p=(JD *)malloc(sizeof(JD));
  65. p->vex=j;
  66. p->next=g[i].link;
  67. g[i].link=p;
  68.     }
  69.     return(n);
  70. }
  71. void cal_in(TD g[],int n)
  72. {  int i,k;
  73.    JD *p;
  74.    for(i=1;i<=n;i++)
  75.    {  p=g[i].link;
  76.       while(p!=NULL)
  77.       {  k=p->vex;
  78.  g[k].in++;
  79.  p=p->next;
  80.       }
  81.    }
  82. }
  83. void main()
  84. {  int n;
  85.    TD g[M];
  86.    n=crt_linklist(g);
  87.    cal_in(g,n);
  88.    toposort(g,n);
  89. }