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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(c语言公交最优路径查询数据结构附设计报告完整代码Word文档下载推荐.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

c语言公交最优路径查询数据结构附设计报告完整代码Word文档下载推荐.docx

1、共花费x时间。 针对上述公交线路,能查询获得任何两个站点之间最省时间的路径(要考虑在中间站等下一辆线路的等待时间),即输入站名S,T后,可以输出从S到T的考虑在中间站等下一辆线路的等待时间的最省时间的路径,输出格式为:二、课程设计的主要内容(包含分工)主要内容:首先将多有要用到的结构体全部定义完全,在课程设计的进程安排12010年01月10日之前: 完成所有要用到的结构体的定义。22010年01月11日01月12日: 完成建立合适的图模型以及信息的初始化。32010年01月15日前: 将初始化的所有的信息与建立的图模型完全连接起来,写 调整函数将每一条路线的车的信息存放到所有的节点里去。420

2、10年1月16日2010年1月18日 : 完成按时间和价格的最优的方法选择路线。 5. 2010年1月19日2010年1月20日: 完成所有的程序。 6. 2010年1月21日 答辩具体分工:XX(组长):,定义所有将要用到的结构体 ,编写函数实现根据公交路线信息修改站点信息的功能 ,利用Floyd算法找出按时间的所有两站之间的最优路径 ,编写时间最优的路线选择(不考虑等待时间) ,编写时间最优的路线选择(考虑等待时间)XX :,初始化所有信息 ,建立图模型 ,编写价格最优的路线选择 ,界面优化2010年 01月11日数据结构课程设计报告(模板)一 正文1、目的 求公交线路上优化路径的查询 。

3、2、需求分析程序需要根据乘客的需要来查询的出符合要求的信息在程序运行的过程中根据提示进行输入;程序输出所有符合要求的最优的路线以供乘客选择;程序能查询任意两站之间按时间和按价格的最优路线查询;3、概要设计 先建图,再用Floyd函数求出任意两个结点之间的最优路径,后调用shortest函数进行求时间最优的路径,结束后在main函数里面提供选择界面,可以进行时间和价格最优路线的查询分别为Select_Time函数和Select_Money函数4、详细设计1)、定义结构体typedef struct int selectbusnum; char station1,station2; int sel

4、ectbusprice,selectbusgap;Selects; /存储按条件选择的最优选择路线的信息 typedef struct char StaName; char Location128;StationInfo; /站点的信息,每个站点中存放的信息有名字和位置 VRType adj; /因为是有向图,adj用来存放权值,存放的是两个结点之间 的时间值 InfoType *info; /存放弧的信息 ArCell, adjMatrixMAX_VERTEX_NUMMAX_VERTEX_NUM;/adjvw 数组即v 和w之间的权值typedef struct int num; /车辆的路

5、线号 int price ; /每路车的票价 int gap; /每两次发车之间的时间间隔 int speed; /车速 int stopnum; /每辆车经过的车站的总数 StationInfo passMAX_VERTEX_NUM; /每一路车经过的站点的信息BusInfo; /车辆信息 char Location32; int stopbusnum; BusInfo stopbusMAX_BUS_NUM;VertexType; / 每个结点存放的信息,包括了站名,位置,经过的车辆数以及经过的该站点的所有的车辆的信息2)调整函数 Adjustvoid Adjust (MGraph &G,V

6、ertexType *S) int i; for (i=0;iMAX_VERTEX_NUM;i+) G.vexsi.StaName=Si.StaName; 将所有初始化的值与图联系起来, 把初始化的点的名字传给图中各个节点的StaName。void Adjust_2(BusInfo *bus,MGraph &G) int i,j,t8=0,0,0,0,0,0,0,0,p; for (i=0; for (j=0;jMAX_BUS_NUM;j+) for (p=0;pbusj.stopnum;p+) if (G.vexsi.StaName= =busj.passp.StaName) G.vexsi

7、.stopbusnum+; G.vexsi.stopbusti.num=busj.num; G.vexsi.stopbusti.price=busj.price; G.vexsi.stopbusti.gap=busj.gap; G.vexsi.stopbusti.speed=busj.speed;ti+; 将所有的初始化的点的信息以及bus的信息传递给图,每个结点中记录了经过该站的所有的车辆的信息,busj.passp是用来存放该车经过的站的信息。定义的整型数组t8是用来对每辆车经过的站的个数进行计数的。3)建立图模型int LocateVex(MGraph G,char u) int i;

