图的遍历——dfs与
程序员文章站
2022-05-21 23:17:13
...
dfs的非递归与bfs都需要栈和队列的辅助。在重新使用栈和队列的功能之后,对栈,队列,数组直接的关系产生了疑问。在经过相关资料的查询后,明白了数组是存储结构,而栈和队列是逻辑结构。在最开始关于数据结构的定义时就有:数据结构:是指相互之间存在一种或多种特定关系的数据元素的 集合。因此,可以通过数组来实现栈和队列的功能。
dfs的非递归遍历需要用到栈的辅助:所使用的主要思想仍是遍历结点的所有邻接点,需要辅助数组来记录当前结点是否被遍历过。
1)对起始节点进行访问,将对应辅助数组的位置置1,该节点的指针入栈。
2)当该指针不为空时,对该节点的所有邻接点进行访问,如果邻接点被访问过,则置辅助数组的值为1,否则访问置1
void DFS1(GraphTp G,int vi) /*非递归深度优先遍历算法*/
{
arcnode *p;
arcnode *St[Vnum ];
int top=-1,v;
printf("%s ",G.vertices[vi].vexdata);/*访问vi顶点*/
visit[vi]=1; /*置已访问标识*/
top++; /*将初始顶点vi的firstarc指针进栈*/
St[top]=G.vertices[vi].firstarc;
while (top>-1) /*栈不空循环*/
{
p=St[top];//top--;/*出栈一个顶点为当前顶点*/
while (p!=NULL) /*循环搜索其相邻顶点*/
{
v=p->adjvex; /*取相邻顶点的编号*/
if (visit[v]==0)/*若该顶点未访问过*/
{
printf("%s ",G.vertices[v].vexdata); /*访问v顶点*/
visit[v]=1; /*置访问标识*/
top++; /*将该顶点的第1个相邻顶点进栈*/
St[top]=G.vertices[v].firstarc;
break; /*退出当前顶点的搜索*/
}
p=p->nextarc; /*找下一个相邻顶点*/
}
if (p==NULL) top--;
}
}
上一篇: 回溯2.求所有和为t的数字组合
下一篇: 图的遍历(dfs,bfs)