问答题 编写一个实现连通图G的深度优先遍历(从顶点v出发)的非递归函数,可以用伪代码描述。
【正确答案】本题的算法如下: 将所有顶点置为“未访问”标志; 输出起始顶点v0; 置v0为“已访问”标志; 将v0入栈; while(栈不空时) { 取栈顶v; if(v存在未被访问的邻接顶点,则选择一个顶点v1) { 输出v1; 置v1为“已访问”标志; 将v1入栈; } else当前顶点退栈; } c语言代码如下: void dfs1(graph g,int v) { int i; arcnode *p; int visited[Vnum],top=-1,stack[Vnum]; for(i=0;i<g.vexnum;i++) visited[i]=0; //结点访问标志均置为0 visit(v); //访问顶点v top++; //v入栈 stack[top]=v; visited[v]=1; while(top>=0) //栈不空时循环 { v=stack[top]; --top; //取栈顶顶点 p=g.adjlist[v].firstarc; while(p!=NULL && visited[p→adjvex]==1) p=p→nextarc; if(p==NULL) //若没有,退到前一个 --top; else //若有,选择一个 { v=p→adjvex; visit(v); //访问顶点 visited[v]=1; top++; //入栈 stack[top]=v; } } }
【答案解析】