无向图——邻接矩阵的深度优先和广度优先算法实现

测试环境:VS2008(C)

[cpp:showcolumns] view plaincopyprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

  1. #include "stdafx.h"
  2. #include <stdlib.h>
  3. #include <malloc.h>
  4. #define INFINITY INT_MAX
  5. #define MAX_VEX 20
  6. #define VRType int
  7. #define VertexType char
  8. #define InfoType int
  9. int *visited;
  10. /********************************/
  11. /****      图的结构定义      ****/
  12. /********************************/
  13. typedef enum
  14. {
  15. DG,
  16. DN,
  17. UDG,
  18. UDN
  19. }GraphKind;
  20. struct _ArcCell
  21. {
  22. VRType adj; /* note weight */
  23. InfoType *info;
  24. };
  25. typedef struct _ArcCell ArcCell, AdjMatrix[MAX_VEX][MAX_VEX];
  26. struct _MGraph
  27. {
  28. VertexType vexs[MAX_VEX];
  29. AdjMatrix arcs;
  30. int vexnum, arcnum;
  31. GraphKind kind;
  32. };
  33. typedef struct _MGraph MGraph;
  34. /********************************/
  35. /****      栈的结构定义      ****/
  36. /********************************/
  37. struct _node
  38. {
  39. int ivex;
  40. struct _node *next;
  41. };
  42. typedef struct _node node, *pnode;
  43. struct _stack
  44. {
  45. int size;
  46. pnode ptop;
  47. };
  48. typedef struct _stack stack, *pstack;
  49. /********************************/
  50. /****      堆的结构定义      ****/
  51. /********************************/
  52. struct _queue
  53. {
  54. pnode front;
  55. pnode rear;
  56. };
  57. typedef struct _queue queue, *pqueue;
  58. /********************************/
  59. /****         栈的实现       ****/
  60. /********************************/
  61. pstack init_stack(int size)
  62. {
  63. pnode pn=NULL;
  64. pstack ps=NULL;
  65. pn=(pnode)malloc(sizeof(node));
  66. ps=(pstack)malloc(sizeof(stack));
  67. pn->ivex=-1;
  68. pn->next=NULL;
  69. ps->size=size;
  70. ps->ptop=pn;
  71. return ps;
  72. }
  73. int empty_stack(pstack ps)
  74. {
  75. if(ps->ptop->next==NULL)
  76. return 1;
  77. else
  78. return 0;
  79. }
  80. void push_stack(pstack ps, int ivex)
  81. {
  82. pnode pn=NULL;
  83. pn=(pnode)malloc(sizeof(node));
  84. pn->ivex=ivex;
  85. pn->next=ps->ptop;
  86. ps->ptop=pn;
  87. }
  88. int pop_stack(pstack ps)
  89. {
  90. int ivex=-1;
  91. pnode pn=NULL;
  92. if(!empty_stack(ps))
  93. {
  94. pn=ps->ptop;
  95. ps->ptop=ps->ptop->next;
  96. ivex=pn->ivex;
  97. free(pn);
  98. }
  99. return ivex;
  100. }
  101. /********************************/
  102. /****         堆的实现       ****/
  103. /********************************/
  104. queue init_queue()
  105. {
  106. pnode pn=NULL;
  107. queue qu;
  108. pn=(pnode)malloc(sizeof(node));
  109. pn->next;
  110. pn->ivex=-1;
  111. qu.front=qu.rear=pn;
  112. return qu;
  113. }
  114. int empty_queue(queue qu)
  115. {
  116. if(qu.front==qu.rear)
  117. return 1;
  118. else
  119. return 0;
  120. }
  121. void en_queue(queue qu, int ivex)
  122. {
  123. pnode pn=NULL;
  124. pn=(pnode)malloc(sizeof(node));
  125. pn->ivex=ivex;
  126. pn->next=qu.rear->next;
  127. qu.rear=pn;
  128. }
  129. int de_queue(queue qu)
  130. {
  131. int ivex=-1;
  132. pnode pn=NULL;
  133. if(!empty_queue(qu))
  134. {
  135. pn=qu.front;
  136. qu.front=qu.front->next;
  137. ivex=pn->ivex;
  138. free(pn);
  139. }
  140. return ivex;
  141. }
  142. /********************************/
  143. /****         图的实现       ****/
  144. /********************************/
  145. int LocateVex(MGraph g, char ch)
  146. {
  147. int i;
  148. for(i=1; i<=g.vexnum; i++)
  149. if(ch==g.vexs[i])
  150. return i;
  151. return -1;
  152. }
  153. MGraph Create_UDG()
  154. {
  155. int i, j, w, p1, p2;
  156. char ch1, ch2;
  157. MGraph g;
  158. printf("Enter vexnum arcnum: ");
  159. scanf("%d %d", &g.vexnum, &g.arcnum);
  160. getchar();
  161. for(i=1; i<=g.vexnum; i++)
  162. for(j=1; j<=g.vexnum; j++)
  163. g.arcs[i][j].adj=g.arcs[j][i].adj=INFINITY; /* UDG should define i-j and j-i */
  164. printf("Enter %d vex.../n", g.vexnum);
  165. for(i=1; i<=g.vexnum; i++)
  166. {
  167. printf("vex %d: ", i);
  168. scanf("%c", &g.vexs[i]);
  169. getchar();
  170. }
  171. printf("Enter %d arc.../n", g.arcnum);
  172. for(i=1; i<=g.arcnum; i++)
  173. {
  174. printf("arc %d: ", i);
  175. scanf("%c %c %d", &ch1, &ch2, &w);
  176. getchar();
  177. p1=LocateVex(g, ch1);
  178. p2=LocateVex(g, ch2);
  179. g.arcs[p1][p2].adj=g.arcs[p2][p1].adj=w;
  180. }
  181. return g;
  182. }
  183. int FirstVex(MGraph g, int i)
  184. {
  185. int k;
  186. if(i>=1 && i<=g.vexnum)
  187. for(k=1; k<=g.vexnum; k++)
  188. if(g.arcs[i][k].adj!=INFINITY)
  189. return k;
  190. return -1;
  191. }
  192. int NextVex(MGraph g, int i, int j)
  193. {
  194. int k;
  195. if(i>=1 && i<=g.vexnum && j>=1 && j<=g.vexnum)
  196. for(k=j+1; k<=g.vexnum; k++)
  197. if(g.arcs[i][k].adj!=INFINITY)
  198. return k;
  199. return -1;
  200. }
  201. void DFS(MGraph g, int i)
  202. {
  203. int j;
  204. if(!visited[i])
  205. {
  206. visited[i]=1;
  207. printf("%3c", g.vexs[i]);
  208. for(j=FirstVex(g, i); j>=1; j=NextVex(g, i, j))
  209. if(!visited[j])
  210. DFS(g, j);
  211. }
  212. }
  213. void DFS_Graph(MGraph g)
  214. {
  215. int i;
  216. visited=(int *)malloc((g.vexnum+1)*sizeof(int));
  217. for(i=1; i<=g.vexnum; i++)
  218. visited[i]=0;
  219. for(i=1; i<=g.vexnum; i++)
  220. if(!visited[i])
  221. DFS(g, i);
  222. }
  223. void DFS2_Graph(MGraph g)
  224. {
  225. int i, j, k;
  226. pstack ps=NULL;
  227. ps=init_stack(g.vexnum);
  228. visited=(int *)malloc((g.vexnum+1)*sizeof(int));
  229. for(i=1; i<=g.vexnum; i++)
  230. visited[i]=0;
  231. for(i=1; i<=g.vexnum; i++)
  232. if(!visited[i])
  233. {
  234. visited[i]=1;
  235. printf("%3c", g.vexs[i]);
  236. push_stack(ps, i);
  237. k=i;
  238. while (!empty_stack(ps))
  239. {
  240. for(j=FirstVex(g, k); j>=1; j=NextVex(g, k, j))
  241. {
  242. if(!visited[j])
  243. {
  244. visited[j]=1;
  245. printf("%3c", g.vexs[j]);
  246. push_stack(ps, j); /* push all visited ivex */
  247. k=j; /* newer node */
  248. }
  249. }
  250. k=pop_stack(ps);
  251. }
  252. }
  253. }
  254. void BFS_Graph(MGraph g)
  255. {
  256. int i, j, k;
  257. queue qu;
  258. qu=init_queue();
  259. visited=(int *)malloc((g.vexnum+1)*sizeof(int));
  260. for(i=1; i<=g.vexnum; i++)
  261. visited[i]=0;
  262. for(i=1; i<=g.vexnum; i++)
  263. if(!visited[i])
  264. {
  265. visited[i]=1;
  266. printf("%3c", g.vexs[i]);
  267. en_queue(qu, i);
  268. while (!empty_queue(qu))
  269. {
  270. k=de_queue(qu);
  271. for(j=FirstVex(g, k); j>=1; j=NextVex(g, k, j))
  272. if(!visited[j])
  273. {
  274. visited[j]=1;
  275. printf("%3c", g.vexs[j]);
  276. en_queue(qu, j);
  277. }
  278. }
  279. }
  280. }
  281. /********************************/
  282. /****          主函数        ****/
  283. /********************************/
  284. int _tmain(int argc, _TCHAR* argv[])
  285. {
  286. MGraph g;
  287. g=Create_UDG();
  288. printf("/nDFS: ");
  289. DFS_Graph(g);       /* recursion */
  290. printf("/nDFS: ");
  291. DFS2_Graph(g);      /* non recursion */
  292. printf("/nBFS: ");
  293. BFS_Graph(g);
  294. printf("/n");
  295. return 0;
  296. }

