用c语言深度优先遍历图代码
时间: 2023-10-30 21:17:20 浏览: 100
以下是使用C语言实现的深度优先遍历图的代码:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100
// 定义图的结构体
typedef struct {
int edges[MAX_SIZE][MAX_SIZE]; // 存储边的矩阵
int vertexNum; // 顶点数
int edgeNum; // 边数
} Graph;
// 初始化图
void initGraph(Graph* graph, int vertexNum) {
graph->vertexNum = vertexNum;
graph->edgeNum = 0;
// 初始化边的矩阵
for (int i = 0; i < vertexNum; i++) {
for (int j = 0; j < vertexNum; j++) {
graph->edges[i][j] = 0;
}
}
}
// 添加边
void addEdge(Graph* graph, int start, int end) {
graph->edges[start][end] = 1;
graph->edges[end][start] = 1;
graph->edgeNum++;
}
// 深度优先遍历
void dfs(Graph* graph, bool visited[], int vertex) {
visited[vertex] = true;
printf("%d ", vertex);
for (int i = 0; i < graph->vertexNum; i++) {
if (graph->edges[vertex][i] == 1 && visited[i] == false) {
dfs(graph, visited, i);
}
}
}
// 对图进行深度优先遍历
void traverse(Graph* graph) {
bool visited[MAX_SIZE];
for (int i = 0; i < graph->vertexNum; i++) {
visited[i] = false;
}
for (int i = 0; i < graph->vertexNum; i++) {
if (visited[i] == false) {
dfs(graph, visited, i);
}
}
}
// 测试
int main() {
Graph graph;
initGraph(&graph, 6);
addEdge(&graph, 0, 1);
addEdge(&graph, 0, 2);
addEdge(&graph, 1, 2);
addEdge(&graph, 1, 3);
addEdge(&graph, 2, 4);
addEdge(&graph, 3, 4);
addEdge(&graph, 3, 5);
traverse(&graph);
return 0;
}
```
在上面的代码中,我们首先定义了一个`Graph`结构体来存储图的信息,包括边的矩阵、顶点数和边数。然后我们实现了`initGraph`函数来初始化图,`addEdge`函数来添加边。
在进行深度优先遍历时,我们使用了一个`visited`数组来记录每个顶点是否被访问过。我们首先将起始顶点标记为已访问,并将其输出。然后递归地遍历其未被访问的邻居,直到所有与起始顶点连通的顶点都被访问到为止。最后,我们在`traverse`函数中遍历所有顶点,并对未被访问的顶点进行深度优先遍历。
阅读全文