C语言基于邻接表建立一个图
时间: 2024-02-13 16:07:32 浏览: 55
邻接表建立(C语言)
5星 · 资源好评率100%
要基于邻接表建立一个图,你需要用到两个数据结构:
1. 邻接表:用来存储图中每个节点的邻居节点列表
2. 节点:用来存储节点的信息,包括节点的值和邻居节点列表
以下是一个基于邻接表实现的图的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/* 邻接表节点 */
typedef struct AdjListNode {
int dest;
struct AdjListNode* next;
} AdjListNode;
/* 邻接表 */
typedef struct AdjList {
AdjListNode* head;
} AdjList;
/* 图 */
typedef struct Graph {
int V; /* 节点数量 */
AdjList* array;
} Graph;
/* 创建邻接表节点 */
AdjListNode* createAdjListNode(int dest) {
AdjListNode* newNode = (AdjListNode*) malloc(sizeof(AdjListNode));
newNode->dest = dest;
newNode->next = NULL;
return newNode;
}
/* 创建一个图 */
Graph* createGraph(int V) {
Graph* graph = (Graph*) malloc(sizeof(Graph));
graph->V = V;
/* 创建邻接表数组 */
graph->array = (AdjList*) malloc(V * sizeof(AdjList));
/* 将每个邻接表的头指针初始化为 NULL */
for (int i = 0; i < V; i++) {
graph->array[i].head = NULL;
}
return graph;
}
/* 添加边到图中 */
void addEdge(Graph* graph, int src, int dest) {
/* 添加一条从 src 到 dest 的边 */
AdjListNode* newNode = createAdjListNode(dest);
newNode->next = graph->array[src].head;
graph->array[src].head = newNode;
/* 添加一条从 dest 到 src 的边 */
newNode = createAdjListNode(src);
newNode->next = graph->array[dest].head;
graph->array[dest].head = newNode;
}
/* 打印图 */
void printGraph(Graph* graph) {
for (int i = 0; i < graph->V; i++) {
AdjListNode* pCrawl = graph->array[i].head;
printf("\n节点 %d 的邻居节点列表为:", i);
while (pCrawl) {
printf(" %d", pCrawl->dest);
pCrawl = pCrawl->next;
}
printf("\n");
}
}
int main() {
/* 创建一个图 */
int V = 5;
Graph* graph = createGraph(V);
/* 添加边到图中 */
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;
}
```
这个图包括 5 个节点和 7 条边,打印结果应该是:
```
节点 0 的邻居节点列表为: 4 1
节点 1 的邻居节点列表为: 4 3 2 0
节点 2 的邻居节点列表为: 3 1
节点 3 的邻居节点列表为: 4 2 1
节点 4 的邻居节点列表为: 3 1 0
```
阅读全文