DFS算法很有趣, 算法实现的简简单单几行代码,C语言用循环内嵌套递归来分别实现"走到头再回去"和"访问"这两个操作,当选择的顶点被访问过后,通过 循环和循环内的p_adjv = p_adjv->p_next 实现对邻接表中顶点的临接链表来遍历 以此达到更换该顶点相邻的其)他顶点,当访问到没有visited过的定带你就会再次递归刚问,否则将在当前一直访问到头(即:p_adjv == NULL),然后执行返回操作,递归栈将弹出顶点数组中的起始顶点信息,即实现返回最近的访问顶点
//
// main.cpp
// DFS_recursion
//
// Created by 郭宸羽 on 24/10/2022.
//
#include <stdio.h>
#include <stdlib.h>
#define Vertex_Num 5
typedef struct edgeNode
{
int adjv_idx;
struct edgeNode* next;
}edgeNode;
typedef struct vListNode
{
int data;
edgeNode* p_first_v;
}vListNode;
typedef struct AGraph
{
int v_num;
int edg_num;
vListNode v_list[Vertex_Num];
}AGraph;
void Visit(int v_idx);
void DFS_VList(int v_idx,AGraph* p_G,bool visited_arr[])
{
Visit(v_idx);visited_arr[v_idx] = true;
edgeNode* p_adjv = p_G->v_list[v_idx].p_first_v;//通过临接链表结点的顶点下标实现深度访问这个邻接链表中的顶点
//关联顶点在顶点数组中的next顶点(通过联顶点idx访问顶点数组相同idx⇔相同顶点,但是顶点数组可以通过next访问该顶点的关联顶点)
while(p_adjv != NULL)//p_adjv == NULL 1)函数栈为空情况下==NULL ⇔ 图中该顶点为孤立结点⇒遍历顶点数组中下一个顶点 实现:外层嵌套循环,遍历visited数组,对visited[i] == false 的顶点最为新起点调用DFS_Vlist 2)函数栈不为空则返回上一个调用函数执行是否为ture的
{
if(visited_arr[p_adjv->adjv_idx] == false)
{
DFS_VList(p_adjv->adjv_idx, p_G, visited_arr);//递归实现访问顶点
}
else if(visited_arr[p_adjv->adjv_idx] == true)
{
p_adjv = p_adjv->next;//while{ p_adjv = p_adjv->p_next }实现选择相邻顶点(通过递归和循环)
}
}
}
int main()
{
bool visited_arr[Vertex_Num] ={false};
}
//SUM:
//1.递归调用中,递归函数完成全部代码然后执行递归返回后,调用前一个栈中保存的函数的信息来继续执行递归调用前的下面的代码是回溯思想的一种实现