首先,图的深度优先遍历是由起始节点出发,开始递归地访问它的一个邻接节点,直到最后的结点没有邻接节点。
这里用邻接表的方式表现图的深度优先遍历
再回顾一下邻接表的定义
typedef struct ArcNode { //定义边结点
int adjvex;//该边所指向的顶点
struct ArcNode *nextarc;//指向下一条边的指针
double info;//这里可以用来存储边的信息,例如边的权
}ArcNode;
typedef struct {//定义顶点
int data;
ArcNode *firstarc;//指向该顶点的第一条边
}VNode;
typedef struct {
VNode adlist [maxsize];//定义邻接表
int n,e;//定点数和边数
}AGraph;
int visit [maxsize]; //定义一个全局数组,用来记录结点是否已被访问
void DFS(AGraph *G,int v)
{
ArcNode *p;//定义一个边结点p
visit [v] = 1;//表示结点v已被访问
Visit(v);//访问结点的信息
p = G->adjlist [v].firstarc; //p指向顶点v的第一条边
while (p!=NULL)
{
if (p->adjvex == 0) //如果顶点未被访问则递归访问它
DFS(G,p->adjvex);
p = p->nextarc; // p指向v的下一条边的终点,我感觉就是p指向NULL然后就跳出循环
}