标签:
细节!一定要细节啊!!
#include<cstdio> #include<cstring> #include<cstdlib> #define MAXVEX 100 typedef struct EdgeNode{ int adjvex; int weight; struct EdgeNode *next; }EdgeNode; typedef struct VertexNode{ int in; int data; EdgeNode *firstedge; }VertexNode,AdjList[MAXVEX]; typedef struct{ AdjList adjlist; int numVertexes,numEdges; }graphAdjList,*GraphAdjList; int TopologicalSort(GraphAdjList GL){ EdgeNode *e; int i,k,gettop; int top = -1,cnt = 0; int *stack; stack = (int *)malloc(GL->numVertexes*sizeof(int)); for(i=0;i<GL->numVertexes;i++){ if(GL->adjlist[i].in == 0){ stack[++top] = i; printf("%d\n",i); } } // for(i=0;i<top;i++) printf("qqqqqqqq %d\n",stack[i]); // printf("stack is %d\n",top); while(top>-1){ //注意!!!!一定要注意!!!!这里判断条件不是top!=0 !!!! //注意!!!!一定要注意!!!!这里判断条件不是top!=0 !!!! //注意!!!!一定要注意!!!!这里判断条件不是top!=0 !!!! //注意!!!!一定要注意!!!!这里判断条件不是top!=0 !!!! gettop = stack[top--]; // printf("%d top = %d\n",GL->adjlist[gettop].data,top); printf("%d ",GL->adjlist[gettop].data); cnt++; for(e = GL->adjlist[gettop].firstedge;e;e = e->next){ k = e->adjvex; // printf("adjlist[%d].in = %d\n",k,GL->adjlist[k].in); if(!(--GL->adjlist[k].in)){ stack[++top] = k; // printf("k = %d\n",k); } } // printf("top == %d\n",top); } printf("\n"); if(cnt<GL->numVertexes) return 0; else return 1; } void CreateGraph(GraphAdjList G){ int i,j,k,w; EdgeNode *e; printf("请输入顶点数和边数:\n"); scanf("%d %d",&G->numVertexes,&G->numEdges); for(i=0;i<G->numVertexes;i++){ G->adjlist[i].data = i; G->adjlist[i].in = 0; G->adjlist[i].firstedge = NULL; } for(k=0;k<G->numEdges;k++){ // printf("请输入边(vi,vj)上的下标i,下标j和权w:\n"); scanf("%d %d",&i,&j); EdgeNode *temp = G->adjlist[i].firstedge; if(temp == NULL){ EdgeNode *NewEdge = (EdgeNode *)malloc(sizeof(EdgeNode)); NewEdge->adjvex = j; // NewEdge->weight = w; NewEdge->next = NULL; G->adjlist[i].firstedge = NewEdge; G->adjlist[j].in++; }else{ while(temp->next!=NULL) temp = temp->next; EdgeNode *NewEdge = (EdgeNode *)malloc(sizeof(EdgeNode)); NewEdge->adjvex = j; // NewEdge->weight = w; NewEdge->next = NULL; temp->next = NewEdge; G->adjlist[j].in++; } } } void test(graphAdjList G){ int i,j,k; for(i=0;i<G.numVertexes;i++){ // printf("%d %d\n",G.adjlist[i].data,G.adjlist[i].in); printf("%d %d ",G.adjlist[i].in,G.adjlist[i].data); if(G.adjlist[i].firstedge){ EdgeNode *temp = G.adjlist[i].firstedge; while(temp){ printf("%d ",temp->adjvex); temp = temp->next; } } else printf("no"); printf("\n"); } } int main(){ graphAdjList G; CreateGraph(&G); printf("sssssssssssssssssssssssssssssss\n"); //test(G); printf("sssssssssssssssssssssssssssssss\n"); printf(" %d\n",TopologicalSort(&G)); return 0; } /* 14 20 0 11 0 5 0 4 1 8 1 4 1 2 2 9 2 6 2 5 3 13 3 2 4 7 5 12 5 8 6 5 8 7 9 11 9 10 10 13 12 9 */
标签:
原文地址:http://www.cnblogs.com/zhuozhuo/p/5418331.html