无向图邻接表是一种常用的图的表示方法,它通过使用数组和链表的结合来表示图中的顶点和边。下面是无向图邻接表的C语言实现示例:
#include <stdio.h>
#include <stdlib.h>
// 邻接表中的节点
typedef struct Node {
int vertex; // 顶点编号
struct Node* next; // 指向下一个节点的指针
} Node;
// 图的邻接表
typedef struct Graph {
int numVertices; // 图中顶点的数量
Node** adjLists; // 存储邻接表的数组
} Graph;
// 创建一个新的节点
Node* createNode(int v) {
Node* newNode = malloc(sizeof(Node));
newNode->vertex = v;
newNode->next = NULL;
return newNode;
}
// 创建一个图
Graph* createGraph(int vertices) {
Graph* graph = malloc(sizeof(Graph));
graph->numVertices = vertices;
// 创建存储邻接表的数组
graph->adjLists = malloc(vertices * sizeof(Node*));
// 初始化数组为空
for (int i = 0; i < vertices; i++) {
graph->adjLists[i] = NULL;
}
return graph;
}
// 添加边
void addEdge(Graph* graph, int src, int dest) {
// 添加从源顶点到目标顶点的边
Node* newNode = createNode(dest);
newNode->next = graph->adjLists[src];
graph->adjLists[src] = newNode;
// 添加从目标顶点到源顶点的边(因为是无向图)
newNode = createNode(src);
newNode->next = graph->adjLists[dest];
graph->adjLists[dest] = newNode;
}
// 打印邻接表表示的图
void printGraph(Graph* graph) {
for (int i = 0; i < graph->numVertices; i++) {
Node* temp = graph->adjLists[i];
printf("顶点 %d 的邻接表:", i);
while (temp) {
printf(" -> %d", temp->vertex);
temp = temp->next;
}
printf("\n");
}
}
int main() {
int vertices = 5;
Graph* graph = createGraph(vertices);
addEdge(graph, 0, 1);
addEdge(graph, 0, 4);
addEdge(graph, 1, 2);
addEdge(graph, 1, 3);
addEdge(graph, 1, 4);
addEdge(graph, 2, 3);
addEdge(graph, 3, 4);
printGraph(graph);
return 0;
}
这段代码实现了无向图邻接表的创建、添加边和打印邻接表的功能。通过创建一个包含顶点数量和邻接表数组的结构体,可以方便地表示和操作无向图的邻接表。
对于无向图邻接表的C语言实现,我们推荐使用腾讯云的云服务器(CVM)来运行和部署这段代码。腾讯云的云服务器提供了高性能、稳定可靠的计算资源,适合用于运行各种应用程序和服务。您可以通过以下链接了解更多关于腾讯云云服务器的信息:
腾讯云云服务器(CVM)产品介绍:https://cloud.tencent.com/product/cvm
领取专属 10元无门槛券
手把手带您无忧上云