图的广度深度优先遍历课程设计.docx

上传人:b****8 文档编号:9613455 上传时间:2023-02-05 格式:DOCX 页数:16 大小:311.32KB
下载 相关 举报
图的广度深度优先遍历课程设计.docx_第1页
第1页 / 共16页
图的广度深度优先遍历课程设计.docx_第2页
第2页 / 共16页
图的广度深度优先遍历课程设计.docx_第3页
第3页 / 共16页
图的广度深度优先遍历课程设计.docx_第4页
第4页 / 共16页
图的广度深度优先遍历课程设计.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

图的广度深度优先遍历课程设计.docx

《图的广度深度优先遍历课程设计.docx》由会员分享,可在线阅读,更多相关《图的广度深度优先遍历课程设计.docx(16页珍藏版)》请在冰豆网上搜索。

图的广度深度优先遍历课程设计.docx

图的广度深度优先遍历课程设计

长沙理工大学

《数据结构》课程设计报告

图的广度深度优先遍历

钱学帅

 

学院运算机与通信工程专业网络工程

班级网络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;k

scanf("%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;k

scanf("%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);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1