数据结构课程设计--交通咨询系统设计_第1页
数据结构课程设计--交通咨询系统设计_第2页
数据结构课程设计--交通咨询系统设计_第3页
数据结构课程设计--交通咨询系统设计_第4页
数据结构课程设计--交通咨询系统设计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

信息科学与工程学院课 程 设 计 任 务 书 题 目: 交通咨询系统设计 学 号: 201112220141 姓 名: 年 级: 专 业: 计算机应用与技术课 程: 数据结构 指导教师: 职 称: 完成时间: 课程设计任务书及成绩评定课程设计的任务和具体要求 设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一城市顶点之间的最短路径(里程)或最低花费或最少时间等问题。对于不同的咨询要求,可输入城市间的路程或所需时间或所需费用。 本设计共分三部分,一是建立交通网络图的存储结构;二是解决单源最短路径问题;三是实现任两个城市顶点之间的最短路径问题。 指导教师签字: 日期: 指导教师评语: 成绩: 指导教师签字: 日期: 课程设计所需软件、硬件等 PC兼容机、Windows操作系统、Turbo C/Win t、Vc+软件等。课 程 设 计 进 度 计 划起止日期 工作内容 备注 参考文献、资料索引(序号、文献名称、编著者、出版单位)数据结构(C语言版) 编著 严蔚敏 吴伟民 清华大学出版社 1997 数据结构 中国石油大学出版社 一、需求分析设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一城市顶点之间的最短路径(里程)或最低花费或最少时间等问题。对于不同的咨询要求,可输入城市间的路程或所需时间或所需费用。本设计共分三部分,一是建立交通网络图的存储结构;二是解决单源最短路径问题;三是实现任两个城市顶点之间的最短路径问题。1.1.1建立图的存储结构邻接矩阵是表示图形中顶点之间相邻关系的矩阵。图的邻接矩阵是定义如下的n阶方阵:设G=(V,E)是一个图,结点集为。G的邻接矩阵 当邻接矩阵的行表头、列表头顺序一定时,一个图的邻接矩阵表示是唯一的。图的邻接矩阵表示,除了需用一个二维数组存储顶点之间的相邻关系的邻接矩阵外,通常还需要使用一个具有n个元素的一维数组来存储顶点信息,其中下标为i的元素存储顶点i的信息。因此,图的邻接矩阵的存储结构定义如下:#definf MVNum 50 /最大顶点数typedef struct VertexType vexsMVNum; /顶点数组,类型假定为char型 Adjmatrix arcsMVNumMVNum; /邻接矩阵,假定为int型MGraph;1.1.2 单源最短路径最短路径的提法很多。在这里先讨论单源最短路径问题:即已知有向图(带权),我们希望找出从某个源点SV到G中其余各顶点的最短路径。为了叙述方便,我们把路径上的开始点称为源点,路径的最后一个顶点为终点。那么,如何求得给定有向图的单源最短路径呢?迪杰斯特拉(Dijkstra)提出按路径长度递增产生诸点的最短路径算法,称之为迪杰斯特拉算法。迪杰斯特拉算法求最短路径的实现思想是:设G=(V,E)是一个有向图,结点集为,cost是表示G的邻接矩阵,costij表示有向边的权。若不存在有向边,则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为空。最终结果是: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=(V,E),要对G中任意一对顶点有序对“v,w(vw)”,找出v到w的最短路径。要解决这个问题,我们可以依次把有向网络图中每个顶点作为源点,重复执行前面讨论的迪杰斯特拉算法n次,即可以求得每对顶点之间的最短路径。这里还可以用另外一种方法,称作费洛伊德(Floyd)算法。费洛伊德(Floyd)算法算法的基本思想是:假设求从顶点 vi到vj的最短路径。如果从vi到vj存在一条长度为arcsij的路径,该路径不一定是最短路径,还需要进行n次试探。首先考虑路径和是否存在。如果存在,则比较和的路径长度,取长度较短者为当前所求得的最短路径。该路径是中间顶点序号不大于1的最短路径。其次,考虑从vi到vj是否包含有顶点v2为中间顶点的路径,若没有,则说明从vi到vj的当前最短路径就是前一步求出的;若有,那么可分解为和,而这两条路径是前一次找到的中间顶点序号不大于1的最短路径,将这两条路径长度相加就得到路径的长度。将该长度与前一次中求出的从vi到vj的中间顶点序号不大于1的最短路径比较,取其长度较短者作为当前求得的从vi到vj的中间顶点序号不大于2的最短路径。依此类推,直到顶点vn加入当前从vi到vj的最短路径后,选出从vi到vj的中间顶点序号不大于n的最短路径为止。由于图G中顶点序号不大于n,所以vi到vj的中间顶点序号不大于n的最短路径,已考虑了所有顶点作为中间顶点的可能性,因此,它就是vi到vj的最短路径。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;enum 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; 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 *)malloc(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) 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语句的运用,由于本次程序要用很多for循环,我把一次for循环放到了上面for循环中,导致程序不能正确输出结果。最后把调到外面才OK。四、测试结果交通咨询系统通过迪杰斯特拉算法得出每一个城市到所有城市的最短路径,然后通过费洛伊德算法得出任意两个城市间最短路径。 本程序的运行环境为DOS操作系统,执行文件为 交通咨询.exe。进入程序后,即显示文本的操作界面:输入定点数和边数后,依次输入有向边,以及两点间的距离,用逗号间隔开,回车换行,当有向图输入完全时,进入菜单选择你要进行的模式,求一个城市到所有城市的最短路径输入1,回车进入该模式,输入你所要求的城市代表的顶点数,回车确认。求任意的两个城市之间的最短路径输入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 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); /文件名:dijkstra.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 无前趋 / End_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; /更新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的后继elsepij=0;Dij=G-arcsij;for(k=1;k=n;k+) /做K次迭代,每次均试图将顶点K扩充到当前求得的从i到j的最短路径pij上for(i=1;i=n;i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论