请用C语言输出图G2拓扑排序的结果(利用队列作为存储工具)
时间: 2025-01-01 17:39:25 浏览: 10
在C语言中,我们可以使用队列(通常使用数组或链表实现)来完成拓扑排序。拓扑排序是一种有向无环图(DAG)的排序算法,它将图中的节点按照一定顺序排列,使得对于每一条有向边u -> v,节点u都在节点v之前。
下面是一个简单的C语言示例,假设我们有一个二维数组`edges[]`表示图的邻接矩阵,以及一个数组`inDegree[]`记录每个节点的入度:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_NODES 100
// 队列结构体
typedef struct {
int* queue;
int front, rear;
} Queue;
// 初始化队列
Queue initQueue(int size) {
Queue q = {malloc(size * sizeof(int)), 0, 0};
return q;
}
// 入队
void enqueue(Queue* q, int value) {
if (q->rear == q->front) {
printf("Queue is full.\n");
return;
}
q->queue[q->rear++] = value;
}
// 出队
int dequeue(Queue* q) {
if (q->front == q->rear) {
printf("Queue is empty.\n");
return -1;
}
return q->queue[q->front++];
}
// 拓扑排序
void topologicalSort(int graph[MAX_NODES][MAX_NODES], int nodes, Queue* q) {
// 计算入度并初始化队列
for (int i = 0; i < nodes; ++i) {
q->inDegree[i] = 0;
for (int j = 0; j < nodes; ++j) {
if (graph[i][j] > 0) {
q->inDegree[j]++;
}
}
}
// 遍历,遇到入度为0的节点出队,并更新其相邻节点的入度
for (int i = 0; i < nodes; ++i) {
if (q->inDegree[i] == 0) {
enqueue(q, i);
}
}
while (!isEmpty(q)) {
int node = dequeue(q); // 取出队首节点
printf("%d ", node); // 输出节点值
for (int j = 0; j < nodes; ++j) {
if (graph[node][j] > 0) { // 如果存在边,减小其邻居的入度
q->inDegree[j]--;
if (q->inDegree[j] == 0) { // 更新入度为0的节点入队
enqueue(q, j);
}
}
}
}
}
// 主函数
int main() {
// 假设这里你已经有了一个二维数组graph来表示图
int nodes = ...;
int edges[][] = ...;
Queue q = initQueue(nodes);
topologicalSort(graph, nodes, &q);
return 0;
}
```
注意:这个示例假设图的邻接矩阵是对称的,即如果有边u -> v,则也有v -> u。实际应用中,需要根据具体图的结构调整代码。
阅读全文