运用C语言数据结构中的栈来实现有向无环图邻接矩阵的拓扑排序。具体代码
时间: 2024-12-20 19:21:12 浏览: 14
在C语言中,我们可以使用栈(Stack)来实现有向无环图(DAG,Directed Acyclic Graph)的拓扑排序。拓扑排序是一种将图中节点按照一定顺序排列的方式,使得对于每条有向边 (u, v),节点 u 都排在节点 v 的前面。
以下是使用栈实现拓扑排序的基本步骤:
1. 初始化:创建一个空的栈和一个已访问数组,用于跟踪每个节点是否已经被处理过。
2. 遍历邻接矩阵:对每一个节点,如果它没有前驱(即所有出度为0),则认为这是一个根节点,将其压入栈中。
3. 循环处理栈顶节点:当栈非空时,弹出一个节点(`top`),并将它标记为已访问。然后遍历其所有的邻居(`adjacent`),如果邻居未被访问,就将邻居压入栈中,并更新邻居的“入度”(减一表示有一条边指向已访问的节点)。
4. 检查是否完成:如果邻接矩阵中的所有节点都被访问过了,那么可以确定已经完成了拓扑排序。因为如果有环,无论如何不可能通过上述过程得到所有节点都已被访问的情况。
5. 返回结果:如果栈为空,说明已经完成了拓扑排序并获取了节点的顺序。此时,从已访问数组中提取节点即可,它们就是按照拓扑排序的顺序排列的结果。
由于代码较长且涉及到一些C语言的具体细节,这里仅提供伪代码示例:
```c
typedef struct Node {
int id;
int* adjacent; // 存储邻接节点的索引
int in_degree; // 入度
} Node;
void topo_sort(Node** graph, int num_nodes) {
stack_t* s = create_stack();
bool* visited = create_array(num_nodes, false);
for (int i = 0; i < num_nodes; ++i) {
if (visited[i] == false && out_degree(graph[i]) == 0) {
push(s, &graph[i]);
visited[i] = true;
}
}
while (!is_empty(s)) {
Node* node = pop(s);
// 添加代码片段:打印当前节点id或将其添加到结果列表中
for (int neighbor : node->adjacent) {
Node* neighbor_node = &graph[neighbor];
if (visited[neighbor_node->id] == false) {
decrement_in_degree(neighbor_node);
if (out_degree(neighbor_node) == 0) {
push(s, &neighbor_node);
visited[neighbor_node->id] = true;
}
}
}
}
// 检查并返回拓扑序列
if (is_sorted(visited)) {
print_topological_order(visited, num_nodes);
} else {
printf("Graph contains a cycle and cannot be topologically sorted.\n");
}
destroy_stack(s);
destroy_array(visited);
}
// ...其他辅助函数...
```
阅读全文