邻接矩阵存储图的两种遍历方式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
下面是用邻接矩阵存储一个无向图的深度优先遍历和广度优先遍历代码,深度优先遍历就是树的先根遍历的一种推广,而广度优先也是和树的层次遍历相似的,用邻接矩阵存储,进行这两种遍历的实现,是比较容易的。
因为用了自己写的循环队列的模版,所以代码看起来有点冗长.
1.#include
2.#include
ing namespace std;
4.
5.//下面是循环队列模版
6.template
7.class My_queue;
8.
9.template
10.class Node
11.{
12.private:
13. T data;
14. Node
15.public:
16. Node()
17. {
18. next=0;
19. }
20. Node(T d)
21. {
22. data=d;
23. next=0;
24. }
25.friend My_queue
26.};
27.
28.template
29.class My_queue
30.{
31.private:
32. Node
33.public:
34. My_queue()
35. {
36. tail=new Node
37. tail->next=tail;
38. }
39.
40. ~My_queue()
41. {
42. clean();
43.delete tail;
44. }
45.
46.bool empty()
47. {
48.return (tail->next==tail);
49. }
50.
51.void push(T d)
52. {
53. Node
54. p->next=tail->next;
55. tail->next=p;
56. tail=p;
57. }
58.
59. T front()
60. {
61.if(empty())
62. {
63. cout<<"queue is empty!"< 64. exit(0); 65. } 66. Node 67. T data=p->next->data; 68.return data; 69. } 70. 71. T back() 72. { 73.if(empty()) 74. { 75. cout<<"queue is empty!"< 76. exit(0); 77. } 78. T data=tail->data; 79.return data; 80. } 81. 82.void pop() 83. { 84. Node 85. Node 86. p->next=q->next; 87.if(q==tail) 88. tail=p; 89.delete q; 90. } 91. 92.void clean() 93. { 94. Node 95. Node 96.while(q!=p) 97. { 98. p->next=q->next; 99.delete q; 100. p->next=q; 101. } 102. } 103.}; 104. 105.#define MAX_VERTEX_NUM 20 106. 107.bool visited[20];//全局数组,用于辅助遍历 108. 109.struct MGraph 110.{ 111. string vexs[MAX_VERTEX_NUM];//顶点数组 112.int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵 113.int vexnum;//顶点数目 114.int arcnum;//边数目 115.}; 116. 117.int Locate_Vex(MGraph G,string x) //用于确定顶点在顶点数组中的位置118.{ 119.for(int k=0;G.vexs[k]!=x;k++); 120.return k; 121.} 122. 123.void CreateUDN_MG(MGraph &G) 124.{