请给出c语言编写的图的深度优先遍历代码,要递归和堆栈两种
时间: 2024-10-22 19:09:36 浏览: 18
C语言 输入无向图连通图的顶点数、顶点信息、边数、顶点对序列及遍历的起始点序号,输出深度优先遍历序列
5星 · 资源好评率100%
以下是C语言中使用递归和堆栈两种方法实现深度优先搜索(DFS)遍历图的示例:
**使用递归:**
```c
#include <stdio.h>
#define MAX_VERTICES 100
// 图结构体
typedef struct {
int adj[MAX_VERTICES]; // 邻接表表示图
int num_vertices; // 节点数
} Graph;
void dfsRecursion(Graph* graph, int v, int visited[]) {
if (visited[v] == -1) { // 只对未访问节点进行操作
printf("%d ", v);
visited[v] = 1; // 标记已访问
for (int i = 0; i < graph->num_vertices; ++i)
if (graph->adj[v] & (1 << i)) // 检查边的存在
dfsRecursion(graph, i, visited); // 递归访问相邻节点
}
}
int main() {
Graph graph;
int vertices, edges;
scanf("%d %d", &vertices, &edges);
graph.num_vertices = vertices;
graph.adj = malloc(sizeof(int) * vertices);
// 初始化邻接表...
// ...
int visited[MAX_VERTICES] = {-1}; // 初始化所有节点为未访问
dfsRecursion(&graph, 0, visited); // 从节点0开始
return 0;
}
```
**使用堆栈:**
```c
#include <stdio.h>
#include <stdlib.h>
// ...(定义Graph结构体和邻接表)
void dfsStack(Graph* graph, int v, int visited[], stack_t* s) {
stack_push(s, v);
while (!stack_empty(s)) {
v = stack_pop(s);
if (visited[v] == -1) {
printf("%d ", v);
visited[v] = 1;
for (int i = 0; i < graph->num_vertices; ++i)
if (graph->adj[v] & (1 << i))
stack_push(s, i); // 将相邻节点压入堆栈
}
}
}
int main() {
// ...(初始化数据同上)
int visited[MAX_VERTICES] = {-1};
stack_t s;
stack_init(&s);
dfsStack(&graph, 0, visited, &s);
return 0;
}
```
在这两个例子中,`visited[]`数组用于跟踪节点的状态,`dfsRecursion()` 和 `dfsStack()` 函数分别递归地和用栈的方式遍历图。
阅读全文