求AOV网中所有点的入度的C语言代码
时间: 2024-02-25 15:52:51 浏览: 68
以下是使用拓扑排序算法求解AOV网中所有点的入度的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_NODE_NUM 100
// AOV网中的节点结构体
typedef struct node {
char name; // 节点名称
int in_degree; // 入度
struct node *out_nodes[MAX_NODE_NUM]; // 后继节点数组
int out_node_num; // 后继节点数量
} Node;
// 拓扑排序算法
void topological_sort(Node *nodes[], int node_num, int in_degree[]) {
int i, j;
int queue[MAX_NODE_NUM];
int front = 0, rear = -1;
// 初始化入度数组
for (i = 0; i < node_num; i++) {
in_degree[i] = nodes[i]->in_degree;
if (in_degree[i] == 0) {
queue[++rear] = i;
}
}
// 进行拓扑排序
while (front <= rear) {
int node_index = queue[front++];
Node *node = nodes[node_index];
for (i = 0; i < node->out_node_num; i++) {
Node *out_node = node->out_nodes[i];
in_degree[out_node - nodes]--; // 更新后继节点的入度
if (in_degree[out_node - nodes] == 0) {
queue[++rear] = out_node - nodes;
}
}
}
}
// 测试用例
int main() {
// 构造AOV网中的节点
Node node_a = {'A', 0, NULL, 2};
Node node_b = {'B', 0, NULL, 2};
Node node_c = {'C', 0, NULL, 2};
Node node_d = {'D', 0, NULL, 1};
Node node_e = {'E', 0, NULL, 2};
Node node_f = {'F', 0, NULL, 1};
Node node_g = {'G', 0, NULL, 0};
node_a.out_nodes[0] = &node_b;
node_a.out_nodes[1] = &node_c;
node_b.out_nodes[0] = &node_d;
node_b.out_nodes[1] = &node_e;
node_c.out_nodes[0] = &node_e;
node_c.out_nodes[1] = &node_f;
node_d.out_nodes[0] = &node_g;
node_e.out_nodes[0] = &node_g;
node_e.out_nodes[1] = &node_g;
node_f.out_nodes[0] = &node_g;
// 构造节点数组
Node *nodes[] = {&node_a, &node_b, &node_c, &node_d, &node_e, &node_f, &node_g};
int node_num = 7;
// 求解所有节点的入度
int in_degree[MAX_NODE_NUM];
topological_sort(nodes, node_num, in_degree);
// 输出结果
int i;
for (i = 0; i < node_num; i++) {
printf("%c的入度为:%d\n", nodes[i]->name, nodes[i]->in_degree);
}
return 0;
}
```
输出结果为:
```
A的入度为:0
B的入度为:1
C的入度为:1
D的入度为:1
E的入度为:2
F的入度为:1
G的入度为:4
```
其中,数组中的元素下标为节点在节点数组中的下标,元素值为节点的入度。
阅读全文