C语言实现图的深度优先遍历和广度优先遍历

图的深度优先遍历和广度优先遍历

图的遍历

从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历
图的遍历方法有两种,一种叫深度优先遍历(DFS),另一种叫广度优先遍历(BFS)

深度优先遍历

深度优先遍历的过程是从图中的某个初始点v出发,首先访问初始点v,然后选择一个与顶点v相邻且没被访问过的顶点w,以为初始顶点,再从它出发进行深度优先遍历,直到图中与顶点v邻接的所有顶点都被访问过为止。
通过以上说明可知,图的深度优先遍历是一个递归的过程。
下面是通过c语言实现的深度优先搜素的算法:

//深度优先遍历
int visited[MAX]={0};   //全局数组
void DFS(AdjGraph *G,int v)     //深度优先遍历算法
{
    ArcNode *p;
    visited[v]=1;
    printf("%d ",v);        //置已访问标记
    p=G->adjlist[v].firstarc;   //输出被访问顶点的编号
    while (p!=NULL)         //p指向顶点v的第一个邻接点
    {
        /* code */
        if (visited[p->adjvex]==0)  //若p->adjvex顶点未被访问,递归访问它
            DFS(G,p->adjvex);
        p=p->nextarc;       //p指向顶点v的下一个邻接点
        
    }
    
}

深度优先搜索有一个说法就是一条路走到黑,就是先按照一个方向遍历,当一个顶点没有下一个邻接点的时候,再返回上一个顶点,遍历上一个顶点未被访问的邻接点。如此递归下去,直到所有的顶点都被访问为止

广度优先遍历

广度优先遍历的过程是首先访问初始点v,接着访问顶点v的所有未被访问过的邻接点v1,v2,…,vt,然后再按照v1,v2,…,vt的次序访问每一个顶点的所有未被访问过的邻接点,以此类推,直到图中所有和初始点v有路径相通的顶点都被访问过为止。
在遍历以邻接表为存储结构的图时,需要使用一个队列,下面是用c语言对广度优先遍历的实现。

//广度优先遍历
void BFS(AdjGraph *G,int v)
{
    int w,i;ArcNode *p;
    SqQueue *qu; //定义环形队列指针
    InitQueue *qu;      //初始化队列
    int visited[MAXV];      //定义顶点访问标记数组
    for(i=0;i<G->n;i++)visited[i]=0;        //访问标记数组初始化
    printf("%2d",v);                        //输出被访问顶点的编号
    visited[v]=1;                           //置已访问标记
    enQueue(qu,v);
    while (!QueueEmpty(qu))                 //队空不循环
    {
        /* code */
        deQueue(qu,w);                      //出队一个顶点w
        p=G->adjlist[w].firstarc;           //指向w的第一个邻接点
        while (p!= NULL )                   //查找w的所有邻接点
        {
            /* code */
            if (visited[p->adjvex]==0)      //若当前邻接表未被访问
            {
                /* code */
                printf("%2d",p->adjvex);    //访问该邻接点
                visited[p->adjvex]=1;       //置已访问标记
                enQueue(qu,p->adjvex);      //该顶点进队
            }
            p=p->nextare;                   //找下一个邻接点
            
        }
        
    }
    printf("\n");
}


以邻接矩阵为存储结构的广度优先遍历算法与此类似,此处不再列出。

  • 39
    点赞
  • 242
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值