用c语言创建AOV网的算法 输入点数、边数、点的值、边的两个端点 2.求AOV网中所有点的入度的算法 3.输出AOV网的拓扑序列的算法 4.用main()函数测试上述算法的正确性
时间: 2024-02-19 18:58:27 浏览: 134
AOC算法C语言实现
以下是用C语言实现AOV网的算法,包括输入点数、边数、点的值、边的两个端点、求AOV网中所有点的入度的算法、输出AOV网的拓扑序列的算法和用main()函数测试上述算法的正确性。
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
// 边结构体
typedef struct ArcNode {
int adjvex; // 邻接点编号
struct ArcNode *next; // 指向下一个邻接点的指针
} ArcNode;
// 顶点结构体
typedef struct VertexNode {
int data; // 顶点的值
ArcNode *firstarc; // 指向第一个邻接点的指针
int indegree; // 顶点的入度
} VertexNode;
// AOV网结构体
typedef struct {
VertexNode vertex[MAX_VERTEX_NUM]; // 存储顶点信息的数组
int vexnum; // 顶点个数
int arcnum; // 边的个数
} AOVNet;
// 初始化AOV网
void InitAOVNet(AOVNet *G) {
int i, j, k;
printf("请输入顶点个数和边的个数:");
scanf("%d%d", &G->vexnum, &G->arcnum);
printf("请输入%d个顶点的值:", G->vexnum);
for (i = 0; i < G->vexnum; i++) {
scanf("%d", &G->vertex[i].data);
G->vertex[i].firstarc = NULL; // 初始化邻接表
G->vertex[i].indegree = 0; // 初始化入度
}
printf("请输入%d条边的起点和终点:", G->arcnum);
for (k = 0; k < G->arcnum; k++) {
int i, j;
scanf("%d%d", &i, &j);
// 创建边结点
ArcNode *arc = (ArcNode*)malloc(sizeof(ArcNode));
arc->adjvex = j;
arc->next = G->vertex[i].firstarc;
G->vertex[i].firstarc = arc;
// 计算终点的入度
G->vertex[j].indegree++;
}
}
// 求AOV网中所有点的入度
void GetInDegree(AOVNet *G, int indegree[]) {
int i;
for (i = 0; i < G->vexnum; i++) {
indegree[i] = G->vertex[i].indegree;
}
}
// 输出AOV网的拓扑序列
void TopologicalSort(AOVNet *G) {
int i, j;
int indegree[MAX_VERTEX_NUM];
GetInDegree(G, indegree); // 求所有点的入度
printf("AOV网的拓扑序列为:");
for (i = 0; i < G->vexnum; i++) {
if (indegree[i] == 0) { // 找到入度为0的点
printf("%d ", G->vertex[i].data); // 输出该点
indegree[i] = -1; // 标记该点已被输出
// 将该点的后继点的入度减1
ArcNode *p = G->vertex[i].firstarc;
while (p != NULL) {
j = p->adjvex;
indegree[j]--;
p = p->next;
}
i = -1; // 重新扫描图
}
}
}
int main() {
AOVNet G;
InitAOVNet(&G); // 初始化AOV网
TopologicalSort(&G); // 输出AOV网的拓扑序列
return 0;
}
```
在上述代码中,我们首先定义了边结构体ArcNode和顶点结构体VertexNode,然后定义了AOV网结构体AOVNet。InitAOVNet()函数用于初始化AOV网,包括输入顶点个数、边数、点的值、边的两个端点,并构建邻接表和计算每个顶点的入度。GetInDegree()函数用于求AOV网中所有点的入度。TopologicalSort()函数用于输出AOV网的拓扑序列,它先求出所有点的入度,然后不断找到入度为0的点输出,并将该点的后继点的入度减1,直到所有点都被输出为止。在main()函数中,我们先调用InitAOVNet()函数初始化AOV网,然后调用TopologicalSort()函数输出AOV网的拓扑序列。
可以通过输入以下测试数据来测试该算法的正确性:
```
5 6
1 2 3 4 5
0 1
0 3
1 2
1 3
2 4
3 4
```
该测试数据表示AOV网中有5个顶点,6条边,顶点的值分别为1、2、3、4、5,边的起点和终点分别为(0,1)、(0,3)、(1,2)、(1,3)、(2,4)、(3,4)。输出的拓扑序列应为1 2 3 4 5。
阅读全文