8、for(i=0;G.vexnum; if (u=G.vexsi.StaName)return i; if(i=G.vexnum) printf(Error u!n);return 1; return 0;LocateVex函数在下面建图函数中调用的时候是用来找到v1,v2结点分别在G向量中的位置的。void CreateMGraph(BusInfo *bus,VertexType *S,MGraph & void Adjust (MGraph &G,VertexType *S); void Adjust_1(BusInfo *bus,VertexType *S); void Adjust_2(

9、BusInfo *bus,MGraph &G); /申明要调用的函数 Adjust (G,S); Adjust_2(bus,G); Adjust_1(bus,S); int i,j,t; G.vexnum=8;G.arcnum=11; char v1,v2,a112=A,B,DFC, EGH; int b11=8,5,6,3,2,10,7,4,5,15,20; /根据初始化的数据构建弧的权值(时i+) 间) for (j=0;j+) G.arcsij.adj=INFINITY;/ INFINITY宏定义的最大值表示距离for (t=0;t11;t+) v1=at0;v2=at1; /将v1,v

10、2赋值为弧的两端的结点 i=LocateVex(G,v1); /i表示v1在G向量结点数组中的位置 j=LocateVex(G,v2); /j表示v2在G向量结点数组中的位置 G.arcsij.adj=bt; /将数组b中的时间值赋给i到j的弧上 return;建立图模型将所有的初始化的数据放到图的每项中。4)test函数void Test(BusInfo *bus,MGraph G) int i,j; printf(路线%d 票价%d 间隔%d分钟 车速%dkm/h , busi.num,busi.price,busi.gap,busi.speed); printf(经过的站为:busi.s

11、topnum;%c%s,busi.passj.StaName,busi.passj.Location);printf( 站名%c 坐标%sn,Si.StaName,Si.Location);Si.stopbusnum; printf(停靠汽车及相关信息:路线%d 票价%d 间隔%d分钟 车速%d千米每分 G.vexsi.stopbusj.num,G.vexsi.stopbusj.price, G.vexsi.stopbusj.gap,G.vexsi.stopbusj.speed);Test函数是用来测试建立图之后,原来初始化的数据是否已经成功的存放进图。5)Show_FLOYD函数 void

12、Show_FLOYD() Test(bus,G); /先将图线输出便于后面的查看 CreateMGraph(bus,S,G); /建图 PrintMGraph(G);Test(bus,G); /图是用邻接矩阵的方法来建的,所以用在 int i,j,k,l,m,n; /这里的PrintMGraph函数是用来输出矩阵的 G.arcsii.adj=0; / ShortestPath_FLOYD()要求对角元素值为0 printf(邻接矩阵:i+) /直接有路径的输出时间,没有的在输出INFINITY for(j=0;%6d,G.arcsij); ShortestPath_FLOYD(G,&p,&d)

13、; /调用函数来找出按时间所有的的最短路径d矩阵:j+) /用二维数组来输出对应的矩阵中的权值,dij); if (dij!=100) %c到%c的最短时间为%d分 n,G.vexsi.StaName,G.vexsj.StaName,dij);p矩阵: / p矩阵用来存放路线信息从i到j的具体路线 l=G.vexnum; for(j=0; if(i!=j) m=0; / 占位空格 for(k=0;kk+) if(pijk=1)%c,G.vexsk.StaName); else m+; for(n=0;nm;n+) / 输出占位空格 /如果两个结点之间找不到可以直接通的路 / 线则在相应的位置上

