- #define MAXVEX 100
- typedef struct EdgeNode{//邊表結點結構
- int adjvex;//存儲該結點在數組中的下標
- int weight;//存儲權值,可不用
- struct EdgeNode *next;//指向下一個鄰接點
- }EdgeNode;
- typedef struct VertexNode{
- int in;//頂點入度
- int data;//存儲頂點信息
- EdgeNode *firstedge;//邊表頭結點
- }VertexNode;
- typedef struct{
- VertexNode adjList[MAXVEX];//
- int numVertexes,numEdges;//圖中當前頂點數和邊數
- }*GraphAdjList,graphAdjList;
- bool TopoLogicalSort(GraphAdjList GL){
- EdgeNode *e;//用來遍歷邊表
- int i,k,gettop;
- int top = -1;//棧頂指針
- int count = 0;//輸出結點計數
- int *stack;//建棧存儲入度爲0的結點的下標
- stack = (int *)malloc(GL->numVertexes*sizeof(int));//分配空間
- for(i=0;i<GL->numVertexes;i++){
- if(GL->adjList[i].in == 0){//結點入度爲0
- stack[++top] = i;//入棧
- }
- }
- while(top!=-1){//棧不爲空就繼續循環
- gettop = stack[top--];//出棧
- printf("%d->",GL->adjList[gettop].data);//打印
- count++;//計數增加
- for(e=GL->adjList[gettop].firstedge;e;e=e->next){//對出棧的結點的邊表進行遍歷
- k = e->adjvex;//k爲出棧結點的鄰接點在數組中的下標
- if(!(--GL->adjList[k].in)){//如果入度減1後爲0
- stack[++top] = k;//該結點入棧
- }
- }
- }
- if(count<GL->numVertexes){//如果輸出結點數小於總數說明有環
- return false;
- }
- else{
- return true;
- }
- }