邻接表创建无向图,C语言
时间: 2023-12-15 20:52:45 浏览: 118
数据结构-c语言-带main函数-图7.2-图的存储结构-图的邻接表的创建-无向图。
5星 · 资源好评率100%
下面是邻接表创建无向图的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 顶点数的最大值
// 邻接表结构体
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, arcnum; // 顶点数和边数
} ALGraph;
// 创建无向图的邻接表
void CreateUDG(ALGraph *G) {
printf("请输入顶点数和边数: ");
scanf("%d%d", &G->vexnum, &G->arcnum);
// 初始化顶点数组
for (int i = 0; i < G->vexnum; i++) {
printf("请输入第%d个顶点的值: ", i+1);
scanf(" %c", &G->vertices[i].data); // 注意%c前面的空格,用于吃掉scanf之前的回车
G->vertices[i].firstarc = NULL; // 初始化表头结点指针为空
}
// 读入边的信息,建立邻接表
for (int k = 0; k < G->arcnum; k++) {
int i, j;
printf("请输入第%d条边的两个顶点的下标: ", k+1);
scanf("%d%d", &i, &j);
// 添加i->j的边
ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = j;
p->nextarc = G->vertices[i].firstarc;
G->vertices[i].firstarc = p;
// 添加j->i的边
ArcNode *q = (ArcNode *)malloc(sizeof(ArcNode));
q->adjvex = i;
q->nextarc = G->vertices[j].firstarc;
G->vertices[j].firstarc = q;
}
}
// 打印邻接表
void PrintGraph(ALGraph G) {
printf("图的邻接表如下:\n");
for (int i = 0; i < G.vexnum; i++) {
printf("%d(%c): ", i, G.vertices[i].data);
ArcNode *p = G.vertices[i].firstarc;
while (p != NULL) {
printf("%d ", p->adjvex);
p = p->nextarc;
}
printf("\n");
}
}
int main() {
ALGraph G;
CreateUDG(&G);
PrintGraph(G);
return 0;
}
```
在这个实现中,我们通过邻接表来存储无向图的信息。具体来说,我们使用一个顶点数组来存储每个顶点的信息,其中每个顶点节点包括了该顶点的值和指向该顶点的第一个邻接点的指针。而邻接点则是通过一个单链表来实现的,其中每个节点包括了该邻接点在顶点数组中的下标和指向下一个邻接点的指针。
在创建无向图时,我们首先输入顶点数和边数,然后依次输入每个顶点的值,并将其初始化为邻接表中的顶点节点。接着,我们通过输入每条边的两个顶点下标来添加边,同时建立起i和j之间的双向连接(因为是无向图)。最后,我们通过遍历邻接表来打印出整个无向图的信息。
注意,在输入顶点值时,为了避免scanf读入之前的回车,我们在%c前面加了一个空格。这是一个常见的做法,可以避免scanf读入之前的回车或空格,保证程序的正确性。
阅读全文