用c语言写一个图的邻接表
时间: 2023-11-17 13:08:11 浏览: 79
用c语言写的图的邻接表操作集合
下面是用C语言实现的图的邻接表:
```c
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
typedef struct ArcNode { // 边表结点
int adjvex; // 邻接点在顶点数组中的下标
struct ArcNode* next; // 指向下一条边的指针
}ArcNode;
typedef struct VNode { // 顶点信息结构体
char data;
ArcNode* first; // 指向第一条依附于该顶点的边的指针
}VNode, AdjList[MAX_VERTEX_NUM];
typedef struct { // 图结构体
AdjList vertices; // 邻接表
int vexnum, arcnum; // 顶点数和边数
}ALGraph;
void CreateALGraph(ALGraph* G) { // 创建邻接表
printf("请输入顶点数和边数(用空格隔开):");
scanf("%d%d", &G->vexnum, &G->arcnum);
getchar(); // 吸收换行符
printf("请依次输入各个顶点的信息:");
for (int i = 0; i < G->vexnum; i++) {
scanf("%c", &G->vertices[i].data);
G->vertices[i].first = NULL; // 初始化边表
}
getchar(); // 吸收换行符
printf("请依次输入每条边的两个顶点(用空格隔开):\n");
int v1, v2;
for (int i = 0; i < G->arcnum; i++) {
scanf("%d%d", &v1, &v2);
ArcNode* aNode1 = (ArcNode*)malloc(sizeof(ArcNode)); // 创建一个新的边表结点
aNode1->adjvex = v2;
aNode1->next = G->vertices[v1].first; // 将aNode1插入到顶点v1的边表头部
G->vertices[v1].first = aNode1;
ArcNode* aNode2 = (ArcNode*)malloc(sizeof(ArcNode)); // 创建一个新的边表结点
aNode2->adjvex = v1;
aNode2->next = G->vertices[v2].first; // 将aNode2插入到顶点v2的边表头部
G->vertices[v2].first = aNode2;
}
}
void PrintALGraph(ALGraph G) { // 遍历邻接表并输出
printf("图的邻接表:\n");
for (int i = 0; i < G.vexnum; i++) {
printf("%c -> ", G.vertices[i].data);
ArcNode* p = G.vertices[i].first;
while (p != NULL) {
printf("%c -> ", G.vertices[p->adjvex].data);
p = p->next;
}
printf("NULL\n");
}
}
int main() {
ALGraph G;
CreateALGraph(&G);
PrintALGraph(G);
return 0;
}
```
这段代码实现了创建无向图的邻接表,并且输出了邻接表。在这个实现中,我们使用了邻接表这种数据结构来存储图,并且使用了动态内存分配来创建边表结点。
阅读全文