c语言采用邻接表建立无向图并进行dfs和bfs
时间: 2025-01-01 20:38:10 浏览: 12
在C语言中,使用邻接表结构存储无向图是一种常见的做法,因为邻接表只存储每个顶点直接相连的边,对于稀疏图非常高效。以下是创建无向图并进行深度优先搜索(DFS)和广度优先搜索(BFS)的基本步骤:
1. **邻接表表示**:
- 定义两个数组,一个存放顶点,另一个存放指向邻接节点的指针。每个顶点对应一个链表,链表中的元素是与其相邻的其他顶点。
```c
typedef struct Node {
int vertex;
struct Node* next; // 指向相邻节点的指针
} Node;
```
2. **创建无向图**:
- 对于每条无向边 (u, v),在u的邻接列表中添加v,在v的邻接列表中添加u。
3. **深度优先搜索(DFS)**:
- 从某个起点开始,对每个未访问过的邻居递归地进行DFS。
```c
void dfs(int start, Node** graph) {
Node* current = graph[start];
while (current != NULL) {
if (current->vertex == visited_vertex) continue; // 已访问过跳过
visit(current->vertex); // 访问当前节点
dfs(current->vertex, graph);
current = current->next;
}
}
```
4. **宽度优先搜索(BFS)**:
- 使用队列数据结构,先进先出。从起点开始,依次将相邻节点加入队列,并逐个处理。
```c
void bfs(int start, Node** graph) {
Queue queue;
enqueue(&queue, start); // 入队
while (!queue.isEmpty()) {
int curr = dequeue(&queue); // 出队
visit(curr);
Node* neighbor = graph[curr];
while (neighbor != NULL) {
if (neighbor->vertex != visited_vertex) {
enqueue(&queue, neighbor->vertex);
}
neighbor = neighbor->next;
}
}
}
```
阅读全文