利用邻接表创建无向图c语言
时间: 2023-12-03 20:04:44 浏览: 95
以下是利用邻接表创建无向图的C语言实现示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 邻接表结点结构体
typedef struct AdjListNode {
int dest; // 目标顶点
struct AdjListNode *next; // 指向下一个邻接点的指针
} AdjListNode;
// 邻接表头结点结构体
typedef struct {
AdjListNode *head; // 指向第一个邻接点的指针
} AdjList;
// 图结构体
typedef struct {
AdjList adj_list[MAX_VERTEX_NUM]; // 邻接表
int vertex_num; // 顶点数
int edge_num; // 边数
} Graph;
// 初始化图
void init(Graph *G) {
int i;
G->vertex_num = 0;
G->edge_num = 0;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
G->adj_list[i].head = NULL;
}
}
// 添加顶点
void add_vertex(Graph *G) {
G->vertex_num++;
}
// 添加边
void add_edge(Graph *G, int v1, int v2) {
AdjListNode *node1, *node2;
node1 = (AdjListNode *)malloc(sizeof(AdjListNode));
node1->dest = v2;
node1->next = G->adj_list[v1].head;
G->adj_list[v1].head = node1;
node2 = (AdjListNode *)malloc(sizeof(AdjListNode));
node2->dest = v1;
node2->next = G->adj_list[v2].head;
G->adj_list[v2].head = node2;
G->edge_num++;
}
// 输出图
void print(Graph *G) {
int i;
AdjListNode *node;
printf("Vertex: ");
for (i = 0; i < G->vertex_num; i++) {
printf("%d ", i);
}
printf("\n");
printf("Edge: \n");
for (i = 0; i < G->vertex_num; i++) {
printf("%d: ", i);
node = G->adj_list[i].head;
while (node != NULL) {
printf("%d ", node->dest);
node = node->next;
}
printf("\n");
}
}
int main() {
Graph G;
init(&G);
add_vertex(&G);
add_vertex(&G);
add_vertex(&G);
add_vertex(&G);
add_edge(&G, 0, 1);
add_edge(&G, 1, 2);
add_edge(&G, 2, 3);
add_edge(&G, 3, 0);
print(&G);
return 0;
}
```
在这个例子中,我们使用邻接表来表示无向图。我们定义了两个结构体 `AdjListNode` 和 `AdjList`,其中 `AdjListNode` 表示邻接表中的结点,包含了目标顶点和指向下一个邻接点的指针,`AdjList` 表示邻接表中的头结点,包含了指向第一个邻接点的指针。然后,我们定义了一个结构体 `Graph`,包含了邻接表,顶点数和边数等信息。然后,我们定义了一些函数来初始化图,添加顶点和边,以及输出图的信息。最后,在 `main` 函数中,我们创建了一个包含四个顶点的无向图,并添加了四条边,然后输出了图的信息。
阅读全文