图的DFS算法在邻接表与邻接矩阵下的非递归实现

这篇笔记详细介绍了图的深度优先搜索(DFS)算法在邻接矩阵和邻接表数据结构下的非递归实现,包括伪代码描述、具体实现和测试过程。作者指出网上的一些实现存在错误,可能导致学习困惑,并提供了自己的清晰实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如题 自用笔记 如有错误欢迎及时指正

目录

伪代码描述

邻接矩阵下实现非递归DFS

邻接表下实现非递归DFS

测试


网上搜到的算法实现大多都在访问顶点前后出入栈的处理上有错误或者小问题,代码风格也不尽统一,十分容易带来学习误区,遂总结之。话不多说,直接上代码,文末给出测试环境。

递归方法见下文:图的BFS与DFS算法在邻接矩阵与邻接表存储结构下实现_kollektor的博客-优快云博客


伪代码描述

非递归实现DFS

 (1)栈S初始化;visited[n]=0;

 (2)访问顶点v;visited[v]=1;顶点v入栈S

 (3)while(栈S非空)

            x=栈S的顶元素(不出栈);

            if(存在并找到未被访问的x的邻接点w)

                    访问w;visited[w]=1;

                    w进栈;

            else

                     x出栈;

邻接矩阵下实现非递归DFS

//DFS_NoRecur
void DFS_NoRecur(MatrixGraph G,int u){
    SqStack S;      //辅助栈
    InitStack(S);
    int v;   //负责保存出栈顶点下标 v
    int w;      //w负责找出栈顶点的邻接点 和判定便存在性

    /*开始DFS过程*/
    printf("%d->", G->Vex[u]); //访问
    visited[u] = true;               //访问标记
    Push(S, u);                      //入栈
    while (!StackEmpty(S)){
        GetTop(S, v); //取出栈顶 v保存  此处不可以直接出栈!!!
        for (w = 0; w < G->vexnum; w++){ //寻找或访问v的邻接点w
            if (!visited[w]&&G->Edge[v][w]!=INF){                                            //存在并找到未被访问的v的邻接点w=p->adjvex
                printf("%d->", G->Vex[w]);          //访问
                visited[w] = true;               //做标记
                Push(S, w);                      //入栈
            }else{
                Pop(S, v); // v出栈
            }
        } // for
    }// while
    /*结束DFS过程*/
}
//DFSTraverse_NoRecur
void DFSTraverse_NoRecur(MatrixGraph G){
    memset(visited, false, MAX_VEX_NUM);
    int v;
    for (v = 0; v < G->vexnum; v++){
        if(!visited[v]){
            DFS_NoRecur(G, v);
        }//if
    }    // for
    printf("^\n");
}
<
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值