建立任意无向图,采用邻接矩阵存储,完成以下操作: (1)对该图进行深度优先遍历,并输出遍历结果; (2)对该图进行广度优先遍历,并输出遍历结果。其中结点数为7,用c++语言表示
时间: 2024-05-01 15:17:54 浏览: 120
你好!感谢你使用 ChitGPT 进行交流。根据你的要求,以下是基于邻接矩阵的无向图深度优先遍历和广度优先遍历的 C 语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 7 // 最大节点数
int visited[MAX_VERTICES] = {0}; // 标记节点是否已被访问
int graph[MAX_VERTICES][MAX_VERTICES] = { // 邻接矩阵存储图
{0, 1, 1, 0, 0, 0, 0},
{1, 0, 0, 1, 1, 0, 0},
{1, 0, 0, 0, 1, 1, 0},
{0, 1, 0, 0, 0, 1, 0},
{0, 1, 1, 0, 0, 1, 1},
{0, 0, 1, 1, 1, 0, 1},
{0, 0, 0, 0, 1, 1, 0}
};
// 深度优先遍历
void dfs(int v) {
visited[v] = 1; // 标记节点已被访问
printf("%d ", v + 1); // 输出节点编号
for (int i = 0; i < MAX_VERTICES; i++) {
if (graph[v][i] == 1 && !visited[i]) { // 如果节点未被访问且与当前节点有连边
dfs(i); // 递归访问该节点
}
}
}
// 广度优先遍历
void bfs(int v) {
int queue[MAX_VERTICES]; // 定义队列,用于存放待访问的节点
int head = 0, tail = 0; // 定义队列头和尾指针
visited[v] = 1; // 标记节点已被访问
printf("%d ", v + 1); // 输出节点编号
queue[tail++] = v; // 加入队列尾部
while (head != tail) { // 队列不为空,继续遍历
int cur = queue[head++]; // 取出队列头元素
for (int i = 0; i < MAX_VERTICES; i++) {
if (graph[cur][i] == 1 && !visited[i]) { // 如果节点未被访问且与当前节点有连边
visited[i] = 1; // 标记节点已被访问
printf("%d ", i + 1); // 输出节点编号
queue[tail++] = i; // 加入队列尾部
}
}
}
}
int main() {
printf("深度优先遍历结果:");
dfs(0); // 从节点 1 开始深度优先遍历
printf("\n");
for (int i = 0; i < MAX_VERTICES; i++) { // 重置 visited 数组,方便下一次遍历
visited[i] = 0;
}
printf("广度优先遍历结果:");
bfs(0); // 从节点 1 开始广度优先遍历
printf("\n");
return 0;
}
```
这份代码中,我们通过定义 visited 数组来标记节点是否已被访问,通过 graph 数组来存储无向图的邻接矩阵。在 dfs 函数中,我们首先标记节点为已访问,然后输出节点编号,再递归访问与当前节点有连边且未被访问的节点。在 bfs 函数中,我们通过队列来管理待访问的节点,首先标记起始节点为已访问,然后输出其编号,将其加入到队列尾部,再从队列头部取出元素,遍历其未被访问的连边所连接的节点,并标记它们为已访问,并输出其编号,将它们加入到队列尾部。不断循环这个过程,直到队列为空为止。
阅读全文