#include "stdio.h"#include "stdlib.h"#include "malloc.h"#define Null 0#define MAX 20typedef struct ArcNode{int adjvex;int weight;struct ArcNode *nextarc;}ArcNode,*AdjList;typedef struct Graph{AdjList elem[MAX+1];int vexnum;int arcnum;int GraphKind;}Graph;typedef struct Stack{int s[MAX];int top;}Stack;void initStack(Stack *s){(*s).top=0;}int Push(Stack *s, int e){if((*s).top>=MAX) return 0;else (*s).s[(*s).top++]=e;}int Pop(Stack *s, int *e){if((*s).top<=0) return 0;else *e=(*s).s[--(*s).top];}int StackEmpty(Stack s){if(s.top==0)return 1;else return 0;}void create(Graph *G){int i, start, end; AdjList p;for(i=0;i<=MAX;i++)(*G).elem[i]=Null;for(i=1;i<=(*G).arcnum;i++){scanf("%d,%d",&start,&end);p=(AdjList)malloc(sizeof(ArcNode));p->adjvex=end;p->nextarc=(*G).elem[start];(*G).elem[start]=p;if((*G).GraphKind==0){p=(AdjList)malloc(sizeof(ArcNode));p->adjvex=start;p->nextarc=(*G).elem[end];(*G).elem[end]=p;}}}int TopoSort(Graph G){}main(){Graph G;printf("Please input the number of vex, arc and GraphKind:");scanf("%d,%d,%d",&G.vexnum,&G.arcnum,&G.GraphKind);create(&G);printf("The outcome of TopoSort is:\n");TopoSort(G);}阅读并运行下面程序,补充拓扑排序算法,根据输入,输出有向图的拓扑排序序列。。
时间: 2024-03-11 08:47:31 浏览: 67
这段程序中,缺少拓扑排序算法的具体实现,需要补充。
拓扑排序算法的基本思想是通过不断地删除入度为0的顶点来构造拓扑序列。
具体地,可以使用队列来实现拓扑排序算法。首先,计算每个顶点的入度,将入度为0的顶点加入队列中。然后,不断从队列中取出顶点,并将其从图中删除,同时将与其相邻的顶点的入度减1。如果删除后某个顶点的入度变为0,则将其加入队列中。当队列为空时,所有顶点都已经被删除,此时的顺序即为拓扑序列。
下面给出实现拓扑排序的代码:
```
int TopoSort(Graph G){
int i, j, k;
int count = 0; // 记录已经输出的顶点数
int indegree[MAX+1]; // 记录每个顶点的入度
ArcNode *p;
Stack s;
initStack(&s);
for (i = 1; i <= G.vexnum; i++) {
indegree[i] = 0;
}
// 计算每个顶点的入度
for (i = 1; i <= G.vexnum; i++) {
p = G.elem[i];
while (p != Null) {
indegree[p->adjvex]++;
p = p->nextarc;
}
}
// 将入度为0的顶点加入栈中
for (i = 1; i <= G.vexnum; i++) {
if (indegree[i] == 0) {
Push(&s, i);
}
}
// 不断从栈中取出顶点,输出,并删除与其相邻的边
while (!StackEmpty(s)) {
Pop(&s, &i);
printf("%d ", i);
count++;
p = G.elem[i];
while (p != Null) {
j = p->adjvex;
indegree[j]--;
if (indegree[j] == 0) {
Push(&s, j);
}
p = p->nextarc;
}
}
if (count < G.vexnum) {
printf("Error: the graph has a cycle!\n");
return 0;
}
return 1;
}
```
在主函数中,调用 `TopoSort` 函数即可完成拓扑排序。
阅读全文