用C语言代码实现邻接表的存储,输出存储结构示意图
时间: 2023-12-21 13:59:48 浏览: 83
dg.zip_dirtddf_图 数据结构_数据结构 图_数据结构 C语言_有向图
下面是使用C语言实现邻接表存储的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
// 邻接表中的边结构体
typedef struct ArcNode {
int adjvex; // 该边所指向的顶点的位置
struct ArcNode *next; // 指向下一条边的指针
// 边的其他信息可以在这里添加
} ArcNode;
// 邻接表中的顶点结构体
typedef struct VNode {
int data; // 顶点的数据
ArcNode *firstarc; // 指向第一条依附该顶点的边的指针
// 顶点的其他信息可以在这里添加
} VNode, AdjList[MAX_VERTEX_NUM];
// 邻接表结构体
typedef struct {
AdjList vertices; // 邻接表的顶点数组
int vexnum, arcnum; // 顶点数和边数
// 图的其他信息可以在这里添加
} ALGraph;
// 创建邻接表
void CreateALGraph(ALGraph *G) {
int i, j, k;
ArcNode *arc;
printf("请输入图的顶点数和边数:");
scanf("%d%d", &G->vexnum, &G->arcnum);
printf("请输入%d个顶点的数据:", G->vexnum);
for (i = 0; i < G->vexnum; i++) {
scanf("%d", &G->vertices[i].data);
G->vertices[i].firstarc = NULL; // 初始化链表头指针
}
printf("请输入%d条边的顶点对应的序号(如:i j):\n", G->arcnum);
for (k = 0; k < G->arcnum; k++) {
scanf("%d%d", &i, &j);
arc = (ArcNode *)malloc(sizeof(ArcNode));
arc->adjvex = j; // 该边所指向的顶点的位置
arc->next = G->vertices[i].firstarc;// 头插法插入边结点
G->vertices[i].firstarc = arc;
// 无向图还需要插入一条从j指向i的边
arc = (ArcNode *)malloc(sizeof(ArcNode));
arc->adjvex = i;
arc->next = G->vertices[j].firstarc;
G->vertices[j].firstarc = arc;
}
}
// 输出邻接表的存储结构
void PrintALGraph(ALGraph G) {
int i;
ArcNode *arc;
printf("邻接表的存储结构如下:\n");
for (i = 0; i < G.vexnum; i++) {
printf("%d -> ", G.vertices[i].data);
arc = G.vertices[i].firstarc;
while (arc != NULL) {
printf("%d -> ", G.vertices[arc->adjvex].data);
arc = arc->next;
}
printf("NULL\n");
}
}
int main() {
ALGraph G;
CreateALGraph(&G);
PrintALGraph(G);
return 0;
}
```
下面是该代码实现的邻接表的存储结构示意图,以无向图为例:
```
2
/ \
/ \
1-------3
/ \ / \
4---5---6---7
```
```
邻接表的存储结构如下:
1 -> 2 -> 5 -> 4 -> NULL
2 -> 1 -> 3 -> NULL
3 -> 2 -> 7 -> 6 -> NULL
4 -> 1 -> 5 -> NULL
5 -> 1 -> 4 -> 6 -> NULL
6 -> 3 -> 5 -> 7 -> NULL
7 -> 3 -> 6 -> NULL
```
其中,数字表示顶点的数据,箭头表示边的方向。从示意图可以看出,邻接表的存储结构保存了每个顶点的所有邻接点,对于无向图,每条边在邻接表中都会保存两次。
阅读全文