- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
图的广度优先遍历C
西北师范大学地环学院地理信息系 数据结构实验讲义 十一 图的广度优先遍历 张长城 2011-2-8
[图存储以及深度优先遍历算法分析,C语言实现]
实验任务描述
1 分析广度优先遍历算法;
2 用C语言实现图的广度优先遍历。
邻接矩阵存储图的广度优先遍历过程分析
对图1这样的无向图,要写成邻接矩阵,则就是下面的式子
图 1
顶点矩阵:V= 弧长矩阵: A=
一般要计算这样的问题,画成表格来处理是相当方便的事情,实际中计算机处理问题,也根本不知道所谓矩阵是什么,所以画成表格很容易帮助我们完成后面的编程任务。在我们前面介绍的内容中,有不少是借助着表格完成计算任务的,如Huffman树。
V1(1) V2(2) V3(3) V4(4) V5(5) V6(6) V7(7) V8(8) V1 (1) 0 1 1 0 0 0 0 0 V2 (2) 1 0 0 1 1 0 0 0 V3 (3) 1 0 0 0 0 1 1 0 V4 (4) 0 1 0 0 0 0 0 1 V5 (5) 0 1 0 0 0 0 0 1 V6 (6) 0 0 1 0 0 0 1 0 V7 (7) 0 0 1 0 0 1 0 0 V8 (8) 0 0 0 1 1 0 0 0 表1 图1的邻接矩阵表 为了记录那些顶点是已经走过的,还要设计一个表来标记已经走过的顶点,在开始,我们假设未走过的是0,走过的是1,于是有:
V1 V2 V3 V4 V5 V6 V7 V8 0 0 0 0 0 0 0 0 表2 图1的顶点访问表Visited 对广度优先遍历,还需要补充一个队列、来记录一个顶点可以抵达到的其他顶点。
广度优先遍历过程如下:
图 2 图1的图广度优先遍历过程图解
二、结果分析
从上面的过程可以看出:仅仅就顶点访问到的次序而言,图1的广度优先遍历结果是:
V1->V2->V3>V4->V5->V6->7->V8
但实际执行过程中我们可以发现:所谓图的广度优先遍历、其结果应该是一个树:
图 3 广度优先遍历生成树
在C语言中,显示这个结果并不容易,所以大多C语言的教材中并不会给出这样的结果。
三、C语言实现队列编程
根据上面的分析,我们可以知道:要广度优先遍历图,首先要一个队列系统。
队列在C语言上只能自己构造,好在我们前面有链表、有顺序表,我们可以复制过来一个链表程序构造一个队列,于是从链表程序中复制过来b5.c或者b6.c即可,我们分析队列的ADT可知,最需要的队列功能需求是:
QueueInit()、EnQueue、DeQueue()、QueueEmpty()这4个函数,于是有以下队列定义:
1
2
3
4
5 struct Queue
{
struct LinkedList * LinkQueue;
int Count;
}; 表3 为广度优先遍历图准备队列 见B0.c 由于我们已经确定使用链表做队列,所以队列实际就是链表的换名包装,所以我们可以理解为队列就是链表的另一种应用,表3的程序就是这样的做法,所以对队列的初始化,就是:
1
2
3
4
5
6
7
8 struct Queue * QueueInit()
{
struct Queue *q;
q=(struct Queue *)malloc(sizeof(struct Queue));
q->LinkQueue=LinkedListInit();
q->Count=0;
return q;
} 表4 队列初始化函数 见B0.c 有了队列的初始化,则进入队列、实际相当于给这个链表追加一条记录,就是Append()的另类包装:
1
2
3
4
5
6
7
8 int EnQueue(struct Queue *Q,struct ElemType *E)
{
if(Q==NULL) return -1;
if(E==NULL) return -2;
Append(Q->LinkQueue,E);
Q->Count++;
return 0;
} 表5 数据E进入队列,见B0.c 注意数据出队列,出队列总是把链表中第一个结点的数据给出来、并删除第一个结点,所以出队列就是:
1
2
3
4
5
6
7
8
9
10
11 int DeQueue(struct Queue *Q,struct ElemType *E)
{
struct ElemType *pE;
if(Q==NULL) return -1;
if(E==NULL) return -2;
pE=LinkedListGet(Q->LinkQueue,1);
ElemCopy(pE,E);
LinkedListDel(
您可能关注的文档
- 古镇商业化利弊.doc
- 可引起低血钾的常见药物.doc
- 可降解母粒在我国的研究进展MicrosoftOfficeWord文档.doc
- 可加密三维地震勘探技术研究-(6-27).docx
- 可靠性问答.docx
- 台湾PDCA(模板).doc
- 台安CU-18交流控制电压接触器.doc
- 叶绿体表达载体--如何构建载体.doc
- 各种_饮食指导单_营养指导.doc
- 各种供热方式对比.doc
- 信达证券-航空运输行业2023年报及2024年一季报总结:民航出行回暖,航司业绩修复可期.pdf
- 长江证券-计算机行业2023年报及2024年一季报综述-总体需求承压,优选A等结构增强.pdf
- 光大证券-中科星图-688568-投资价值分析报告:天眼感知世界星图映像万物.pdf
- 浙商证券-创新药2023-2024Q1业绩综述:政策催化,边际向上.pdf
- 中泰证券-中文在线-300364-数字文化开创者代表AI赋能IP生态持续拓展.pdf
- 东方证券-汽车行业1季度经营分析及投资策略:乘用车分化,商用车及部分零部件公司盈利改善明显.pdf
- 广发证券-电梯行业深度报告-后市场风起云涌时,结构转换的变革与机遇.pdf
- 国联证券-2024Q1-2023A轻工板块财报综述:盈利修复明显,外销增速可观.pdf
- 国盛证券-基本面高频数据跟踪:工业品价格继续回升.pdf
- 民生证券-汽车行业系列深度三:2023Q4-2024Q1:业绩整体向好自主向上可期.pdf
文档评论(0)