14、输出空格按回车键继续.a=getchar(); system(cls /输出信息过多,清屏一次用于输出所有的两个结点的时间信息以及从每个点到其他任意一个点的具体路线6)ShortestPath_FLOYD函数 void ShortestPath_FLOYD(MGraph G,PathMatrix *P,DistancMatrix *D) / 用Floyd算法求有向网G中各对顶点v和w之间的最短路径Pvw及其 / 带权长度Dvw。若Pvwu为TRUE,则u是从v到w当前求得最短 int u,v,w,i; for(v=0;vv+) / 各对结点之间初始已知路径及距离 for(w=0;ww+) (*

15、D)vw=G.arcsvw.adj; /D矩阵用来存放每一条弧的权值即时间值 for(u=0;uu+) (*P)vwu=FALSE; if(*D)vwINFINITY)/当权值小于最大值时说明从v到w有直接路径 (*P)vwv=TRUE; /v,w之间有直接路径就将 (*P)vwv赋值为1 (*P)vww=TRUE;v+) if(*D)vu+(*D)uw(*D)vw) / 从v经u到w的一条路径更短 (*D)vw=(*D)vu+(*D)uw; (*P)vwi=(*P)vui|(*P)uwi;此函数是用来求出每个点到另外的任意一个点的按时间的最优的路径,对于有两个结点相邻但路径的时间是否是最短进

16、行判断并挑选出时间的最优的路径,下面的选择函数则是在将这些路径比较和挑选。7)Select_Time函数void Select_Time() char v1,v2; int i,j,k,m,n=0,t=0,flag=0,loc1,loc2,numMAX_BUS_NUM=1,1,1,1,1,1;/*num数组用来做标记用,已做过标记为0,没做够标记为1*/ char aMAX_VERTEX_NUM;/ * a字符数组用来存放从v1到v2的最短路径所经过的都有的站点名字 * /请输入起始站点和目的点n scanf(%c%c,&v1,&v2); for(i=0; if (v1=G.vexsi.Sta

17、Name) /找到与名字v1对应的结点 loc1=i; /用来存放出发点v1在图中的位置 printf(,G.vexsi.StaName,G.vexsi.Location); for (j=0;G.vexsi.stopbusnum; /找出所有v2点停靠的车辆的信息 printf( G.vexsi.stopbusj.num,G.vexsi.stopbusj.price, G.vexsi.stopbusj.gap,G.vexsi.stopbusj.speed);n经过的站为: for (m=0;mm+),G.vexsi.stopbusj.passm.StaName,G.vexsi.stopbus

18、j.passm.Location); /将所有v2点停靠的车辆的信息输出 if (v2=G.vexsi.StaName) loc2=i; /用来存放出发点v2在图中的位置 for (m=0; printf(n*结果*nn if (v1=busi.passj.StaName|v2=busi.passj.StaName) /判断在该车都经过的站点中有没有是v1或v2的 t+;/用来标记一条最短路径中的v1,v2出现情况 if (t=2)/t=2时则表示v1,v2两个结点都在该条最短路径中 printf(直达路线%d 票价%d 间隔%d分钟 车速%dkm/h 停靠%d站 busi.num,busi.

19、price,busi.gap,busi.speed,busi.stopnum); for (m=0;,busi.passm.StaName,busi.passm.Location); t=0;flag=1;/此处的t=0是t=2的情况重置便于下个循环的实现 t=0;/此处是将t=1是的情况重置用于下一个大循环的实现 /找出v1在图中的位置 /找出v2在图中的位置 if (dij!=INFINITY) /当i,j之间有最短路径时输出下面信息 printf(%c到%c的最短时间为%d分n if(flag!=1) /标记flag当为1时i和j直接有弧,有直接从i到j的车两站直接没有车直达,可以选择换乘!经过的站点 for(t=0; if(pijt=1) ,G.vexst.StaName); t=0; for(m=0;=G.vexnum; if(pijm=1) /当pijm为1 时说明i,j之间有直接的路径 at=G.vexsm.StaName;t+;/将每个结点的名字存放到a里 for (m=0;t-1; loc1=LocateVex(G,am); loc2=LocateVex(G,am+1);/先定义连续的两辆车 for (i=0;G.vexsloc1.stopbusnum; for (j=0;G.vexsloc2.stopbusn

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

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