图的广度深度优先遍历课程设计.docx
《图的广度深度优先遍历课程设计.docx》由会员分享,可在线阅读,更多相关《图的广度深度优先遍历课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
![图的广度深度优先遍历课程设计.docx](https://file1.bdocx.com/fileroot1/2023-2/4/e7f9939d-1dd5-413e-a2ca-5cb1378fe88f/e7f9939d-1dd5-413e-a2ca-5cb1378fe88f1.gif)
图的广度深度优先遍历课程设计
长沙理工大学
《数据结构》课程设计报告
图的广度深度优先遍历
钱学帅
学院运算机与通信工程专业网络工程
班级网络07-1学号04
学生姓名钱学帅指导教师陈倩诒
课程成绩完成日期2020年3月12日
、
课程设计成绩评定
学院运算机与通信工程专业网络工程
班级网络01-1学号0104
学生姓名钱学帅指导教师陈倩诒
完成日期
指导教师对学生在课程设计中的评判
评分项目
优
良
中
及格
不及格
课程设计中的创造性成果
学生掌握课程内容的程度
课程设计完成情况
课程设计动手能力
文字表达
学习态度
规范要求
课程设计论文的质量
指导教师对课程设计的评定意见
综合成绩指导教师签字2009年3月12日
课程设计任务书
运算机与通信工程学院网络工程专业
课程名称
数据结构课程设计
时间
2008~2009学年第2学期1~2周
学生姓名
钱学帅
指导老师
陈倩诒
题目
图的广度深度优先遍历
主要内容:
在图的邻接表存储结构下
(1)图的广度优先遍历
(2)图的深度优先遍历
要求:
(1)通过实际项目的分析、设计、编码、测试等工作,掌握用C语言来开发和维护软件。
(2)按要求编写课程设计报告书,能正确编写分析、设计、编码、测试等技术文档和用户使用手册。
应当提交的文件:
(1)课程设计学年论文。
(2)课程设计附件(主要是源程序)。
图的广度深度优先遍历
学生姓名:
钱学帅指导教师:
陈倩诒
摘要咱们希望从图中某一极点动身访遍图中其余各极点,且使每一极点仅被访问一次,那个进程就叫图的遍历。
而图的深度优先遍历类似与树的先根遍历,是树的先根遍历的推行,图的广度优先遍历是类似于树的按层次遍历的进程。
图的遍历进程实质上确实是通过边或弧找邻接点的进程。
在这,咱们要紧确实是介绍遍历图的两种大体方式:
深度优先搜索和广度优先搜索。
这两种方式不管是有向图仍是有向图都适用。
广度优先搜索遍历图和深度优先搜索遍历图的时刻复杂度相同,二者不同的地方仅仅在于对极点访问的顺序不同。
关键词图的遍历;广度优先遍历;深度优先遍历;
1引言…………………………………………………………………………………………1
2设计思路与方案……………………………………………………………………………2
设计思路…………………………………………………………………………………2
设计方案…………………………………………………………………………………2
3详细实现………………………………………………………………………………………4
3.1队列的概念及相关操作…………………………………………………………………4
3.2图的邻接表存储结构的概念及无向图的成立…………………………………………5
3.3图的深度优先遍历算法…………………………………………………………………6
3.4图的广度优先遍历非递归算法…………………………………………………………7
4运行环境与结果……………………………………………………………………………8
运行环境………………………………………………………………………………8
运行结果………………………………………………………………………………9
5终止语…………………………………………………………………………………………12
参考文献………………………………………………………………………………………13
附录……………………………………………………………………………………………14
1引言
图的遍历算法是求解图的连通性问题,拓扑排序和求关键途径等算法的基础。
但是,图的遍历要比树的遍历复杂的多。
因为图的任何一极点都有可能和其余的极点相邻接。
因此在访问了某个极点以后,可能沿着某条途径搜索以后,又回到该点是行。
为了幸免同一极点被访问多次,在图的遍历进程中,必需先记下每一个已访问的极点。
在次介绍两种对有向图和无向图都适用的遍历图的途径:
深度优先搜索和广度优先搜索。
在这次设计中,用到的最多的队列,图的深度优先遍历类似于树的前序遍历。
采纳的遍历方式的特点是尽可能先对纵深方向进行搜索。
广度优先遍历类似于树的按层次遍历。
采纳的搜索方式的特点是尽可能先对横向进行搜索,鼓称其为广度优先搜索,相应的遍历称为广度优先遍历。
通过课程设计,咱们会熟悉自身存在的很多问题,也有利于提高咱们的动手能力,也把咱们所学的东西和实践专门好的结合起来,在这次设计中,再次体会了队列,深度优先搜索,广度优先搜索,等数据结构中的大体算法及其原理。
2设计思路与方案
设计思路
在遍历图时,对图中每一个极点最多调用一次DFS函数,因为一旦某个极点被标志成已被访问,就再也不从它动身进行搜索。
因此,遍历图的进程事实上确实是对每一个极点查找其临界点的进程。
其花费的时刻那么取决与所采纳的存储结构。
当用二维数组表示邻接作图的存储结构时,查找每一个极点的临界点所需的时刻为0(n2),其中n为图中极点数。
而当以邻接表作图的存储结构时,找邻接点所需要的时刻为0(e),其中e为无向图中边的数或有向图中弧的数。
遍历图的进程实质上是通过边或弧找邻接点的进程,因此广度优先搜索遍历图的时刻复杂度和深度优先遍历相同,二者不同的地方仅仅在于对极点的访问的顺序不同。
设计方案
(1)图的深度优先遍历:
假设初始状态是图中所有的饿点不曾被访问,那么深度优先搜索可从图中某个极点V动身,访问此极点,然后依次从V的未被访问的邻接点动身深度优先遍历图,直至图中所有和V有途径相通的极点都被访问到,假设现在图中尚有极点未被访问,那么另选图中一个不曾被访问的的极点起作起始点,重复上述进程,直至图中所有极点都被访问到为止。
(2)图的广度优先遍历:
假设从图中某极点V动身,在访问了V以后依次访问V的各个不曾被访问过的邻接点,然后别离从这些邻接点动身依次访问它们的邻接点,并使“先被访问的极点的邻接点”先于“后被访问的极点的邻接点”被访问,直至图中所有已被访问的极点的邻接点都被访问到。
假设现在图中尚有极点未被访问,那么另选一个不曾被访问的极点作起始点,重复上述进程,直至图中所有极点都被访问为止。
3详细实现
3.1队列的概念及相关操作
为确保先访问的极点其邻接点亦先被访问,在搜索进程中利用FIFO队列来保留已访问过的极点。
当访问X和Y时,这两个极点接踵入队。
尔后,当X和Y接踵出队时,别离从X和Y动身搜索其邻接点X1,X2,……XS和Y1Y2……YT,对其中未访问者进行访问并将其入队,这种方式是将每一个已访问的极点入队,故保证了每一个极点最多只有一次入队。
因此用队列。
typedefstruct{ata)break;}
returni;
}
statusCreateAL2(ALGraph*G){ata);
G->vertices[m].firstarc=NULL;}
printf("请输入边,即一条边的两极点:
");
for(k=1;kscanf("%d%d",&vt,&vh);
i=locatevex(G,vt);j=locatevex(G,vh);
p=(ArcNode*)malloc(sizeof(ArcNode));irstarc;G->vertices[i].firstarc=p;
q=(ArcNode*)malloc(sizeof(ArcNode));irstarc;G->vertices[j].firstarc=q;
}
returnOK;
}
3.3图的深度优先遍历算法
从图中的某个极点vi动身,先访问该极点vi,然后依次从vi的未被访问过的邻接点动身执行深度优先遍历算法;直至图中所有和vi有途径相通的极点都被访问到为止。
假设现在图中还有未被访问到的极点(即非连通图的情形),那么再选图中一个未被访问过的极点vj作为起点重复上述进程,直至图中所有极点均被访问过为止。
intFirstAdjVex(ALGraphG,inti){irstarc;
if(p)j=p->adjvex;
elsej=-1;
returnj;
}
intNextAdjVex(ALGraphG,inti,intj){irstarc;
while((p)&&(p->adjvex!
=j))
p=p->nextarc;
p=p->nextarc;
if(p)returnp->adjvex;
elsereturn-1;
}
intvisited[100];ata);ata);
EnQueue(Q,v);ata);EnQueue(Q,w);}
}ET(VisualC++,但它的应用的专门大的局限性,只适用于Windows2000,WindowsXP和Windows。
因此实际中,更多的是以VisualC++为平台。
VisualC++是Microsoft公司推出的目前利用最普遍的基于Windows平台的可视化编程环境。
VisualC++是在以往版本不断更新的基础上形成的,由于其功能壮大,灵活性好,完全课扩展和具有壮大的Internet支持,因此在各类C++语言开发工具中脱颖而出,成为目前最为流行的C++语言集成开发环境。
VisualC++秉承VisualC++以前版本的优良特性,为用户提供了一套良好的可视化开发环境:
要紧包括文本编辑器、资源编辑器、工程创建工具、Debugger调试器等等。
用户能够在集成开发环境中创建工程、感动工程、成立、打开和编辑文件、编译、链接、运行、调试应用程序。
.运行结果
.1成立一个图,如图4-1
成立一个极点数为11,弧数为12的图,用该图来举例说明该程序的可行性。
图4-1
2打开VC++中文版,如图4-2所示。
图4-2VC++的工作界面
3,检测以后没错误,运行得图4-3
图4-3程序开始运行
程序提示“请先输入极点和边数”,极点数与边数之间用空格各开,按Enter输入
.4输入图4-4所示的极点和弧
图4-4输入极点和弧别离为1112
程序提示“请输入极点值”,每输入一个值,按Enter输入,如以下图。
5各结点的输入
图4-5输入结点
图4-6输入边得结果
输入边后按Enter,显示深度与广度遍历序列
5终止语
这次的课程设计的内容是以邻接矩阵的方式确信一个图,完成:
⑴成立并显示出它的代码我已经找到邻接链表;⑵给出某一确信极点到所有其它极点的最短途径;,这对我来讲是个很具有挑战性的任务,尽管做的不是专门好,但通过两个礼拜的设计也从中学到了很多东西,更深刻的明白得了讲义中的内容。
《数据结构》是一门实践性较强的课程,为了学好这门课程,必需在把握理论知识的同时,增强上机实践。
同时再次深刻明白得了C语言的有效,文件的概念和相关操作,单链表和顺序表在时刻性能及空间性能方面的优缺点。
依如实际问题的需要,对个方面的优缺点加以综合平稳,从当选择比较适宜的实现方式。
在本次课程设计中,我明白了理论与实际相结合的重要性,并提高了自己组织数据及编写程序的能力,培育了大体的,良好的程序设计技术。
提高综合运用所学知识的能力。
在这次课程设计中曾碰到了很多问题,就单凭我一个人的能力很难准时有效的完成这次的课程设计,因此在网上找了很资料,而且也认真的请教了同窗。
同窗们也很热心,超级感激他们,也因此增强了和同窗们的情感。
再次感激我的指导教师,陈倩诒教师。
陈教师对工作认真负责,耐心辅导,知识丰硕。
在这次课程设计中给了我专门大的帮忙。
她严谨的治学精神和深厚的理论水平都使我获益非浅。
参考文献
[1]王红梅,胡明,王涛.数据结构(C++版).北京:
清华大学出版社,2007
[2]王红梅,胡明,王涛.数据结构(C++版)学习辅导与实验指导.北京:
清华大学出版,2007
[3]严蔚敏,吴伟民数据结构(C语言版).清华大学出版社2020
[4]郑阿奇,丁有和.VisualC++教程.北京:
机械工业出版社,2006
附录:
源程序代码
defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineOVERFLOW-2
#defineNULL0
typedefintstatus;
#include<>
#include<>
#include<>
#defineMAX_VERTEX_NUM20
#defineMAXQSIZE100
typedefstruct{
int*base;
intfront;
intrear;
}SqQueue;
intInitQueue(SqQueue*Q){ata)break;}
returni;
}
statusCreateAL2(ALGraph*G){
intn,e,i,j,k,vt,vh,m;ArcNode*p,*q;
printf("请前后输入极点数和边数:
");
scanf("%d%d",&G->vexnum,&G->arcnum);
n=G->vexnum;e=G->arcnum;G->kind=2;
printf("请输入极点值:
");
for(m=0;mvertices[m].data);
G->vertices[m].firstarc=NULL;}
printf("请输入边,即一条边的两极点:
");
for(k=1;kscanf("%d%d",&vt,&vh);
i=locatevex(G,vt);j=locatevex(G,vh);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;p->nextarc=G->vertices[i].firstarc;G->vertices[i].firstarc=p;
q=(ArcNode*)malloc(sizeof(ArcNode));
q->adjvex=i;q->nextarc=G->vertices[j].firstarc;G->vertices[j].firstarc=q;
}
returnOK;
}
intFirstAdjVex(ALGraphG,inti){
intj;
ArcNode*p=[i].firstarc;
if(p)j=p->adjvex;
elsej=-1;
returnj;
}
intNextAdjVex(ALGraphG,inti,intj){
ArcNode*p=[i].firstarc;
while((p)&&(p->adjvex!
=j))
p=p->nextarc;
p=p->nextarc;
if(p)returnp->adjvex;
elsereturn-1;
}
intvisited[100];
intDFS(ALGraphG,inti){
intj;
visited[i]=TRUE;
printf("%d",[i].data);ata);
EnQueue(Q,v);
while(!
QueueEmpty(Q)){
DeQueue(Q,v);
for(w=FirstAdjVex(G,v);w!
=-1;w=NextAdjVex(G,v,w))
if(!
visited[w])
{visited[w]=TRUE;printf("%d",[w].data);EnQueue(Q,w);}
}//while
}//if
}//BFStraverse
voidmain(){
ALGraphG;
CreateAL2(&G);
printf("深度遍历:
");
DFStraverse(G);
printf("广度遍历:
");
BFStraverse(G);
}