用C语言先依次输入有向图的顶点信息,再依次输入有向图的弧信息,建立图的邻接表存储结构并将其打印输出并举例
时间: 2024-02-06 11:10:15 浏览: 72
以下是用C语言实现建立有向图邻接表存储结构的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
// 定义边表结点
typedef struct ArcNode {
int adjvex; // 邻接点在顶点数组中的下标
struct ArcNode *nextarc; // 指向下一个边表结点的指针
} ArcNode;
// 定义顶点表结点
typedef struct VNode {
char data; // 顶点信息
ArcNode *firstarc; // 指向第一个边表结点的指针
} VNode, AdjList[MAX_VERTEX_NUM];
// 定义有向图
typedef struct {
AdjList vertices; // 顶点表
int vexnum; // 顶点数
int arcnum; // 弧数
} ALGraph;
// 查找顶点在顶点数组中的下标
int locateVex(ALGraph *G, char v) {
int i;
for (i = 0; i < G->vexnum; i++) {
if (G->vertices[i].data == v)
return i;
}
return -1;
}
// 创建有向图的邻接表存储结构
void createGraph(ALGraph *G) {
printf("请输入有向图的顶点数和弧数:\n");
scanf("%d%d", &G->vexnum, &G->arcnum);
getchar(); // 读取换行符
// 输入顶点信息
printf("请输入%d个顶点的信息:\n", G->vexnum);
for (int i = 0; i < G->vexnum; i++) {
printf("第%d个顶点:", i + 1);
scanf("%c", &G->vertices[i].data);
getchar(); // 读取换行符
G->vertices[i].firstarc = NULL; // 初始化第一个边表结点
}
// 输入弧信息
printf("请输入%d条弧的信息:\n", G->arcnum);
for (int i = 0; i < G->arcnum; i++) {
char v1, v2;
int m, n;
printf("第%d条弧:", i + 1);
scanf("%c%c", &v1, &v2);
getchar(); // 读取换行符
m = locateVex(G, v1);
n = locateVex(G, v2);
if (m == -1 || n == -1) {
printf("顶点不存在,重新输入!\n");
i--;
continue;
}
ArcNode *p = (ArcNode *) malloc(sizeof(ArcNode));
p->adjvex = n;
p->nextarc = G->vertices[m].firstarc;
G->vertices[m].firstarc = p;
}
}
// 打印有向图邻接表存储结构
void printGraph(ALGraph G) {
printf("有向图的邻接表存储结构如下:\n");
for (int i = 0; i < G.vexnum; i++) {
printf("%c -> ", G.vertices[i].data);
ArcNode *p = G.vertices[i].firstarc;
while (p) {
printf("%c ", G.vertices[p->adjvex].data);
p = p->nextarc;
}
printf("\n");
}
}
int main() {
ALGraph G;
createGraph(&G);
printGraph(G);
return 0;
}
```
下面是一个示例:假设有向图的顶点数为5,弧数为6,顶点信息依次为A、B、C、D、E,弧信息依次为AB、AC、BD、CE、DE、EA,则程序的输出结果如下:
```
请输入有向图的顶点数和弧数:
5 6
请输入5个顶点的信息:
第1个顶点:A
第2个顶点:B
第3个顶点:C
第4个顶点:D
第5个顶点:E
请输入6条弧的信息:
第1条弧:A B
第2条弧:A C
第3条弧:B D
第4条弧:C E
第5条弧:D E
第6条弧:E A
有向图的邻接表存储结构如下:
A -> B C
B -> D
C -> E
D -> E
E -> A
```
阅读全文