写一个C语言代码利用邻接矩阵构造无向图的算法,在此基础上进行深度优先遍历和广度优先遍历。 菜单参考如下: 1.构建无向图 2.输出邻接矩阵 3.深度优先遍历 4.广度优先遍历 5.退出
时间: 2025-07-06 08:48:53 浏览: 3
在C语言中,我们可以先创建一个二维数组表示邻接矩阵来存储无向图。这里是一个简单的例子:
```c
#include <stdio.h>
#define V 5 // 图的顶点数
// 邻接矩阵
int adj[V][V] = {0};
// 函数声明
void addEdge(int v, int w); // 添加边
void printAdjMatrix(void); // 输出邻接矩阵
void dfs(int src); // 深度优先遍历
void bfs(int src); // 广度优先遍历
// 构建无向图
void addEdge(int v, int w) {
adj[v][w] = 1; // 如果从v到w有边,则邻接矩阵的对应位置设为1
adj[w][v] = 1; // 对称性,无向图中,如果存在(v,w),则也存在(w,v)
}
// 输出邻接矩阵
void printAdjMatrix() {
printf("邻接矩阵:\n");
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
if (adj[i][j])
printf("1 ");
else
printf("0 ");
}
printf("\n");
}
}
// 深度优先遍历
void dfs(int src) {
int visited[V] = {0}; // 记录节点是否访问过
printf("DFS from %d - ", src);
visited[src] = 1;
// 深度优先搜索的核心部分,递归查找相邻节点
for (int i = 0; i < V; i++)
if (adj[src][i] && !visited[i]) {
dfs(i);
}
printf("%d ", src); // 结束标记
}
// 广度优先遍历
void bfs(int src) {
int queue[V]; // 用于队列的数据结构
int front = -1, rear = -1; // 前指针和后指针
// 初始化
if (src >= 0)
queue[++rear] = src;
while (front != rear) {
src = queue[++front];
printf("BFS from %d - ", src);
// 将未访问的邻居添加到队列
for (int i = 0; i < V; i++)
if (adj[src][i] && !queue[front + 1])
queue[++rear] = i;
for (int i = front + 1; i <= rear; i++)
printf("%d ", queue[i]);
}
}
int main() {
// 示例:构建图并添加边
addEdge(0, 1);
addEdge(0, 4);
addEdge(1, 2);
addEdge(1, 3);
addEdge(1, 4);
addEdge(2, 3);
// 打印邻接矩阵
printAdjMatrix();
// 测试遍历算法
printf("\nDepth First Traversal (starting from vertex 0): \n");
dfs(0);
printf("\n Breadth First Traversal (starting from vertex 0): \n");
bfs(0);
return 0;
}
```
你可以运行这个代码来构造无向图,并根据需要进行深度优先遍历和广度优先遍历。注意,这只是一个基础示例,实际应用中可能需要更复杂的数据结构和错误处理。
阅读全文
相关推荐


















