前面已经说了图的深度优先遍历算法,是用递归实现的,而在这里就讲一下用非递归实现,需要借助栈:

算法思想:

       1. 栈初始化

       2. 输出起始顶点,起始顶点改为“已访问”标志,将起始顶点进栈

       3. 重复下列操作直到栈为空:

                 3.1 取栈顶元素顶点

                 3.2 栈顶元素顶点存在未被访问过的邻接点w,则:

                                3.2.1  输出顶点w

                                3.2.2  将顶点w改为“已访问”标志

                                3.2.3  将顶点w进栈

                 3.3 否则,当前顶点出栈

        非递归实现深度优先遍历(邻接链表法)

static void orther_dfs(TLGraph* tGraph, int v, int visited[], LGraph_Printf* pFunc)
{
LinkStack* stack = LinkStack_Create(); LinkStack_Push(stack, tGraph->v + v); while(!LinkStack_Empty(stack))
{
int w = (LVertex**)LinkStack_Top(stack) - tGraph->v; LinkStack_Pop(stack); if(!visited[w])
{
int i = 0; pFunc(tGraph->v[w]); visited[w] = 1; for(i=0; i<LinkList_Length(tGraph->la[v]); i++)
{
if(!visited[i])
{
LinkStack_Push(stack, tGraph->v + i);
}
}
}
} LinkStack_Destroy(stack);
} void LGraph_DFS_Orther(LGraph* graph, int v, LGraph_Printf* pFunc)
{
TLGraph* tGraph = (TLGraph*)graph; int* visited = NULL; int condition = (NULL != tGraph);
condition = condition && (0 <= v) && (v < tGraph->count);
condition = condition && (NULL != pFunc);
condition = condition && (NULL != (visited = (int*)calloc(tGraph->count, sizeof(int)))); if(condition)
{
int i = 0; orther_dfs(tGraph, v, visited, pFunc); for(i=0; i<tGraph->count; i++)
{
if(!visited[i])
{
orther_dfs(tGraph, i, visited, pFunc);
}
} printf("\n");
} free(visited);
}

        非递归实现深度优先遍历(邻接矩阵法)

       

static void orther_dfs(TMGraph* tGraph, int v, int visited[], MGraph_Printf* pFunc)
{
LinkStack* stack = LinkStack_Create(); LinkStack_Push(stack, tGraph->v + v); while(!LinkStack_Empty(stack))
{
int w = (MVertex**)LinkStack_Top(stack) - tGraph->v; LinkStack_Pop(stack); if(!visited[w])
{
int i = 0; pFunc(tGraph->v[w]); visited[w] = 1; for(i=0; i<LinkList_Length(tGraph->count); i++)
{
if((0!=tGraph->matrix[v][i]) && (!visited[i]))
{
LinkStack_Push(stack, tGraph->v + i);
}
}
}
} LinkStack_Destroy(stack);
} void MGraph_DFS_Orther(MGraph* graph, int v, MGraph_Printf* pFunc)
{
TMGraph* tGraph = (TMGraph*)graph; int* visited = NULL; int condition = (NULL != tGraph);
condition = condition && (0 <= v) && (v < tGraph->count);
condition = condition && (NULL != pFunc);
condition = condition && (NULL != (visited = (int*)calloc(tGraph->count, sizeof(int)))); if(condition)
{
int i = 0; orther_dfs(tGraph, v, visited, pFunc); for(i=0; i<tGraph->count; i++)
{
if(!visited[i])
{
orther_dfs(tGraph, i, visited, pFunc);
}
} printf("\n");
} free(visited);
}

一步一步学数据结构之n--n(图遍历--深度优先遍历--非递归实现)的更多相关文章

  1. 重新整理数据结构与算法(c#)—— 图的深度遍历和广度遍历[十一]

    参考网址:https://www.cnblogs.com/aoximin/p/13162635.html 前言 简介图: 在数据的逻辑结构D=(KR)中,如果K中结点对于关系R的前趋和后继的个数不加限 ...

  2. 数据结构——图的深度优先遍历(邻接矩阵表示+java版本)

    ​1.深度优先遍历(DFS) 图的深度优先遍历本质上是一棵树的前序遍历(即先遍历自身,然后遍历其左子树,再遍历右子树),总之图的深度优先遍历是一个递归的过程. 如下图所示,左图是一个图,右图是图的深度 ...

  3. 嗯,ACM按照这个一步一步来。

        转一个搞ACM需要的掌握的算法.   要注意,ACM的竞赛性强,因此自己应该和自己的实际应用联系起来. 适合自己的才是好的,有的人不适合搞算法,喜欢系统架构,因此不要看到别人什么就眼红, 发挥 ...

  4. 数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)

    前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...

  5. 一步一步学ROP之linux_x64篇

    一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防 ...

  6. 一步一步学ROP之linux_x86篇

    一步一步学ROP之linux_x86篇 作者:蒸米@阿里聚安全 ​ 一.序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过 ...

  7. 一步一步跟我学DeviceOne开发 - 仿微信应用(一,二,三)

    这是一个系列的文档,长期目标是利用DeviceOne开发一些目前使用广泛的优质手机应用,我们会最大化的实现这些应用的每一个功能和细节,不只停留在简单的UI模仿和Demo阶段,而是一个基本可以使用的实际 ...

  8. (转载)一步一步学Linq to sql系列文章

    现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContex ...

  9. 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计

    本帖最后由 xinxincaijq 于 2013-1-9 10:27 编辑 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计 转自博客:http:// ...

随机推荐

  1. GridBagLayout()的使用方法

    GridBagLayout是java里面最重要的布局管理器之一,可以做出很复杂的布局,可以说GridBagLayout是必须要学好的的, GridBagLayout 类是一个灵活的布局管理器,它不要求 ...

  2. Android:通过Intent访问一个网页

    Intent(意图)主要是解决Android应用的各项组件之间的通讯. 小实例 package com.example.testopen; import android.app.Activity; i ...

  3. WPF中动态添加xaml资源文件

    一.新建一个资源文件,然后设置其Build Actoin(生成操作)为Resource(资源): 二.在App.xaml.cs的StartUp事件或者是你需要的时机代码段写上如下代码: Resourc ...

  4. java去除重复的字符串和移除不想要的字符串

    在java开发中碰到了有些字符串是重复的,如果在进行业务处理要全部遍历太对的数据就会重复,所以在进行业务处理前进行一个去重操作. 这里由于业务需要所以先将字符串转化为string数组,使用split分 ...

  5. Android px、sp、dp之间的互转

    public static int px2sp(Context context, float pxValue) { final float fontScale = context.getResourc ...

  6. CSS和JavaScript以及Ajax实现预加载图片的方法及优缺点分析

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画 廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发 ...

  7. 命令行下玩VC

    说明:(1)转载请注明出处:http://www.cnblogs.com/opangle/p/4298155.html (2)以下以VS2013为例,并假设VC安装路径为%VC_INSTALL_PAT ...

  8. HTML5学习(九)----应用程序缓存

    参考教程:http://www.w3school.com.cn/html5/html_5_app_cache.asp 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 w ...

  9. [原]Unity3D深入浅出 - 物理引擎之碰撞体(Colliders)

    通常Colliders会与Rigidbody一起使用,没有添加碰撞体的刚体会彼此相互穿过. 常用碰撞体有以下几种: Box Collider:盒子碰撞体,是一个立方体外形的碰撞体,可调整为不同大小的长 ...

  10. Spring data rest 如何显示主键

    How to expose the resourceId with Spring-Data-Rest? Spring-Data-Rest is a quite new project in the S ...