编程实现生成逆邻接表c语言
时间: 2023-12-25 21:17:16 浏览: 73
生成逆邻接表的代码实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 定义最大顶点数
// 定义邻接表中的边结构体
typedef struct ArcNode {
int adjvex; // 邻接点在顶点数组中的下标
struct ArcNode *nextarc; // 指向下一个边结点的指针
} ArcNode;
// 定义邻接表中的顶点结构体
typedef struct VNode {
int data; // 顶点的数据
ArcNode *firstarc; // 指向第一个边结点的指针
} VNode, AdjList[MAX_VERTEX_NUM];
// 定义邻接表结构体
typedef struct {
AdjList vertices; // 邻接表中的顶点数组
int vexnum, arcnum; // 顶点数和边数
} ALGraph;
// 生成逆邻接表
void CreateInverseALGraph(ALGraph *G, ALGraph *invG) {
int i, j;
ArcNode *p;
// 初始化逆邻接表
invG->vexnum = G->vexnum;
invG->arcnum = G->arcnum;
for (i = 0; i < G->vexnum; i++) {
invG->vertices[i].data = i; // 顶点的数据为下标
invG->vertices[i].firstarc = NULL; // 初始化指向第一个边结点的指针为空
}
// 生成逆邻接表
for (i = 0; i < G->vexnum; i++) {
p = G->vertices[i].firstarc;
while (p != NULL) {
j = p->adjvex;
// 在逆邻接表中添加一条边
ArcNode *q = (ArcNode *)malloc(sizeof(ArcNode));
q->adjvex = i;
q->nextarc = invG->vertices[j].firstarc;
invG->vertices[j].firstarc = q;
p = p->nextarc;
}
}
}
int main() {
int i, j, k;
ALGraph G, invG; // 声明邻接表和逆邻接表
ArcNode *p;
printf("请输入顶点数和边数:");
scanf("%d%d", &G.vexnum, &G.arcnum);
// 初始化邻接表
for (i = 0; i < G.vexnum; i++) {
G.vertices[i].data = i;
G.vertices[i].firstarc = NULL;
}
// 创建邻接表
for (k = 0; k < G.arcnum; k++) {
printf("请输入一条边的起点和终点:");
scanf("%d%d", &i, &j);
// 添加一条边
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = j;
p->nextarc = G.vertices[i].firstarc;
G.vertices[i].firstarc = p;
}
// 输出邻接表
printf("邻接表如下:\n");
for (i = 0; i < G.vexnum; i++) {
printf("%d: ", G.vertices[i].data);
p = G.vertices[i].firstarc;
while (p != NULL) {
printf("%d ", p->adjvex);
p = p->nextarc;
}
printf("\n");
}
// 生成逆邻接表
CreateInverseALGraph(&G, &invG);
// 输出逆邻接表
printf("逆邻接表如下:\n");
for (i = 0; i < invG.vexnum; i++) {
printf("%d: ", invG.vertices[i].data);
p = invG.vertices[i].firstarc;
while (p != NULL) {
printf("%d ", p->adjvex);
p = p->nextarc;
}
printf("\n");
}
return 0;
}
```
以上代码实现了从邻接表生成逆邻接表的功能,代码中使用了邻接表和逆邻接表两个结构体来存储图,并且提供了函数 `CreateInverseALGraph()` 来生成逆邻接表。在函数中,首先初始化逆邻接表,然后遍历邻接表中每个顶点的每条出边,在逆邻接表中添加一条相应的入边。最后,输出邻接表和逆邻接表的信息。
阅读全文