对这个有向图进行拓扑排序
/* * 拓扑排序(采用邻接矩阵存储) */ #include<stdio.h> #define MAX_VERTEX_NUM 20 //图的定义 typedef struct { int vertexNum; char vertex[MAX_VERTEX_NUM]; int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; }Graph,*PGraph; //构造有向图 void createdGraph(PGraph g) { int i,j; g->vertexNum=6; for(i=0;i<g->vertexNum;i++) g->vertex[i]='A'+i; for(i=0;i<g->vertexNum;i++) for(j=0;j<g->vertexNum;j++) g->arc[i][j]=0; g->arc[0][1]=1; g->arc[0][2]=1; g->arc[0][3]=1; g->arc[1][4]=1; g->arc[2][1]=1; g->arc[2][4]=1; g->arc[4][3]=1; g->arc[4][5]=1; } //拓扑排序 void TopologicalSort(PGraph g) { int i,j,k=0,m; char vertex[MAX_VERTEX_NUM]; while(k < g->vertexNum){ //1.找没有入度的顶点,存入数组vertex中 for(i=0;i<g->vertexNum;i++){ for(j=0;j<g->vertexNum;j++){ if(g->arc[j][i]!=0) break; } if(j==g->vertexNum){ //检查g->vertex[i]是否已经遍历 for(m=0;m<k;m++) if(vertex[m]==g->vertex[i]) break; if(m==k){ vertex[k++]=g->vertex[i]; break; } } } //2.没有入度为0的顶点 if(i==g->vertexNum){ printf("存在回路!\n"); return ; } //3.删除这个顶点的出度 for(j=0;j<g->vertexNum;j++) g->arc[i][j]=0; } //输出排序后的结果 printf("拓扑排序结果:\n"); for(i=0;i<k;i++) printf("%-3c",vertex[i]); printf("\n"); } void main() { Graph graph; createdGraph(&graph); TopologicalSort(&graph); }