一步一步学数据结构之n--n(图遍历--深度优先遍历--非递归实现)
前面已经说了图的深度优先遍历算法,是用递归实现的,而在这里就讲一下用非递归实现,需要借助栈:
算法思想:
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(图遍历--深度优先遍历--非递归实现)的更多相关文章
- 重新整理数据结构与算法(c#)—— 图的深度遍历和广度遍历[十一]
参考网址:https://www.cnblogs.com/aoximin/p/13162635.html 前言 简介图: 在数据的逻辑结构D=(KR)中,如果K中结点对于关系R的前趋和后继的个数不加限 ...
- 数据结构——图的深度优先遍历(邻接矩阵表示+java版本)
1.深度优先遍历(DFS) 图的深度优先遍历本质上是一棵树的前序遍历(即先遍历自身,然后遍历其左子树,再遍历右子树),总之图的深度优先遍历是一个递归的过程. 如下图所示,左图是一个图,右图是图的深度 ...
- 嗯,ACM按照这个一步一步来。
转一个搞ACM需要的掌握的算法. 要注意,ACM的竞赛性强,因此自己应该和自己的实际应用联系起来. 适合自己的才是好的,有的人不适合搞算法,喜欢系统架构,因此不要看到别人什么就眼红, 发挥 ...
- 数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)
前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...
- 一步一步学ROP之linux_x64篇
一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防 ...
- 一步一步学ROP之linux_x86篇
一步一步学ROP之linux_x86篇 作者:蒸米@阿里聚安全 一.序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过 ...
- 一步一步跟我学DeviceOne开发 - 仿微信应用(一,二,三)
这是一个系列的文档,长期目标是利用DeviceOne开发一些目前使用广泛的优质手机应用,我们会最大化的实现这些应用的每一个功能和细节,不只停留在简单的UI模仿和Demo阶段,而是一个基本可以使用的实际 ...
- (转载)一步一步学Linq to sql系列文章
现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContex ...
- 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计
本帖最后由 xinxincaijq 于 2013-1-9 10:27 编辑 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计 转自博客:http:// ...
随机推荐
- cocos2d-x3.9 NDK android 环境搭建过程中遇到的错误
编译环境:Mac OS, NDK r9d 错误:arm-linux-androideabi-gcc: error trying to exec '/media/Project/adt-bundle-l ...
- SQLite入门与分析(四)---Page Cache之事务处理(1)
写在前面:从本章开始,将对SQLite的每个模块进行讨论.讨论的顺序按照我阅读SQLite的顺序来进行,由于项目的需要,以及时间关系,不能给出一个完整的计划,但是我会先讨论我认为比较重要的内容.本节讨 ...
- Android:再按一次退出程序
感觉这种效果比较友好 //两秒内按返回键两次退出程序 private long exitTime = 0; @Override public boolean onKeyDown(int keyCode ...
- 使用PHP抓取网站ico图标
网站许久没用更新,以后会经常更新,本次分享一个使用PHP抓取网站ico的程序,提供一个网站列表后对网站的ico进行下载抓取,具体代码如下: <?php /** * 更新热站ico * gao 2 ...
- init进程解析rc文件的相关函数分析
init进程的源码文件位于system/core/init,其中解析rc文件语法的代码放在五个函数中, init_parse_config_file (init_parser.c), read_fil ...
- PL/SQL Developer使用技巧
1.PL/SQL Developer记住登陆密码 在使用PL/SQL Developer时,为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码: 设置方法:PL/SQL ...
- 转载:最小生成树-Prim算法和Kruskal算法
本文摘自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html 最小生成树-Prim算法和Kruskal算法 Prim算 ...
- write_chip,read_chip
int write_chip(UINT32 addr, UINT32 data) { if(0 == fpgaRWMode) /* localbus mode */ { UINT16 datah, d ...
- hdu4745Two Rabbits(dp)
链接 哎..比赛中一下想到了公共子序 之后思维就被局限了 一直在这附近徘徊 想着怎么优化 怎么预处理.. 观看了众多神牛的代码 ..以前觉得自己能写出个记忆化的最长回文长度 还挺高兴的...现在觉得好 ...
- [原]Unity3D深入浅出 - 物理材质(Physics Materials)
在Unity3d中已经配置好了5种常用的物理材质,Bouncy.Ice.Metal.Rubber.Wood,在菜单中依次选择Assets - Import Package - Physics Mate ...