1. #define MAXVEX 100 
  2. typedef struct EdgeNode{//边表结点结构  
  3.     int adjvex;//存储该结点在数组中的下标  
  4.     int weight;//存储权值,可不用  
  5.     struct EdgeNode *next;//指向下一个邻接点  
  6. }EdgeNode; 
  7. typedef struct VertexNode{ 
  8.     int in;//顶点入度  
  9.     int data;//存储顶点信息  
  10.     EdgeNode *firstedge;//边表头结点  
  11. }VertexNode; 
  12. typedef struct
  13.     VertexNode adjList[MAXVEX];// 
  14.     int numVertexes,numEdges;//图中当前顶点数和边数  
  15. }*GraphAdjList,graphAdjList; 
  16.  
  17. bool TopoLogicalSort(GraphAdjList GL){ 
  18.     EdgeNode *e;//用来遍历边表  
  19.     int i,k,gettop; 
  20.     int top = -1;//栈顶指针  
  21.     int count = 0;//输出结点计数  
  22.     int *stack;//建栈存储入度为0的结点的下标  
  23.     stack = (int *)malloc(GL->numVertexes*sizeof(int));//分配空间  
  24.     for(i=0;i<GL->numVertexes;i++){ 
  25.         if(GL->adjList[i].in == 0){//结点入度为0  
  26.             stack[++top] = i;//入栈  
  27.         } 
  28.     } 
  29.     while(top!=-1){//栈不为空就继续循环  
  30.         gettop = stack[top--];//出栈  
  31.         printf("%d->",GL->adjList[gettop].data);//打印  
  32.         count++;//计数增加  
  33.         for(e=GL->adjList[gettop].firstedge;e;e=e->next){//对出栈的结点的边表进行遍历  
  34.             k = e->adjvex;//k为出栈结点的邻接点在数组中的下标  
  35.             if(!(--GL->adjList[k].in)){//如果入度减1后为0  
  36.                 stack[++top] = k;//该结点入栈  
  37.             } 
  38.         } 
  39.     } 
  40.     if(count<GL->numVertexes){//如果输出结点数小于总数说明有环  
  41.         return false
  42.     } 
  43.     else
  44.         return true
  45.     }