用C语言实现:用邻接矩阵实现图存储,并实现图的深度优先遍历。
时间: 2024-06-18 15:05:20 浏览: 142
实现邻接矩阵存储图的深度优先遍历
5星 · 资源好评率100%
邻接矩阵是一种常用的图的表示方法,它用一个二维数组来表示图的顶点之间的关系,其中数组元素值为1表示两个顶点之间有边,为0则表示没有边。下面是用C语言实现邻接矩阵表示图存储和深度优先遍历的基本步骤:
1. 定义一个结构体来表示图,包括顶点数、边数和邻接矩阵等成员变量。
```c
#define MAX_VERTEX_NUM 100 // 最大顶点数
typedef struct {
int vertex_num; // 顶点数
int edge_num; // 边数
int adj_matrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
} Graph;
```
2. 初始化图,包括读入顶点数、边数和邻接矩阵等信息。
```c
void init_graph(Graph *g) {
scanf("%d %d", &(g->vertex_num), &(g->edge_num));
for (int i = 0; i < g->vertex_num; i++) {
for (int j = 0; j < g->vertex_num; j++) {
g->adj_matrix[i][j] = 0;
}
}
int u, v;
for (int i = 0; i < g->edge_num; i++) {
scanf("%d %d", &u, &v);
g->adj_matrix[u][v] = 1;
g->adj_matrix[v][u] = 1; // 无向图需要反向也设置为1
}
}
```
3. 定义一个数组visited来标记每个顶点是否已经被访问过。
```c
int visited[MAX_VERTEX_NUM];
```
4. 定义一个递归函数dfs来实现深度优先遍历。
```c
void dfs(Graph *g, int v) {
visited[v] = 1;
printf("%d ", v); // 输出遍历到的顶点
for (int i = 0; i < g->vertex_num; i++) {
if (g->adj_matrix[v][i] == 1 && visited[i] == 0) {
dfs(g, i);
}
}
}
```
5. 调用dfs函数进行深度优先遍历。
```c
void depth_first_search(Graph *g, int start) {
for (int i = 0; i < g->vertex_num; i++) {
visited[i] = 0;
}
dfs(g, start);
}
```
6. 主函数中调用init_graph和depth_first_search函数,如下所示。
```c
int main() {
Graph g;
init_graph(&g);
depth_first_search(&g, 0); // 从顶点0开始进行深度优先遍历
return 0;
}
```
阅读全文