c语言,使用邻接矩阵创建一个图,并对这个图进行深度优先遍历和广度优先遍历
时间: 2024-02-04 20:02:07 浏览: 88
图的存储与遍历(C语言实现)
5星 · 资源好评率100%
下面是使用邻接矩阵创建一个图,并对这个图进行深度优先遍历和广度优先遍历的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXV 100 // 最大顶点数
int visited[MAXV]; // 标记顶点是否被访问过
// 邻接矩阵表示法
typedef struct {
int edges[MAXV][MAXV]; // 邻接矩阵
int n; // 顶点数
} Graph;
// 初始化图
void initGraph(Graph *g, int n) {
g->n = n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
g->edges[i][j] = 0; // 初始化邻接矩阵
}
}
}
// 添加边
void addEdge(Graph *g, int u, int v) {
g->edges[u][v] = 1;
g->edges[v][u] = 1; // 无向图
}
// 深度优先遍历
void dfs(Graph *g, int v) {
visited[v] = 1; // 标记当前顶点已访问
printf("%d ", v); // 输出当前顶点
for (int i = 0; i < g->n; i++) {
if (g->edges[v][i] && !visited[i]) { // 如果与当前顶点相邻且未被访问
dfs(g, i); // 递归访问相邻顶点
}
}
}
// 广度优先遍历
void bfs(Graph *g, int v) {
int queue[MAXV], front = 0, rear = 0;
visited[v] = 1; // 标记当前顶点已访问
printf("%d ", v); // 输出当前顶点
queue[rear++] = v; // 将当前顶点入队
while (front < rear) { // 队列不为空
int u = queue[front++]; // 取出队首顶点
for (int i = 0; i < g->n; i++) {
if (g->edges[u][i] && !visited[i]) { // 如果与当前顶点相邻且未被访问
visited[i] = 1; // 标记相邻顶点已访问
printf("%d ", i); // 输出相邻顶点
queue[rear++] = i; // 将相邻顶点入队
}
}
}
}
int main() {
Graph g;
int n, e; // 顶点数和边数
printf("请输入顶点数和边数:");
scanf("%d%d", &n, &e);
initGraph(&g, n); // 初始化图
printf("请输入每条边的两个端点:\n");
for (int i = 0; i < e; i++) {
int u, v;
scanf("%d%d", &u, &v);
addEdge(&g, u, v); // 添加边
}
printf("深度优先遍历结果:");
dfs(&g, 0); // 从顶点0开始深度优先遍历
printf("\n广度优先遍历结果:");
for (int i = 0; i < n; i++) {
visited[i] = 0; // 初始化visited数组
}
bfs(&g, 0); // 从顶点0开始广度优先遍历
printf("\n");
return 0;
}
```
在上述代码中,我们使用一个结构体`Graph`来表示一个无向图,其中`n`表示顶点数,`edges`表示邻接矩阵。`visited`数组用来标记顶点是否被访问过。`initGraph`函数用来初始化图,`addEdge`函数用来添加边。`dfs`函数和`bfs`函数分别表示深度优先遍历和广度优先遍历。在主函数中,我们先输入顶点数和边数,然后输入每条边的两个端点,构建出图后,先从顶点0开始深度优先遍历,再从顶点0开始广度优先遍历。
阅读全文