用c语言写一个用邻接矩阵存储的连通图,并能分别用深度优先和广度优先遍历的算法
时间: 2024-02-25 13:56:16 浏览: 73
好的,下面是用C语言编写邻接矩阵存储的连通图,并使用深度优先遍历和广度优先遍历算法的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_VERTEX_NUM 100 // 定义最大顶点数
// 定义邻接矩阵存储结构体
typedef struct {
int vertex[MAX_VERTEX_NUM]; // 存储顶点信息
int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 存储边信息
int vertex_num; // 存储顶点数
int edge_num; // 存储边数
} Graph;
// 初始化图
void init_graph(Graph *graph) {
graph->vertex_num = 0;
graph->edge_num = 0;
for (int i = 0; i < MAX_VERTEX_NUM; i++) {
graph->vertex[i] = 0;
for (int j = 0; j < MAX_VERTEX_NUM; j++) {
graph->edge[i][j] = 0;
}
}
}
// 添加顶点
void add_vertex(Graph *graph, int v) {
graph->vertex[graph->vertex_num] = v;
graph->vertex_num++;
}
// 添加边
void add_edge(Graph *graph, int v1, int v2) {
graph->edge[v1][v2] = 1;
graph->edge[v2][v1] = 1;
graph->edge_num++;
}
// 深度优先遍历
void dfs(Graph *graph, bool visited[], int v) {
visited[v] = true;
printf("%d ", graph->vertex[v]);
for (int i = 0; i < graph->vertex_num; i++) {
if (graph->edge[v][i] == 1 && visited[i] == false) {
dfs(graph, visited, i);
}
}
}
// 广度优先遍历
void bfs(Graph *graph, bool visited[], int v, int queue[], int *front, int *rear) {
visited[v] = true;
printf("%d ", graph->vertex[v]);
queue[*rear] = v;
*rear = (*rear + 1) % MAX_VERTEX_NUM;
while (*front != *rear) {
int w = queue[*front];
*front = (*front + 1) % MAX_VERTEX_NUM;
for (int i = 0; i < graph->vertex_num; i++) {
if (graph->edge[w][i] == 1 && visited[i] == false) {
visited[i] = true;
printf("%d ", graph->vertex[i]);
queue[*rear] = i;
*rear = (*rear + 1) % MAX_VERTEX_NUM;
}
}
}
}
int main() {
Graph graph;
init_graph(&graph);
// 添加顶点
add_vertex(&graph, 0);
add_vertex(&graph, 1);
add_vertex(&graph, 2);
add_vertex(&graph, 3);
add_vertex(&graph, 4);
// 添加边
add_edge(&graph, 0, 1);
add_edge(&graph, 0, 4);
add_edge(&graph, 1, 2);
add_edge(&graph, 1, 3);
add_edge(&graph, 1, 4);
add_edge(&graph, 2, 3);
add_edge(&graph, 3, 4);
// 深度优先遍历
printf("深度优先遍历结果:");
bool visited[MAX_VERTEX_NUM] = {false};
dfs(&graph, visited, 0);
printf("\n");
// 广度优先遍历
printf("广度优先遍历结果:");
int queue[MAX_VERTEX_NUM];
int front = 0, rear = 0;
for (int i = 0; i < MAX_VERTEX_NUM; i++) {
queue[i] = -1;
}
bool visited2[MAX_VERTEX_NUM] = {false};
bfs(&graph, visited2, 0, queue, &front, &rear);
printf("\n");
return 0;
}
```
在这个示例代码中,我们首先定义了一个 `Graph` 结构体,用于存储图的信息,包括顶点和边的信息。然后,我们提供了三个函数用于初始化图、添加顶点和添加边。
接着,我们提供了深度优先遍历和广度优先遍历的函数。这两个函数都需要一个 `visited` 数组来记录每个顶点是否已经被访问过。在深度优先遍历中,我们首先将当前顶点标记为已访问,然后输出该顶点的信息,并遍历该顶点的所有邻接点,如果该邻接点未被访问过,则递归调用 `dfs` 函数。在广度优先遍历中,我们首先将当前顶点标记为已访问,然后输出该顶点的信息,并将该顶点放入队列中。接着,我们不断从队列中取出元素,遍历该元素的所有邻接点,如果该邻接点未被访问过,则将其标记为已访问,输出其信息,并将其放入队列中。
最后,在 `main` 函数中,我们创建了一个简单的图,并使用深度优先遍历和广度优先遍历函数输出遍历结果。
阅读全文
相关推荐
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)