欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图的遍历——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--;
 }
  
}
相关标签: 数据结构