// dfs非递归实现 void DFS(ALGraph G, int start) { bool visited[MAX_VERTEX_NUM]; for (int i = 0; i < G.vexnum; i++) { visited[i] = false; } int stack[MAX_VERTEX_NUM]; int top = -1; stack[++top] = start; visited[start] = true; while (top != -1) { int v = stack[top--]; printf("%d ", v); ArcNode* p = G.vertices[v].firstarc; while (p != NULL) { if (!visited[p->adjvex]) { visited[p->adjvex] = true; stack[++top] = p->adjvex; } p = p->nextarc; } } } // dfs递归实现 void DFS_recursive(ALGraph G, bool* visited, int v) { visited[v] = true; printf("%d ", v); ArcNode* p = G.vertices[v].firstarc; while (p != NULL) { if (!visited[p->adjvex]) { DFS_recursive(G, visited, p->adjvex); } p = p->nextarc; } }
时间: 2024-02-14 16:14:26 浏览: 57
DFS算法的非递归函数.rar_dfs_dfs.zip
这段代码包含了两个深度优先搜索(DFS)算法的实现,一个是非递归实现,一个是递归实现。以下是代码的解释:
非递归实现:
- 同样定义了一个 bool 类型的数组 visited,用于记录顶点是否被访问过。将数组中的所有元素初始化为 false。
- 定义了一个 int 类型的数组 stack,用于模拟栈结构。同时定义一个变量 top,表示栈顶的位置,初始值为 -1。
- 将起始顶点 start 压入栈中,并将 visited 数组中对应的位置设为 true。
- 进入 while 循环,只要栈不为空,就一直执行。在循环中,取出栈顶元素 v,并输出顶点的值。
- 遍历以顶点 v 为起点的所有边,如果边的终点未被访问过,则将其压入栈中,并将 visited 数组中对应的位置设为 true。
- 最后,当遍历完成后,所有的顶点都被访问过,算法结束。
递归实现:
- 同样定义了一个 bool 类型的数组 visited,用于记录顶点是否被访问过。将数组中的所有元素初始化为 false。
- 首先访问起始顶点 v,并将 visited 数组中对应的位置设为 true。
- 遍历以顶点 v 为起点的所有边,如果边的终点未被访问过,则递归调用 DFS_recursive 函数,继续遍历该顶点。
- 如果该顶点的所有邻居都被访问过了,则递归调用结束。
需要注意的是,递归实现的代码相对简洁,但是在图较大时可能会导致函数调用栈溢出,因此非递归实现的代码更加稳定。
阅读全文