用C语言采用邻接表示创建无向图代码
时间: 2024-12-28 08:32:24 浏览: 29
在C语言中,可以使用邻接表示法(Adjacency List Representation)来创建无向图,这是一种常用的数据结构,用于表示图中的顶点及其相连的边。下面是一个简单的例子,展示如何使用数组和链表来实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 图的节点结构体
typedef struct Node {
int vertex; // 节点对应的顶点值
struct Node* next; // 指向下一个节点的指针
} Node;
// 创建新节点
Node* create_node(int vertex) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->vertex = vertex;
newNode->next = NULL;
return newNode;
}
// 添加边到无向图
void add_edge(Node** graph, int source, int destination) {
Node* node = create_node(destination);
node->next = (*graph)[source]; // 将新节点添加到源节点的链表末尾
(*graph)[source] = node; // 更新源节点指向新节点
}
// 遍历并打印无向图
void traverse_graph(Node** graph, int num_vertices) {
for (int i = 0; i < num_vertices; i++) {
printf("Vertex %d -> ", i);
Node* temp = (*graph)[i];
while (temp != NULL) {
printf("%d ", temp->vertex);
temp = temp->next;
}
printf("\n");
}
}
int main() {
int num_vertices, num_edges;
printf("Enter number of vertices: ");
scanf("%d", &num_vertices);
Node** graph = (Node**)malloc(num_vertices * sizeof(Node*)); // 初始化每个顶点的链表
printf("Enter number of edges: ");
scanf("%d", &num_edges);
// 根据输入添加边
for (int i = 0; i < num_edges; i++) {
int src, dest;
printf("Enter edge (%d, %d): ", i + 1, i + 2); // 示例中假设输入连续编号的边
scanf("%d%d", &src, &dest);
add_edge(graph, src - 1, dest - 1); // 减一因为数组索引从0开始
}
printf("Undirected Graph:\n");
traverse_graph(graph, num_vertices);
// 清理内存
for (int i = 0; i < num_vertices; i++) {
Node* temp = (*graph)[i];
while (temp != NULL) {
Node* next = temp->next;
free(temp);
temp = next;
}
}
free(graph);
return 0;
}
```
在这个代码中,我们首先定义了图的节点结构,然后实现了添加边、遍历图以及初始化图等操作。记得根据实际需求修改输入边的方式,并在结束后清理动态分配的内存。
阅读全文