拓扑排序。任意给定一个有向图,设计一个算法,对它进行拓扑排序。拓扑排序算法思想:a.在有向图中任选一个没有前趋的顶点输出;b.从图中删除该顶点和所有以它为尾的弧;c.重复上述a、b,直到全部顶点都已输出,此时,顶点输出序列即为一个拓朴有序序列;或者直到图中没有无前趋的顶点为止,此情形表明有向图中存在环。C语言写出此代码
时间: 2024-02-11 20:06:32 浏览: 82
好的,下面是在C语言中实现拓扑排序的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
typedef struct ArcNode {
int adjvex; // 弧所指向的顶点的位置
struct ArcNode *nextarc; // 下一条弧的指针
} ArcNode;
typedef struct VNode {
int data; // 顶点的数据
ArcNode *firstarc; // 第一条弧的指针
int indegree; // 顶点的入度
} VNode;
typedef struct {
VNode vertex[MAX_VERTEX_NUM]; // 顶点数组
int vexnum, arcnum; // 顶点数和弧数
} Graph;
// 初始化图
void initGraph(Graph *G) {
int i;
for (i = 0; i < G->vexnum; i++) {
G->vertex[i].firstarc = NULL;
G->vertex[i].indegree = 0;
}
}
// 添加一条弧
void addArc(Graph *G, int tail, int head) {
ArcNode *arc = (ArcNode*)malloc(sizeof(ArcNode));
arc->adjvex = head;
arc->nextarc = G->vertex[tail].firstarc;
G->vertex[tail].firstarc = arc;
G->vertex[head].indegree++;
}
// 拓扑排序
int topologicalSort(Graph *G, int *result) {
int i, j, count = 0;
int front = -1, rear = -1;
int queue[MAX_VERTEX_NUM];
ArcNode *arc;
// 将入度为0的顶点加入队列
for (i = 0; i < G->vexnum; i++) {
if (G->vertex[i].indegree == 0) {
queue[++rear] = i;
}
}
while (front < rear) {
// 取出队首元素
i = queue[++front];
result[count++] = i;
// 将该顶点指向的所有顶点的入度减1,如果减1后入度为0,则加入队列
arc = G->vertex[i].firstarc;
while (arc != NULL) {
j = arc->adjvex;
if (--G->vertex[j].indegree == 0) {
queue[++rear] = j;
}
arc = arc->nextarc;
}
}
if (count < G->vexnum) {
// 图中存在环
return 0;
} else {
// 拓扑排序成功
return 1;
}
}
int main() {
int i;
Graph G;
int result[MAX_VERTEX_NUM];
// 初始化图
G.vexnum = 6;
G.arcnum = 8;
initGraph(&G);
// 添加弧
addArc(&G, 0, 1);
addArc(&G, 0, 2);
addArc(&G, 1, 3);
addArc(&G, 1, 4);
addArc(&G, 2, 4);
addArc(&G, 3, 5);
addArc(&G, 4, 3);
addArc(&G, 4, 5);
// 拓扑排序
if (topologicalSort(&G, result)) {
printf("拓扑排序结果:\n");
for (i = 0; i < G.vexnum; i++) {
printf("%d ", result[i]);
}
printf("\n");
} else {
printf("图中存在环\n");
}
return 0;
}
```
以上是一个简单的拓扑排序的C语言实现。
阅读全文