能否提供C语言中使用邻接矩阵来构建图以及实现节点深度优先遍历(DFS)或广度优先遍历(BFS)并输出所有节点的操作步骤和相应的代码示例?
时间: 2025-01-01 22:42:31 浏览: 5
在C语言中,我们可以使用二维数组或者动态内存分配来表示邻接矩阵,其中行代表源节点,列代表目标节点,非零值表示两个节点间有边连接。
构建图的基本操作步骤如下:
1. 初始化邻接矩阵:为每个节点创建一个对应的位置,并设置初始值为0(表示无边)。
```c
int graph[vertices][vertices]; // vertices是节点总数
```
2. 添加边:当需要添加一条从node1到node2的边时,在矩阵`graph[node1][node2]`位置设为1(或其他非零值)。
3. 深度优先遍历(DFS):
- 定义一个函数`dfs(node)`,它会递归地访问节点及其邻居。
- 开始时,对某个未访问过的节点调用`dfs()`。
```c
void dfs(int node) {
visited[node] = true; // 标记当前节点已访问
printf("%d ", node); // 输出节点
for (int i = 0; i < vertices; i++) {
if (!visited[i] && graph[node][i]) { // 如果邻居未访问且有边相连
dfs(i);
}
}
}
```
4. 广度优先遍历(BFS):
- 使用队列数据结构存储节点。
- 首先将起始节点加入队列并标记为已访问。
- 从队列取出节点,访问并将其未访问的相邻节点加入队列。
```c
#include <stdbool.h>
#include <stdlib.h>
struct Queue {
int *arr;
int front, rear;
};
void bfs(int start) {
bool visited[vertices] = {false};
Queue q;
q.arr = malloc(sizeof(int) * vertices);
q.front = q.rear = -1;
visited[start] = true;
q.rear++; q.arr[q.rear] = start;
while (q.front != q.rear) {
int node = q.arr[++q.front];
printf("%d ", node);
for (int i = 0; i < vertices; i++) {
if (!visited[i] && graph[node][i]) {
visited[i] = true;
q.rear++; q.arr[q.rear] = i;
}
}
}
free(q.arr);
}
```
阅读全文