ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:187.06KB ,
资源ID:3554621      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3554621.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构课程设计.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构课程设计.docx

1、数据结构课程设计信息科学与工程学院课 程 设 计 任 务 书 题 目: 交通咨询系统设计 学 号: 201112220141 姓 名: 年 级: 专 业: 计算机应用与技术课 程: 数据结构 指导教师: 职 称: 完成时间: 课程设计任务书及成绩评定课程设计的任务和具体要求 设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一城市顶点之间的最短路径(里程)或最低花费或最少时间等问题。对于不同的咨询要求,可输入城市间的路程或所需时间或所需费用。 本设计共分三部分,一是建立交通网络图的存储结构;二是解决单源最短路径问题;三是实现任两个城市顶点之间的最短路径问题。 指导教师签字: 日期: 指导教

2、师评语: 成绩: 指导教师签字: 日期: 课程设计所需软件、硬件等 PC兼容机、Windows操作系统、Turbo C/Win t、Vc+软件等。课 程 设 计 进 度 计 划起止日期 工作内容 备注 参考文献、资料索引(序号、文献名称、编著者、出版单位)数据结构(C语言版) 编著 严蔚敏 吴伟民 清华大学出版社 1997 数据结构 中国石油大学出版社 一、需求分析设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一城市顶点之间的最短路径(里程)或最低花费或最少时间等问题。对于不同的咨询要求,可输入城市间的路程或所需时间或所需费用。本设计共分三部分,一是建立交通网络图的存储结构;二是解决单

3、源最短路径问题;三是实现任两个城市顶点之间的最短路径问题。1.1.1建立图的存储结构邻接矩阵是表示图形中顶点之间相邻关系的矩阵。图的邻接矩阵是定义如下的n阶方阵:设G=(V,E)是一个图,结点集为。G的邻接矩阵 当邻接矩阵的行表头、列表头顺序一定时,一个图的邻接矩阵表示是唯一的。图的邻接矩阵表示,除了需用一个二维数组存储顶点之间的相邻关系的邻接矩阵外,通常还需要使用一个具有n个元素的一维数组来存储顶点信息,其中下标为i的元素存储顶点i的信息。因此,图的邻接矩阵的存储结构定义如下:#definf MVNum 50 /最大顶点数typedef struct VertexType vexsMVNum

4、; /顶点数组,类型假定为char型 Adjmatrix arcsMVNumMVNum; /邻接矩阵,假定为int型MGraph;1.1.2 单源最短路径最短路径的提法很多。在这里先讨论单源最短路径问题:即已知有向图(带权),我们希望找出从某个源点SV到G中其余各顶点的最短路径。为了叙述方便,我们把路径上的开始点称为源点,路径的最后一个顶点为终点。那么,如何求得给定有向图的单源最短路径呢?迪杰斯特拉(Dijkstra)提出按路径长度递增产生诸点的最短路径算法,称之为迪杰斯特拉算法。迪杰斯特拉算法求最短路径的实现思想是:设G=(V,E)是一个有向图,结点集为,cost是表示G的邻接矩阵,cost

5、ij表示有向边的权。若不存在有向边,则costij的权为无穷大(这里取值为32767)。设S是一个集合,其中的每个元素表示一个顶点,从源点到这些顶点的最短距离已经求出。设顶点v1为源点,集合S的初态只包含一个元素,即顶点v1。数组dist记录从源点到其他顶点当前的最短距离,其初值为disti=costv1i,i=1,2,n。从S之外的顶点集合V-S中选出一个顶点w,使distw的值最小。于是从源点到达w只通过S中顶点,把w加入集合S中,调整dist中记录的从源点到V-S中每个顶点v的距离:从原来的distv和distw+costwv中选择较小的值作为新的distv。重复上述过程,直到V-S为空

6、。最终结果是:S记录了从源点到该顶点存在最短路径的顶点集合,数组dist记录了源点到V中其余各顶点之间的最短路径,path是最短路径的路径数组,其中pathi表示从源点到顶点i之间的最短路径的前驱顶点。因此,迪杰斯特拉算法可用自然语言描述如下:初始化S和D,置空最短路径终点集,置初始的最短路径值;Sv1=TRUE; Dv1=0; /S集初始时只有源点,源点到源点的距离为0;While (S集中顶点数n)开始循环,每次求得v1到某个v顶点的最短路径,并加v到S集中;Sv=TRUE;更新当前最短路径及距离; 1.1.3 任意一对顶点间最短路径任意一对顶点间最短路径问题,是对于给定的有向网络图G=(

7、V,E),要对G中任意一对顶点有序对“v,w(vw)”,找出v到w的最短路径。要解决这个问题,我们可以依次把有向网络图中每个顶点作为源点,重复执行前面讨论的迪杰斯特拉算法n次,即可以求得每对顶点之间的最短路径。这里还可以用另外一种方法,称作费洛伊德(Floyd)算法。费洛伊德(Floyd)算法算法的基本思想是:假设求从顶点 vi到vj的最短路径。如果从vi到vj存在一条长度为arcsij的路径,该路径不一定是最短路径,还需要进行n次试探。首先考虑路径和是否存在。如果存在,则比较和的路径长度,取长度较短者为当前所求得的最短路径。该路径是中间顶点序号不大于1的最短路径。其次,考虑从vi到vj是否包

