42. 蛤蟆的数据结构笔记之四十二图的遍历之广度优先
本篇名言:“生活真象这杯浓酒 ,不经三番五次的提炼呵 ,
就不会这样一来可口 ! --
郭小川”
继续看下广度优先的遍历,上篇我们看了深度遍历是每次一个节点的链表是走到底的。
欢迎转载,转载请标明出处:http://write.blog.csdn.net/postedit/47029275
1. 原理
首先,从图的某个顶点v0出发,访问了v0之后,依次访问与v0相邻的未被访问的顶点,然后分别从这些顶点出发,广度优先遍历,直至所有的顶点都被访问完。
如上面图1
其广度优先遍历得到的序列为:
0->1->2->3->4->5->6->7
2. 代码实现
具体代码查看40节。
2.1 定义结构
/*队列的链式存储结构*/
typedefstruct
qnode
{
int data;
struct qnode*next;
}qnode,*queueptr;
typedefstruct
{
queueptr front;
queueptr rear;/*队头、队尾指针*/
}linkqueue;
2.2 bfstraverse
5个顶点为1,2,3,4,5
边连接是 1和2,1和3,2和3,2和4,3和4 连接。
遍历开始从顶点2开始。
同深度遍历,先设置数据为0表示未被查询。
调用initqueue函数置空的队列。
输出节点然后将该节点加入到队列中。
如果队列不为空,得到队列的第一个元素。
具体执行是
U=2,W=4 (4 入队列)
U=2,W=3(3 入队列)
U=2,W=1(1 入队列)
U=4(出队列得到),W=3
U=4,W=2
U=3(出队列得到),W=4
U=3,W=2
U=3,W=1
U=1(出队列得到),W=3
U=1,W=2
结束
2.3 initqueue
构造空队列。
一个队头和创建一个节点。
2.4 enqueue
分配一个节点空间。
加入到队列到尾部中。
2.5 queueempty
判断是否为空队列,空则返回TRUE,否则返回FALSE。
2.6 dequeue
若队列不空,删除q的队头元素,用e返回其值
2.7 firstadjvex
同上节的深度遍历优先。
2.8 nextadjvex
同上节中的深度遍历优先。
3. 源码
查看第40节
版权声明:本文为博主原创文章,未经博主允许不得转载。