图的遍历——dfs与

本文探讨了如何使用栈辅助实现图的深度优先搜索(DFS)非递归遍历。通过理解数组作为存储结构,栈和队列作为逻辑结构的关系,可以利用数组来模拟栈的功能。在DFS非递归遍历中,访问起始节点并标记辅助数组,然后将节点的指针压栈。当指针不为空时,遍历邻接点,已访问过的邻接点在辅助数组中标记为已访问。
摘要由CSDN通过智能技术生成

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--;
 }
  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值