8、含有顶点v2为中间顶点的路径,若没有,则说明从vi到vj的当前最短路径就是前一步求出的;若有,那么可分解为和,而这两条路径是前一次找到的中间顶点序号不大于1的最短路径,将这两条路径长度相加就得到路径的长度。将该长度与前一次中求出的从vi到vj的中间顶点序号不大于1的最短路径比较,取其长度较短者作为当前求得的从vi到vj的中间顶点序号不大于2的最短路径。依此类推,直到顶点vn加入当前从vi到vj的最短路径后,选出从vi到vj的中间顶点序号不大于n的最短路径为止。由于图G中顶点序号不大于n,所以vi到vj的中间顶点序号不大于n的最短路径,已考虑了所有顶点作为中间顶点的可能性,因此,它就是vi到vj

9、的最短路径。1.2 程序流程图二、详细设计2.1 建立有向图的存储结构 void CreateMGraph(MGraph * G,int n,int e) int i,j,k,w; for(i=1;ivexsi=(char)i; for(i=1;i=n;i+) for(j=1;jarcsij=Maxint; printf(输入%d条边的i,j及w:n,e); for(k=1;karcsij=w; printf(有向图建立完毕n);2.2迪杰斯特拉算法void Dijkstra(MGraph *G,int v1,int n)int D2MVNum,P2MVNum;int v,i,w,min;en

10、um boolean SMVNum;for(v=1;varcsv1v; if(D2vMaxint) P2v=v1; else P2v=0; D2v1=0;Sv1=TRUE;for(i=2;in;i+) min=Maxint; for(w=1;w=n;w+) if(!Sw&D2wmin) v=w;min=D2w; Sv=TRUE; for(w=1;warcsvwarcsvw; P2w=v; printf(路径长度 路径n); for(i=1;i=n;i+) printf(%5d,D2i); printf(%5d,i);v=P2i; while(v!=0) printf(-%d,v); v=P2v

11、; printf(n); 2.3 费洛伊德算法void Floyd(MGraph *G,int n) int i,j,k,v,w; for(i=1;i=n;i+) for(j=1;jarcsij!=Maxint) Pij=j; else Pij=0; Dij=G-arcsij; for(k=1;k=n;k+) for(i=1;i=n;i+) for(j=1;j=n;j+) if(Dik+DkjDij) Dij=Dik+Dkj; Pij=Pik; 2.4 运行主控程序void main() MGraph *G; int m,n,e,v,w,k; int xz=1; G=(MGraph *)mal

12、loc(sizeof(MGraph); printf(输入图中顶点个数和边数n,e:); scanf(%d,%d,&n,&e); CreateMGraph(G,n,e); while (xz!=0) printf(*求城市间的最短路径*n); printf(1.求一个城市到所有城市的最短路径n); printf(“2.求任意的两个城市之间的最短路径n); printf( 请选择:1 或 2,选择 0 退出:); scanf(%d,&xz); if(xz=2) Floyd(G,n); printf(输入起点和终点:v,w:); scanf(%d,%d,&v,&w); k=Pvw; if(k=0)

13、 printf(顶点 %d 到 %d 无路径!n,v,w); else printf(从顶点%d到%d的最短路径是:%d,v,w,v); while(k!=w) printf(%d,k); k=Pkw; printf(%d,w); printf(路径长度:%dn,Dvw); else if(xz=1) printf(求单源路径,输入源点 v :); scanf(%d,&v); Dijkstra(G,v,n); printf(结束求最短路径);三、调试分析编译: 在第一次编译时出现了很多错误,是因为我对C语言的不熟练,比如调用费洛伊德算法时出现了调用的错误,找了好久,才改正过来,还有就是for语

14、句的运用,由于本次程序要用很多for循环,我把一次for循环放到了上面for循环中,导致程序不能正确输出结果。最后把调到外面才OK。四、测试结果交通咨询系统通过迪杰斯特拉算法得出每一个城市到所有城市的最短路径,然后通过费洛伊德算法得出任意两个城市间最短路径。 本程序的运行环境为DOS操作系统,执行文件为 交通咨询.exe。进入程序后,即显示文本的操作界面:输入定点数和边数后,依次输入有向边,以及两点间的距离,用逗号间隔开,回车换行,当有向图输入完全时,进入菜单选择你要进行的模式,求一个城市到所有城市的最短路径输入1,回车进入该模式,输入你所要求的城市代表的顶点数,回车确认。求任意的两个城市之间

15、的最短路径输入2,回车确认进入该模式,输入两座城市代表的顶点数,以逗号间隔开,回车确认。运行结果:下面是城市交通图五、附录#include#include#define MVNum 100 /最大顶点数#define Maxint 35000enum booleanFALSE,TRUE;typedef char Vertextype;typedef int Adjmatrix; typedef struct Vertextype vexsMVNum; /顶点数组, 类型假定为char型 Adjmatrix arcsMVNum MVNum; / 邻接矩阵, 假定为int型 MGraph; int

16、 D1MVNum, p1MVNum; int DMVNumMVNum,pMVNumMVNum;/文件名save.c void CreateMGraph(MGraph *G,int n,int e) /采用邻接矩阵表示法构造有向图G,n,e表示图的当前顶点数和边数 int i,j,k,w; for(i=1;ivexsi=(char)i; for(i=1;i=n;i+) for(j=1;jarcsij=Maxint; / 初始化邻接矩阵 printf (输入%d条边的i,j及w: n,e); for(k=1;karcsij=w; printf (有向图的存储结构建立完毕! n); /文件名:dij

17、kstra.c(迪杰斯特拉算法)void Dijkstra(MGraph *G, int v1,int n) /用Dijkstra算法求有向图G的v1顶点到其他顶点v的最短路径pv及其权Dv /设G是有向图的邻接矩阵,若边不存在,则Gij=Maxint /Sv为真当且仅当v属于S,及以求的从v1到v的最短路径 int D2MVNum, p2MVNum; int v,i,w,min; enum boolean SMVNum; for(v=1;varcsv1v; /置初始的最短路径值 if(D2v Maxint) p2v=v1; /v1是的前趋(双亲) else p2v=0; /v 无前趋 / E

18、nd_for D2v1=0;Sv1=TRUE; /S集初始时只有源点, 源点到源点的距离为0 /开始循环,每次求的V1到某个V顶点的最短路径,并加V到S集中 for(i=2;in;i+) /其余n-1个顶点 min=Maxint; / 当前所知离v1顶点的最近距离,设初值为 for(w=1;w=n;w+) /对所有顶点检查 if(!Sw & D2wmin) /找离v1最近的顶点w,并将其赋给v,距离赋给min v=w; /在S集之外的离v1最近的顶点序号 min=D2w; /最近的距离 /W顶点距离V1顶点更近 Sv=TRUE; /将v并入S集 for(w=1;warcsvwarcsvw; /

19、更新D2w p2w=v; /End_if /End_for printf (路径长度 路径n); for(i=1;i=n;i+) printf (%5d, D2i); printf (%5d, i);v=p2i; while(v!=0) printf (-%d, v); v=p2v; printf(n); /文件名 floyd.c(费洛伊德算法)void Floyd(MGraph *G, int n) int i, j, k; for(i=1;i=n;i+) /设置路径长度D和路径path初值 for(j=1;jarcsij!=Maxint) pij=j; /j是i的后继 else pij=0

20、; Dij=G-arcsij; for(k=1;k=n;k+) /做K次迭代,每次均试图将顶点K扩充到当前求得的从i到j的最短路径pij上 for(i=1;i=n;i+) for(j=1;j=n;j+) if(Dik+Dkj%d,k); /输出后继顶点 k=pkw; /继续找下一个后继顶点 printf(-%d,w); / 输出终点w printf( 路径长度:%dn,Dvw); if(xz=1) printf(求单源路径,输入起点v :); scanf(%d, &v); Dijkstra(G,v,n); /调用迪杰斯特拉算法 printf(结束求最短路径,再见!n);六、心得体会 课程设计是

21、对自己一个学期以来学习的良好检验,在所有课题中,我选择了交通咨询系统的课题题目。在一个星期的设计过程中,碰到过许多困难,也从书籍和网络中找过许多相关资料来完善自己的设计。但结果不是让人很满意,可能是接触时间太短,对数据结构的认识还不深刻。 通过这次课程设计,我对用迪杰斯特拉算法计算最短路径有了更深刻的认识,加强了我对数据结构的了解。我知道如果要想在C方面有成就,必须多想多练习。现在我还是缺少练习,看程序可能看得懂。而当真正的编写程序起来就遇到困难了。通过这次系统的编写,我明白了编程要细心,有耐心。有些程序看起来很多很难,但只要抽丝剥茧的慢慢分析,就能明白它是怎么运行的。其实,只要踏踏实实一步一步来,你会发觉原来编程难度也不过如此。同时,我懂得了要多思考,遇到问题或不解时不能不懂装懂,要尽量去想请清其缘由,要懂得查阅有用的资料。 我知道在这次的课程设计中自已还有许多的欠缺,在以后的日子中,我一定得更加严格要求自己,改正缺点,不断努力,不断进步。

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

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