公园导游图数据结构课程设计.docx
《公园导游图数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《公园导游图数据结构课程设计.docx(21页珍藏版)》请在冰豆网上搜索。
![公园导游图数据结构课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/6/9c53029d-bbf2-4753-b253-150663ebd7ce/9c53029d-bbf2-4753-b253-150663ebd7ce1.gif)
公园导游图数据结构课程设计
课程名称:
数据结构
本科学生课程设计(论文)
题目公园导游图
摘要
随着中国经济不断的发展,城市发展的越来越好,越来越多的人融入了城市生活。
公园成为人们散心,娱乐的场所,公园也随即也在不断的扩张,变得越来越全面,但是这不利于逛公园的人寻找自己想要去的地方,尤其是对公园陌生的游客,更是不知道如何走,才能更好的游玩公园,达到的最好经济效益。
所以针对这种现象,为了方便游客,开发这么一款公园导游系统软件。
系统是用C语言实现,基于visualc++6.0开发的,采用图这么一种数据结构,采用邻接矩阵的存储方式,用一个二维数组来记录所有的边,为了实现地图的随时更新,采用了静态链表实现对图的接点的添加,删除。
本系统设计基于图的结构,创建一个无向图,针对游客的需求,将涉外公园的景点编号、名称、介绍等信息放入到图的顶点当中并保存景点文本文件中,将两个景点的编号和它们之间的距离当权值也保存在相同的文本文件中,利用迪杰特斯拉算法来求从一个景点到另一个景点的最短距离,利用Serach();查找景点,本显示他的信息,从而解决了要查找景点信息和两个景点之间的最短路径的问题,最后按照显示屏上的提示进行相关的操作。
关键词:
公园导游;图;邻接矩阵;二维数组;静态链
1.2求最短路径
给定一个带权有向图G=(V,E),其中每条边的权是一个非负实数。
另外,还给定V中的一个顶点,称为源。
现在我们要计算从源到所有其他各顶点的最短路径长度。
这里的长度是指路上各边权之和。
这个问题通常称为单源最短路径问题。
1.2.1单源最短路径问题
Dijkstra提出按各顶点与源点v间的路径长度的递增次序,生成到各顶点的最短路径的算法。
既先求出长度最短的一条最短路径,再参照它求出长度次短的一条最短路径,依次类推,直到从源点v到其它各顶点的最短路径全部求出为止。
1.3求最小生成树
对于连通的带权图(连通网)G,其生成树也是带权的。
生成树T各边的权值总和称为该树的权,记作:
Te,W(u,v)
TE表示T的边集
w(u,v)表示边(u,v)的权。
权最小的生成树称为G的最小生成树(MinimumSpanningTree)。
最小生成树可简记为MST。
最小生成树性质:
设G=(V,E)是一个连通网络,U是顶点集V的一个真子集。
若(u,v)是G中一条“一个端点在U中(例如:
u∈U),另一个端点不在U中的边(例如:
v∈V-U),且(u,v)具有最小权值,则一定存在G的一棵最小生成树包括此边(u,v)。
第一章前言
1.1课题的研究背景、要求和意义
现代公园范围的广阔,内容不断的增加,使得公园整个系统变得复杂。
使用电脑对游客进行导游成为发展的趋势,以达到更好的为游客服务的目的。
对于公园的游客来说,他们要求:
能够浏览整个公园的信息、查询每一个景点的信息、从任意景点遍历全部的景点、能够查找最短路径。
对于系统用户来说,他们要求:
删除地点、添加地点、添加路径、删除路径、保存修改、导入文件数据。
采用图这么一种数据结构,采用邻接表的存储方式,用一个二维数组来记录所有的边,为了实现地图的随时更新,采用了静态链表实现对图的接点的添加,删除。
应用文件的读写来进行文件操作。
查找最短路径采用迪杰特斯拉算法实现,从任意景点遍历全部的景点采用深度优先遍历实现。
对于界面设计,游客不能进行地图的修改,更换,所以首先要验证身份,再出现对应的界面。
1.2课题的目标、研究范围
实现的目标:
实现对某一个公园导游及地图的修改与更新的系统。
通过系统分析、系统设计、编程调试,写实验报告等环节,进一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解典型数据结构在软件开发中的应用。
综合运用数据结构课程中学到的几种典型数据结构,如链表,栈,队列,以及程序设计语言(C语言),自行实现一个较为完整的应用系统的设计与开发,对自己学过的知识进一步的加深理解,对数据结构的算法思想要有更深的理解。
图(Graph)是一种较线性表和树更为复杂的数据结构。
在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素(即其该子结点)相关,但只能和上一层中一个元素(即其双亲结点)相关,而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。
由此,图的应用极为广泛,特别是近年来的迅速发展,已渗入到诸如语言学、逻辑学、物理、化学、电讯工程、计算机科学以及数学的其他分支中。
1.3理论技术方案的选取
邻接矩阵存储结构对图的构造操作的实现框架,他根据图G的种类调用具体构造算法。
如果G是无向图,则构造一个具有n个顶点和e条边的无向网G的时间复杂度是O(n2+e*n),其中对邻接矩阵G.arcs的初始化耗费了O(n2)的时间。
这个存储结构上易于实现课题所需的基本操作,在建立邻接表或逆邻接表,时间复杂度为(n+e),需要通过查找才能得到顶点图中位置,时间复杂度为O(n*e)。
在邻接表上容易找到任一顶点的的第一个邻接点和下一邻接点,但要判定任意两个顶点(vi和vj)之间是否有边或弧相连,则需要搜索第i个或第j个链表,因此,不及邻接矩阵方便。
1.4研究方法
基于VisualC++6.0平台编程是当今程序者的青睐,它有着强大的性能、完全丰富的工具及高速的处理速度和完备的兼容性。
不仅可以简化编程的设计并且算法应用灵活,使应用程序的开发更为简便。
C++是为开发大型程序而研制的,它比C语言困难得多,它功能丰富、表达能力强、使用灵活方便、应用面广、目标程序效率高、可移植性好,既具有高级语言的优点,又具有低级语言的许多特点,完全适合于编写系统软件;本人就利用上述C++开发软件编写了《公园导游系统》,采用人机互动的操作模式,系统经过显示主界面功能,然后用户的需要操作。
1.5结构与安排
首先“前言”对研究背景和研究目的作了简单的介绍;其次“系统功能分析”对本系的说明和讲解;再次“总体设计”对本系统做了一个简要引导,并且通过“总体设计”对该系统的运行懂得差不多了;“详细设计”就是对系统有了详细的设计过程,更进一步知道设计原理;“排序算法的改进”介绍传统算法的不足,经过设想对原算法加以改进“系统实现”不但让我们知道了系统的界面和一些操作的实施,让你知道整个算法的设计并且加以理解。
第二章系统功能分析
2.1可行性分析
所谓可行性分析就是用最小的代价在尽可能短的时间内确定问题是否能够解决。
这步工作的主要是要进行一次大大压缩简化了的系统分析和设计的过程,也就是在较高层次上以比较抽象的方式进行系统分析和设计的过程。
可行性研究的最根本任务是对以后的行动方针提出建议,以避免时间、资源、人力和金钱的浪费,推荐一个较好的解决方案,并且为工程制定一个初步的计划。
2.1.1技术可行性
查找最短路径以及查询任意两景点之间的所有路径采用迪杰特斯拉算法或弗洛伊德算法实现。
解决这个问题的一个方法是:
每次以一个顶点为源点,重复执行迪杰斯特拉算法n次。
这样,便可求得每一对顶点之间的最短路径。
总的执行时间为O(n3)。
虽然弗洛伊德算法时间复杂度也是O(n3),但形式简单些。
从任意景点遍历全部的景点采用深度优先遍历或广度优先搜索遍历图实现。
所谓可行性分析就是用最小的代价在尽可能短的时间内确定问题是否能够解决。
这步工作的主要是要进行一次大大压缩简化了的系统分析和设计的过程,也就是在较高层次上以比较抽象的方式进行系统分析和设计的过程。
可行性研究的最根本任务是对以后的行动方针提出建议,以避免时间、资源、人力和金钱的浪费,推荐一个较好的解决方案,并且为工程制定一个初步的计划。
本系统采用人机操作进行管理,用visualC++6.0进行前台设计、系统随机产生数据,用户通过界面操作,系统自动给予合理分析,由于visualC++6.0功能强大、使用的灵活、良好的可扩展性、以及广泛实际应用,充分说明本系统在技术方面的可行性。
2.1.2工具可行性
软件方面:
信息时代对于软件的应用已不是人们的难题,人们在日常办公中用的计算机操作的系统等都属于软件部分。
硬件方面:
计算机普及到今天,人们对于它的拥有已不少见,它的硬件设备完全能够满足人们的需求,而价格也能被人们所接受。
2.1.3经济可行性
线在大多数的公园景点及内容不断的增多和丰富,这也就使得整个公园系统不得不建立的更大。
这也就为人们逛公园造成了很大的不便。
人们往往不熟悉公园,找个东西,或某处带来了极大的不便。
往往要花很多时间在这一方面。
然而要是有一个公园导游系统这将给乘客带来极大的方便,使人们一下就能了解到这个公园的大致的情况。
这是个超小型的性能分析系统,从投入的人力,财力与物力来讲是非常之小的,只要一台电脑,一台打印机,这个系统就可以搞起来,考虑到学校里有电脑,现只要购置一台打印机就可以了。
从节省人力方面,可以让管理人员从繁与复杂的工作中解脱出来,做更多的工作,可以给读者提高到更深的一个层次。
2.1.4操作可行性
本系统设计清晰,有良好的用户接口,操作简洁,完全可以给用户解决,并达到操作过程中的直观、方便、实用、安全等要求,因此操作方面具有可行性。
2.2需求分析
2.2.1功能需求
对于游客,系统功能需求如下:
能够浏览整个公园的信息、查询每一个景点的信息、从任意景点遍历全部的景点、能够查找最短路径。
对于系统后台操作功能需求如下:
删除地点、添加地点、添加路径、删除路径、保存修改、导入文件数据。
2.2.2输入输出的要求
程序执行是需要有描述地图的文件,并放在相应的位置。
文件中开始位置存放景点个数,图存在多少条边;接着是存放景点序号、名称、相关信息;对后是存放着各个景点之间的距离矩阵。
执行程序先要先要进行选择。
修改地图是要验证密码。
查找任意两个景点的最短路径时,输入查找最短路径的两个点。
运行各个小过程要求要输出的暂时的结果。
第三章总体设计
3.1程序模块
从文件中对出数据(Fprint-Link()):
通过调用Update(L,g),先将链表L的信息赋值给邻接数组g中,进行更新。
建立无向图,把公园的景点及景点的信息,连接起来建立邻接表采用链式加顺式存储。
浏览学校的全景(Browser):
列出学校的所有的景点。
寻找最佳路径(DFSTraverse:
):
输入一个景点,会吧所有都浏览一边,并找出最佳的路径。
最短路径(ShortPath):
求出起点和终点的最佳路径,并求出最佳路径的长度。
遍历出某一起点到终点的所有路径(SearchAllPath):
找出所有路径,利用深度优先遍历。
删除地点、添加地点、添加路径、删除路径、保存修改、导入文件数据。
对应代码函数如下:
DeleteAdv(L,g)、InsertAdv(L,g)、InsertEdge()、DeleteEdge()、SaveMap(g)、Loadnewmap(p,g)。
总体结构设计如图3-1所示。
图3-1系统框架图
3.2系统涉及的数据结构
3.2.1程序数据结构
程序主要用了图和静态链表两种数据结构,采用矩阵来保存图形结构的地图,用数组来保存遍历经过的结点用以遍历回溯,以及存储最最终路径。
图的抽象数据类型:
ADTGraph{
数据对象V:
V是具有相同特性的数据元素的集合,称为顶点集。
数据关系:
R={VR}
VR={|v,w∈v且P(v,w)表示从v到w的弧,谓词P(v,w)定义了弧的意义或信息}
基本操作P:
PrintMap(g)
Serach(g)
DFSTraverse(g)
ShortPath(g)。
}ADTGraph
线性链表的抽象数据类型:
ADTList{
数据对象:
D={ai|ai∈ElemSet,i=1,2,…,n,n≥0}
数据关系:
R1={|ai-1,ai∈D,i=2,…,n}
基本操作:
DeleteAdv(L,g)InsertAdv(L,g)
InsertEdge()DeleteEdge()
SaveMap(g)Loadnewmap(p,g)
}ADTList。
3.2.2具体数据类型定义
typedefstructLNode{
charname[30];
intnum;
charintroduction[100];
structLNode*next;
}LNode,*Link;
typedefstructArcNode
{intdata;//该弧所得指向的顶点的位置
ArcNode*nextarc;//指向下一条弧的指针
}ArcNode,*ArcLink;
typedefstructVNode//顶点信息
{charname[30];
intnum;
charintroduction[100];
ArcLinkfirstarc;//指向第一条依附该顶点的弧的指针
}VNode,AdjList[MAX+1];
typedefstructALGraph
{AdjListvdata;
intvexnum,arcnum;//图的顶点数和弧数
}ALGraph;
intEdge[MAX][MAX];//用来存放路径的权值
intn,e;//存放结点数和边数
读取文件信息代码如下:
for(i=1;i<=n;i++)
{fscanf(fp,"%d",&num);fscanf(fp,"%s",name);
fscanf(fp,"%s",information);
ListInsert(L,num,name,information);
}
Update(L,g);
for(j=1;j<=e;j++)//从文件中读入边的信息
{
fscanf(fp,"%d",&a);
fscanf(fp,"%d",&b);
fscanf(fp,"%d",&weight);
Edge[a][b]=weight;
Edge[b][a]=weight;
p=(ArcLink)malloc(sizeof(ArcNode));//为顶点申请空间
p->data=a;
p->nextarc=g[b].firstarc;
g[b].firstarc=p;//把p插进来
q=(ArcLink)malloc(sizeof(ArcNode));
q->data=b;
q->nextarc=g[a].firstarc;
g[a].firstarc=q;
第四章详细设计
4.1创建图(Fprint-Link)
从文件中读出数据,函数流程图4-1所示。
图4-1Fprint-Link函数流程图
4.2寻找最佳路径(DFSTraverse)
利用深度优先的思想,遍历图找出一条最佳最佳的的路径,让它遍历所有景点。
利用递归的思想,往下遍历,访问标志位,若访问过在下次就不用访问。
若找完一个分支在下次重新遍历,函数流程如图4-2所示。
图4-2寻找最佳路径流程图
4.3最短路径(ShortPath)
利用迪杰特斯拉算法,求v0到其余顶点的最短路径path[],distance[]是用来存放各路径的权值,借助辅助数组s[]标志,是否当前顶点属于S(1,属于)函数流程
图4-3所示。
图4-3寻找最短路径流程图
4.4遍历出某一起点到终点的所有路径(SearchAllPath)
利用图的深度优先遍历,利用访问标志位。
path[]记录路径,visited[]设访问标志,v起点,des终点,length,代表的是访问景点的长度。
若碰见死路或者不同的路,则从上一个景点,从新扫描,searchAllPath()流程如图4-4所示。
图4-4searchAllPath()流程图
4.5导入新文件(Loadnewmap)
将指定文件导入到邻接表中,再保存到zheke1.txt中,
具体实现如图4-5所示。
图4-5导入新文件结构示图
第五章系统实现
5.1程序执行之前的准备
首先在zheke1.txt中保存内容图5-1所示
图5-1涉外公园简图
在zheke2.txt中保存内容图5-2所示
图5-2城市连通图
5.2主界面
表5-1主界面
5.3游客界面
表5-2游客界面
5.4系统用户界面
表5-3系统用户登录界面
表5-4系统用户界面
5.5浏览公园全景简图
表5-5涉外公园简图表5-6详细信息表
5.6寻找某一起点的最佳路径和指定起点、终点的最短路径
表5-7查询最佳路径
表5-8查询最短路径
5.7寻找指定起点、终点的所有路径
表5-9输入两点之间的所有路径
5.8删除,添加结点,保存和导入新地图
表5-10删除结点
表5-10导入新的地图
第六章解决的关键问题
6.1如何实现寻找最短路径功能
我在网上查了很多资料,在考虑好用邻接表做系统后,我一直在寻找一种合适的算法来实现查找最短路径的功能。
最终我决定采用迪杰特斯拉算法。
解决了这一难题。
6.2如何实现深度优先搜索
系统采用一个数组来做访问过的标记,如果正在访问结点的下一个结点没有访问,就采用函数的递归来实现深度优先搜索。
6.3如何修改地图
通过对链表中结点的修改,就能对邻接表中结点的修改,在删除结点时,通过将后面结点的边信息将次结点的信息覆盖,即Edge[i][j]=Edge[i+1][j];Edge[i][j]=Edge[i+1][j];至于边的添加与删除,直接修改Eage[][]的值即可
6.4如何导入其他文件信息
导入其他文件时,老是出错,困扰了我很久,后来我通过一个一个程序测试,终于找到了问题所在,当再导入文件信息时,我用到的还是原来那个链表指针,于是我又新建了一个链表,将文件信息导入到这个新的链表中,然后将原来链表的头指针指向它,问题得以解决。
第七章结论
通过努力,公园导游系统最后完成,这个系统能够提高公园的服务质量,能够快速的查询景点信息,大大的方便了游客,还能便于公园信息的更新。
但是此系统只能查询一个大的地点,不能查找的详细的位置,边的不能更好的描述等等。
系统还可以添加跟多使用的功能,比如说:
“查询票的信息功能、验票、由大地点查询更具体的位置”等等,这些都是值得去研究的。
系统存在问题:
当导入新文件导入时,原来的链表内存没有释放
结束语
这次课程设计让我学到了很多,课程设计开始之前,我看了别做的系统,认真的分析了别人的代码,当我弄懂了迪杰特斯拉算法和弗洛伊德算法时,我就开始编写自己的系统。
我想再添加一些新的功能,但是这两周下来我当然也感到累,也有心情烦躁的时候,体会到调试成功使的那种喜悦。
课程设计之前老师让我们自己先将设计思路写好,都做了哪些模块,第一天要检查。
我当时是在电脑上写了,那天下午编了一下午,没什么成就弄得我很心烦第二天老师检查时我什麽都没有看到同学的程序我开始着急了,但那会我只有一个念头我得从新开始,由于对图不是很了解,我就从读写模块开始,就使用简单的C语知识,那天早上将那两个模块给拿下了。
下机后我在寝室开始编程,开始进入真正的图部分,边思考怎样可以将它们联系起来,边进行调试。
对编程兴趣很浓,直到晚上十点我已经将老师的要求完成差不多。
这些日子是很辛苦,但我学到了很多东西,和同学一起分享调试成功的那种喜悦,我完成的早,同学有问题会让我帮助,在帮他们的过程中我也学会了很多种不同的思想,让我对图有了更深刻的理解。
参考文献
[1]耿国华.数据结构-c语言描述[M].北京:
高等教育出版社,1998.56~82.
[2]吴伟民,严蔚敏.数据结构(c语言版)[M].北京:
清华大学出版社,1997.41~42.
毕业设计(论文)原创性声明和使用授权说明
原创性声明
本人郑重承诺:
所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:
日 期:
指导教师签名:
日 期:
使用授权说明
本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:
按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:
日 期:
学位论文原创性声明
本人郑重声明:
所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:
日期:
年月日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:
日期:
年月日
导师签名:
日期:
年月日
注意事项
1.设计(论文)的内容包括:
1)封面(按教务处制定的标准封面格式制作)
2)原创性声明
3)中文摘要(300字左右)、关键词
4)外文摘要、关键词
5)目次页(附件不统一编入)
6)论文主体部分:
引言(或绪论)、正文、结论
7)参考文献
8)致谢
9)附录(对论文支持必要时)
2.论文字数要求:
理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
3.附件包括:
任务书、开题报告、外文译文、译文原文(复印件)。
4.文字、图表要求:
1)文字通顺,语言流畅,书写字迹工整,打印字体及大小符合要求,无错别字,不准请他人代写
2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准规范。
图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画
3)毕业论文须用A4单面打印,论文50页以上的双面打印
4)图表应绘制于无格子的页面上
5)软件工程类课题应有程序清单,并提供电子文档
5.装订顺序
1)设计(论文)
2)附件:
按照任务书、开题报告、外文译文、译文原文(复印件)次序装订
3)其它