给我一个拓扑排序的实例c语言
时间: 2024-10-13 14:10:29 浏览: 32
拓扑排序是一种有向无环图 (DAG) 中节点的线性排列算法,它保证了对于每条从u到v的有向边,节点u会排在节点v之前。下面是一个简单的C语言实现拓扑排序的实例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 定义邻接表表示图
Node** createGraph(int vertices);
void addEdge(Node** graph, int src, int dest);
void printSolution(Node** sol, int n);
int findMinIndex(Node** sol, int n);
// 检查是否有环
int hasCycle(Node** graph, int v, int visited[], int recStack[]);
int main() {
int numVertices, i, j;
printf("Enter number of vertices: ");
scanf("%d", &numVertices);
// 创建邻接表表示图
Node** graph = createGraph(numVertices);
// 添加边
printf("Enter edges (source vertex then destination vertex): \n");
for (i = 0; i < numVertices - 1; ++i) {
scanf("%d %d", &j, &j + 1); // 因为输入的是1-indexed, 所以加1处理
addEdge(graph, i, j);
}
// 拓扑排序
Node** topOrder = NULL;
if (!hasCycle(graph, 0, NULL, NULL)) { // 如果图是 DAG
topOrder = solveTopoSort(graph, numVertices);
printSolution(topOrder, numVertices);
} else {
printf("Cycle detected, no valid topological order.\n");
}
return 0;
}
// 其他辅助函数省略...
```
在这个例子中,我们首先创建了一个邻接表来存储图的结构,然后通过用户输入添加边。`hasCycle` 函数用于检查图是否存在环,如果存在则无法进行拓扑排序。`solveTopoSort` 函数实现了拓扑排序的核心部分,而 `printSolution` 函数用于打印排序后的结果。
注意,这个示例仅作为基础教学,实际应用中可能需要考虑更复杂的情况,比如循环检测和错误处理。
阅读全文