C语言编写采用邻接表的方式创建无向图
时间: 2024-03-14 12:48:17 浏览: 72
下面是使用邻接表创建无向图的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 边结构体
typedef struct EdgeNode {
int adjvex; // 邻接顶点
struct EdgeNode* next; // 下一个邻接点指针
} EdgeNode;
// 顶点结构体
typedef struct VertexNode {
char data; // 顶点数据
EdgeNode* firstedge; // 第一个邻接点指针
} VertexNode;
// 图结构体
typedef struct {
VertexNode vexs[MAX_VERTEX_NUM]; // 顶点数组
int vexnum; // 顶点数
int edgenum; // 边数
} Graph;
// 初始化图
void InitGraph(Graph* G) {
int i;
G->vexnum = 0;
G->edgenum = 0;
for (i = 0; i < MAX_VERTEX_NUM; ++i) {
G->vexs[i].firstedge = NULL;
}
}
// 插入边
void InsertEdge(Graph* G, int v1, int v2) {
EdgeNode* e1 = (EdgeNode*)malloc(sizeof(EdgeNode));
e1->adjvex = v2;
e1->next = G->vexs[v1].firstedge;
G->vexs[v1].firstedge = e1;
EdgeNode* e2 = (EdgeNode*)malloc(sizeof(EdgeNode));
e2->adjvex = v1;
e2->next = G->vexs[v2].firstedge;
G->vexs[v2].firstedge = e2;
++G->edgenum;
}
// 创建图
void CreateGraph(Graph* G) {
printf("请输入顶点数和边数:\n");
scanf("%d%d", &G->vexnum, &G->edgenum);
printf("请输入顶点信息:\n");
int i;
for (i = 0; i < G->vexnum; ++i) {
scanf(" %c", &G->vexs[i].data);
}
printf("请输入每条边的两个顶点:\n");
int j, v1, v2;
for (j = 0; j < G->edgenum; ++j) {
scanf("%d%d", &v1, &v2);
InsertEdge(G, v1, v2);
}
}
// 输出图
void PrintGraph(Graph* G) {
printf("邻接表如下:\n");
int i;
for (i = 0; i < G->vexnum; ++i) {
printf("%d:%c->", i, G->vexs[i].data);
EdgeNode* p = G->vexs[i].firstedge;
while (p != NULL) {
printf("%d->", p->adjvex);
p = p->next;
}
printf("NULL\n");
}
}
int main() {
Graph G;
InitGraph(&G);
CreateGraph(&G);
PrintGraph(&G);
return 0;
}
```
在该代码中,使用了邻接表来存储无向图。其中,顶点结构体VertexNode中包含了该顶点的数据和第一个邻接点的指针,边结构体EdgeNode中包含了该边所指向的邻接顶点和下一个邻接点的指针。在创建无向图时,使用InsertEdge函数将每条边的两个顶点插入到对应的邻接表中。最后,使用PrintGraph函数输出邻接表。
阅读全文