拓撲排序

 

  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.     } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章