c语言建立一个以邻接表形式存储的图
时间: 2024-04-06 07:13:01 浏览: 69
以下是一个简单的C语言程序,用邻接表形式存储图:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
typedef struct ArcNode {
int adj_vex; // 邻接点编号
struct ArcNode *next; // 指向下一个邻接点的指针
} ArcNode;
typedef struct VNode {
int data; // 顶点数据
ArcNode *first_arc; // 指向第一个邻接点的指针
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices; // 邻接表数组
int vex_num; // 顶点数
int arc_num; // 边数
} ALGraph;
// 创建邻接表
void create(ALGraph *G) {
printf("请输入顶点数和边数:\n");
scanf("%d %d", &(G->vex_num), &(G->arc_num));
printf("请输入顶点数据:\n");
for (int i = 0; i < G->vex_num; i++) {
scanf("%d", &(G->vertices[i].data));
G->vertices[i].first_arc = NULL;
}
printf("请输入边信息:\n");
for (int i = 0; i < G->arc_num; i++) {
int v1, v2;
printf("请输入第%d条边的两个顶点编号:\n", i + 1);
scanf("%d %d", &v1, &v2);
ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode));
p->adj_vex = v2;
p->next = G->vertices[v1].first_arc;
G->vertices[v1].first_arc = p;
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adj_vex = v1;
p->next = G->vertices[v2].first_arc;
G->vertices[v2].first_arc = p;
}
}
// 输出邻接表
void print(ALGraph G) {
printf("顶点信息:\n");
for (int i = 0; i < G.vex_num; i++) {
printf("%d ", G.vertices[i].data);
}
printf("\n边信息:\n");
for (int i = 0; i < G.vex_num; i++) {
printf("%d: ", i);
ArcNode *p = G.vertices[i].first_arc;
while (p != NULL) {
printf("%d ", p->adj_vex);
p = p->next;
}
printf("\n");
}
}
int main() {
ALGraph G;
create(&G);
print(G);
return 0;
}
```
该程序使用了邻接表的方式存储图,主要包含了以下几个部分:
1. 结构体 `ArcNode`,用于表示邻接表中的边节点,其中 `adj_vex` 表示邻接点的编号,`next` 表示指向下一个邻接点的指针。
2. 结构体 `VNode`,用于表示邻接表中的顶点节点,其中 `data` 表示顶点数据,`first_arc` 表示指向第一个邻接点的指针。
3. 结构体 `ALGraph`,用于表示邻接表存储的图,其中 `vertices` 表示邻接表数组,`vex_num` 表示顶点数,`arc_num` 表示边数。
4. 函数 `create`,用于创建邻接表,首先输入顶点数和边数,然后输入每个顶点的数据,最后输入每条边的两个顶点编号,将邻接表构建出来。
5. 函数 `print`,用于输出邻接表,首先输出每个顶点的信息,然后输出每个顶点对应的邻接点信息。
阅读全文