运行结果:

      

原文链接:http://blog.csdn.net/sunboy_2050/article/details/5684519

转载于:https://www.cnblogs.com/10jschen/archive/2012/08/15/2639636.html

图的深度优先和广度优先算法(DFS递归与非递归)相关推荐

  1. 树与二叉树的深度优先与广度优先算法(递归与非递归)

    本博客前面文章已对树与二叉树有过简单的介绍,本文主要是重点介绍有关二叉树的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(三)-- 树与二叉树   和  各种基本算法实现小结( ...

  2. 数据结构 - 图 (图的深度优先和广度优先)

    图的基本介绍 为什么要有图这种数据结构 数据结构有线性表和树 线性表局限与一个直接前驱和一个直接后继的关系 树也只能右一个直接前驱也就是父节点 当我们需要表示多对多的关系时,这里我们就需要用到图这种数 ...

  3. Python 实现图的深度优先和广度优先搜索

    在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...

  4. python爬虫算法深度优先_爬虫课程(四)|深度优先和广度优先算法

    深度优先和广度优先算法在爬取一个整站上经常用到,本课程主要讲解这两个算法的原理以及使用过程. 一.网站的树结构 1.1.一个网站的url结构图 以知乎为例,知乎目前有发现.话题.Live.书店.圆桌. ...

  5. 深度优先和广度优先算法(例题)

    在LeetCode上面刷题刷到一道二叉树的题,这道题我认为对学习树的深度优先和广度优先算法有一定的帮助,先来看一下题 这道题是这样的: 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返 ...

  6. P202 例9-2 以如图9-8所示的带权有向图为例,编写测试上述图的深度优先和广度优先遍历函数的程序。

    P202 例9-2 以如图9-8所示的带权有向图为例,编写测试上述图的深度优先和广度优先遍历函数的程序. 头文件1:SeqList.h #include<stdio.h>#define M ...

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

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

  8. 傅里叶变换算法c语言实现(递归与非递归)

    1.算法设计原理分析 把傅里叶变换公式进行拆分,按奇偶进行分组,使之转外为两个T(n/2)的计算式. 这样就可以找到了递归特性,可以一直拆分下去,直到一组只有一个数值.递归算法实现则可以为在每次递归中 ...

  9. 九十五、二叉树的递归和非递归的遍历算法模板

    @Author:Runsen 刷Leetcode,需要知道一定的算法模板,本次先总结下二叉树的递归和非递归的遍历算法模板. 二叉树的四种遍历方式,前中后加上层序遍历.对于二叉树的前中后层序遍历,每种遍 ...

最新文章

  1. ps怎么把一个颜色替换成另一个颜色_图标设计,用PS制作一款小清新的拟物时钟...
  2. 电视信号——行场同步
  3. 这可能是史上功能最全的Java权限认证框架!
  4. 中国电子学会发布《新一代人工智能领域十大最具成长性技术展望(2018-2019年)》...
  5. 使用Elasticsearch+filebeat+logstach+kibana构建日志服务平台
  6. mybatis foreach 错误_MyBatis高级结果映射之一对一映射
  7. 下单消息的发送和接收案例
  8. dcdc模块降额设计_一款高性能电源模块的设计思路
  9. java 栈队列区别是什么意思_java栈和队列的区别
  10. 初识Quartz (一)
  11. [翻译] SSKeychain
  12. 医院his系统机房服务器,医院信息中心机房如何建设
  13. 怎么让你的网站快如飞?
  14. node.js的安装和Vue.js脚手架的安装
  15. unctf2020部分wp
  16. Codeforces Round #469 (Div. 2) F. Curfew
  17. LCD12864 菜单部分编写
  18. react antd Table 表格 td超出自动换行
  19. java产品经理_产品经理必懂的技术那点事儿:成为全栈产品经理
  20. CVPR 2018 论文解读集锦

热门文章

  1. OO_Unit2_多线程电梯
  2. ROS学习笔记三:编写第一个ROS节点程序
  3. poj-2406(kmp水题)
  4. 分布式数据库管理系统
  5. 2017-2018-1 20155234《信息安全系统设计基础》第五周学习总结
  6. 最新的 PageValidate 类
  7. JDBC与ORM发展与联系 JDBC简介(九)
  8. BZOJ 1084: [SCOI2005]最大子矩阵
  9. 《Pro ASP.NET MVC 3 Framework》学习笔记之二十七【视图1】
  10. 脏读,不可重复读,幻读