版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构课程设计交通咨询系统设计设计题目<二>:7.3.4交通咨询系统设计P160一、设计要求1.问题描述 根据不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能的短,出门旅行的旅客希望旅费尽可能的少,而老年人则要求中转次数少。模拟一个全国城市之间的咨询交通程序,为旅客提供两种或三种最优的交通路线。2.需求分析二、概要设计1.主界面设计 (图2.1”交通咨询系统”主菜单)2.存储结构设计本系统采用图结构类型存储抽象交通咨询系统的信息。typedefstructTrafficNode{ charname[MAX_STRING_NUM];//班次//MAX_STRING_NUM最为10 intStartTime,StopTime;//起止时间 intEndCity;//该有向边指向的顶点在数组中的位置,即该城市编号 intCost;//票价}TrafficNodeDat;typedefstructVNode{ CityTypecity; intTrainNum,FlightNum;//标记下面Train数组和Flight数组里元素个数 TrafficNodeDatTrain[MAX_TRAFFIC_NUM];//数组成员为结构体,记录了到达城市、起止时间、票价和班次 TrafficNodeDatFlight[MAX_TRAFFIC_NUM]; //intCost;//遍历时到达该城市的耗费(时间或者费用)}VNodeDat;typedefstructPNode{ intCity; intTraNo;}PNodeDat;3.系统功能设计(1)添加城市。添加一个城市的名称(2)删除城市。输入一个城市名称,删除该城市。(3)添加交通路线。输入起始城市、终点城市、航班或火车、车次、起始时间、终点时间和票价(4)删除交通路线。输入火车或飞机的班次删除该交通路线。(5)查询最小费用路线。输入起始城市、终点城市、航班或火车、车次、起始时间、终点时间查询最小费用路线。三、模块设计1.模块设计无向网操作模块工作区模块主程序模块无向网操作模块工作区模块主程序模块 (图2.2模块调用示意图)2.系统子程序及功能设计(1)intShowMenu()//主菜单(2)voidCopyRight()(3)intSeekCity(char*name)//寻找城市(4)intInsertCity(char*Name)//添加城市(5)intSaveSysInfo()//向程序输入数据(6)intDelCity(char*Name)//删除城市(7)intInsertTrain(char*train,char*StartCity,char*EndCity,intStartTime,intEndTime,intcost)//添加火车路线(8)intInsertFlight(char*flight,char*StartCity,char*EndCity,intStartTime,intEndTime,intcost)//添加飞机航线(9)intDelPath(char*name)//删除路线(10)voidDijkstra(intmatx[Dij_MAXN][Dij_MAXN],intp_start,intp_end,intTravelType)(11)intInitSysData()//存储数据(12)intSearchMinTime(CityTypeCity,CityTypeEndCity,intCurTime,intcurPathNo,intTravelType)//查询最短时间(13)intCalcMinTime(intStartCity,intEndCity,intTravelType)//显示最短时间(14)intCalcMinCost(intStartCity,intEndCity,intTravelType)//最少花费(15)intmain()//主函数3.函数主要调用关系图15main()15main()89112754136361223716 (图2.3函数主要调用关系图)四、详细设计1.数据类型定义(1)全局变量的定义typedefshortintCityType;//CityType定义短整形的变量typedefstructTrafficNode{ charname[MAX_STRING_NUM];//班次//MAX_STRING_NUM最为10 intStartTime,StopTime;//起止时间 intEndCity;//该有向边指向的顶点在数组中的位置,即该城市编号 intCost;//票价}TrafficNodeDat;typedefstructVNode{ CityTypecity; intTrainNum,FlightNum;//标记下面Train数组和Flight数组里元素个数 TrafficNodeDatTrain[MAX_TRAFFIC_NUM];//数组成员为结构体,记录了到达城市、起止时间、票价和班次 TrafficNodeDatFlight[MAX_TRAFFIC_NUM]; //intCost;//遍历时到达该城市的耗费(时间或者费用)}VNodeDat;typedefstructPNode{ intCity; intTraNo;}PNodeDat;2.系统主要子程序详细设计(1)用户工作区模块的设计intShowMenu(){ printf("\n|******************欢迎使用交通咨询系统*******|\n"); printf("\n|------------------1:添加城市----------------|"); printf("\n|------------------2:删除城市----------------|"); printf("\n|------------------3:添加交通路线------------|"); printf("\n|------------------4:删除交通路线------------|"); printf("\n|------------------5:查询最小费用路线--------|"); printf("\n|------------------6:查询最快路线------------|"); printf("\n|------------------7:清除屏幕----------------|"); printf("\n|------------------0:退出--------------------|\n"); printf("\n|***********o(∩_∩)oo(∩_∩)o**************|\n"); printf("\n请输入你的选择:"); return1;}(2)用Dijkstra算法求两段路程的最短距离voidDijkstra_Output(intmatx[Dij_MAXN][Dij_MAXN],intPreCity[Dij_MAXN],intp_end,intTravelType){ inttrack[Dij_MAXN]; inti=0,j,k,min,tmp,end,cost=0; j=p_end;track[i++]=j; while(PreCity[j]>=0) { cost+=matx[PreCity[j]][j]; track[i++]=j=PreCity[j]; } printf("\nTrackWay:"); if(!TravelType) { for(i--;i>0;i--) { printf("\n%s:",CityName[track[i]]); end=track[i-1];min=32767; for(k=0;k<AdjList[track[i]].TrainNum;k++) if(AdjList[track[i]].Train[k].EndCity==end&&min>AdjList[track[i]].Train[k].Cost) { min=AdjList[track[i]].Train[k].Cost; tmp=k; } printf("%s",AdjList[track[i]].Train[tmp].name); printf("%2d:%2d-%2d:%2d",AdjList[track[i]].Train[tmp].StartTime/60,AdjList[track[i]].Train[tmp].StartTime%60,AdjList[track[i]].Train[tmp].StopTime/60,AdjList[track[i]].Train[tmp].StopTime%60); } } else { for(i--;i>0;i--) { printf("\n%s:",CityName[track[i]]); end=track[i-1];min=32767; for(k=0;k<AdjList[track[i]].FlightNum;k++) if(AdjList[track[i]].Train[k].EndCity==end&&min>AdjList[track[i]].Flight[k].Cost) { min=AdjList[track[i]].Flight[k].Cost; tmp=k; } printf("%s",AdjList[track[i]].Flight[tmp].name); printf("%2d:%2d-%2d:%2d",AdjList[track[i]].Flight[tmp].StartTime/60,AdjList[track[i]].Flight[tmp].StartTime%60,AdjList[track[i]].Flight[tmp].StopTime/60,AdjList[track[i]].Flight[tmp].StopTime%60); } } printf("\n%s:DESTINATION!",CityName[track[0]]); printf("\nMinCost:%d\n",cost);}voidDijkstra(intmatx[Dij_MAXN][Dij_MAXN],intp_start,intp_end,intTravelType){ intPreCity[Dij_MAXN];//PreCity[i]==-1,neverused; //PreCity>0,theprecityofCityi inti,j,min,pre,pos; for(i=0;i<CityNum;i++) { PreCity[i]=-1; } PreCity[p_start]=-2; while(PreCity[p_end]==-1) { min=-1; for(i=0;i<CityNum;i++) if(PreCity[i]!=-1) { for(j=0;j<CityNum;j++) if(PreCity[j]==-1&&matx[i][j]>0&&(min<0||matx[i][j]<min)) { pre=i;pos=j;min=matx[i][j]; } } PreCity[pos]=pre; } Dijkstra_Output(matx,PreCity,p_end,TravelType);}五、测试分析1.添加城市在主菜单下,用户输入1,添加城市名称。 (图2.4添加城市)2.删除城市在主菜单下,用户输入2,删除已添加城市名称。 (图2.5删除城市)3.添加交通路线在主菜单下,用户输入3,已添加城市名称。添加起始城市、终点城市名称、乘车类型、乘车班次、起始时刻、终点时刻、和票价。 (图2.6添加交通路线)4.删除交通路线输入班次号,删除交通路线 (图2.7删除交通路线)5.查询最小费用交通路线 (图2.8查询最小费用交通路线)6.查询最快交通路线 (图2.9查询最快交通路线)7.清除屏幕8.退出六、用户手册使用本系统时,用户需先向程序添加城市后,在已有城市基础上添加已有城市的路线和使用各项功能。七、调试报告程序运行无错误,但当系统输入其它无储存内容时程序会意外中断,代码需要优化。八、程序清单#include"stdafx.h"#include<stdio.h>#include<string.h>#include<stdlib.h>#defineERR0#defineOK1#defineDij_MAXN100#defineMAX_VERTEX_NUM100#defineMAX_STRING_NUM100#defineMAX_TRAFFIC_NUM100constcharCityFile[]="city.txt";constcharTrainFile[]="train.txt";constcharFlightFile[]="flight.txt";typedefshortintCityType;//CityType定义短整形的变量typedefstructTrafficNode{ charname[MAX_STRING_NUM];//班次//MAX_STRING_NUM最为10 intStartTime,StopTime;//起止时间 intEndCity;//该有向边指向的顶点在数组中的位置,即该城市编号 intCost;//票价}TrafficNodeDat;typedefstructVNode{ CityTypecity; intTrainNum,FlightNum;//标记下面Train数组和Flight数组里元素个数 TrafficNodeDatTrain[MAX_TRAFFIC_NUM];//数组成员为结构体,记录了到达城市、起止时间、票价和班次 TrafficNodeDatFlight[MAX_TRAFFIC_NUM]; //intCost;//遍历时到达该城市的耗费(时间或者费用)}VNodeDat;typedefstructPNode{ intCity; intTraNo;}PNodeDat;VNodeDatAdjList[MAX_VERTEX_NUM];charCityName[MAX_VERTEX_NUM][MAX_STRING_NUM];//城市名,采用第一下标为该城市在本程序中的编号intCityNum;//城市数目PNodeDatPath[MAX_VERTEX_NUM];//存储临时最小时间路径PNodeDatMinPath[MAX_VERTEX_NUM];//存储搜索到当前的最小时间路径intMinTime,StartTime;intcurPath;intShowMenu(){ printf("\n|******************欢迎使用交通咨询系统*******|\n"); printf("\n|------------------1:添加城市----------------|"); printf("\n|------------------2:删除城市----------------|"); printf("\n|------------------3:添加交通路线------------|"); printf("\n|------------------4:删除交通路线------------|"); printf("\n|------------------5:查询最小费用路线--------|"); printf("\n|------------------6:查询最快路线------------|"); printf("\n|------------------7:清除屏幕----------------|"); printf("\n|------------------0:退出--------------------|\n"); printf("\n|***********o(∩_∩)oo(∩_∩)o**************|\n"); printf("\n请输入你的选择:"); return1;}voidCopyRight(){ printf("\n");}intSeekCity(char*name)//寻找城市{ inti; for(i=0;i<CityNum;i++) { if(strcmp(name,CityName[i])==0)//比较函数,若相等,则返回i值 { returni; } } return-1;}//=============================================EditInfo====================================================intSaveSysInfo()//向程序输入数据{ FILE*fp;inti,j,total; fp=fopen(CityFile,"w");//打开CityFile文档 fprintf(fp,"%d\n",CityNum);//往文档中写城市的数量 for(i=0;i<CityNum;i++) { fprintf(fp,"%s\n",CityName[i]);//往文档中写城市的名字 } fclose(fp);//将CityFile文档关闭 total=0; fp=fopen(TrainFile,"w");//打开TrainFile文档 for(i=0;i<CityNum;i++)//计算列车班次的数量 { total+=AdjList[i].TrainNum; } fprintf(fp,"%d\n",total);//往文档中写列车班次的数量 for(i=0;i<CityNum;i++)// { for(j=0;j<AdjList[i].TrainNum;j++)//往文档中写列车的车次、始发城市、终点城市 { fprintf(fp,"%s%s%s",AdjList[i].Train[j].name, CityName[i], CityName[AdjList[i].Train[j].EndCity]); fprintf(fp,"%2d:%2d%2d:%2d%d\n",AdjList[i].Train[j].StartTime/60,//往文档中写 AdjList[i].Train[j].StartTime%60, AdjList[i].Train[j].StopTime/60, AdjList[i].Train[j].StopTime%60, AdjList[i].Train[j].Cost); } } fclose(fp);total=0; fp=fopen(FlightFile,"w"); for(i=0;i<CityNum;i++) { total+=AdjList[i].FlightNum; } fprintf(fp,"%d\n",total); for(i=0;i<CityNum;i++) { for(j=0;j<AdjList[i].FlightNum;j++) { fprintf(fp,"%s%s%s",AdjList[i].Flight[j].name, CityName[i], CityName[AdjList[i].Flight[j].EndCity]); fprintf(fp,"%2d:%2d%2d:%2d%d\n",AdjList[i].Flight[j].StartTime/60, AdjList[i].Flight[j].StartTime%60, AdjList[i].Flight[j].StopTime/60, AdjList[i].Flight[j].StopTime%60, AdjList[i].Flight[j].Cost); } } fclose(fp);return1;}intInsertCity(char*Name)//添加城市{ strcpy(CityName[CityNum],Name); AdjList[CityNum].city=CityNum; AdjList[CityNum].FlightNum=0; AdjList[CityNum].TrainNum=0; CityNum++; return1;}intDelCity(char*Name)//删除城市{ intcity,i,j,o=1,k=1; city=SeekCity(Name); printf("%s",Name); while(true) { while(CityName[k]!=Name) { k++; } if(k>CityNum) { o--; printf("未找到此城市,请重新输入!"); return0; } for(i=city;i<CityNum-1;i++)//???可能city是从0开始的 { strcpy(CityName[i],CityName[i+1]); AdjList[i].FlightNum=AdjList[i+1].FlightNum; AdjList[i].TrainNum=AdjList[i+1].TrainNum; for(j=0;j<AdjList[i].FlightNum;j++)//为什么没有火车的?? { AdjList[i].Flight[j].Cost=AdjList[i+1].Flight[j].Cost; AdjList[i].Flight[j].EndCity=AdjList[i+1].Flight[j].EndCity; strcpy(AdjList[i].Flight[j].name,AdjList[i+1].Flight[j].name); AdjList[i].Flight[j].StartTime=AdjList[i+1].Flight[j].StartTime; AdjList[i].Flight[j].StopTime=AdjList[i+1].Flight[j].StopTime; } } CityNum--; } return1;}intInsertTrain(char*train,char*StartCity,char*EndCity,intStartTime,intEndTime,intcost){ inti,j;//InsertTrain(name,s_city,e_city,s_hour*60+s_minute,e_hour*60+e_minute,cost); i=SeekCity(StartCity); j=SeekCity(EndCity); AdjList[i].Train[AdjList[i].TrainNum].Cost=cost; AdjList[i].Train[AdjList[i].TrainNum].EndCity=j; AdjList[i].Train[AdjList[i].TrainNum].StartTime=StartTime; AdjList[i].Train[AdjList[i].TrainNum].StopTime=EndTime; strcpy(AdjList[i].Train[AdjList[i].TrainNum].name,train); AdjList[i].TrainNum++;//火车的数加1 return1;}intInsertFlight(char*flight,char*StartCity,char*EndCity,intStartTime,intEndTime,intcost){ inti,j; i=SeekCity(StartCity); j=SeekCity(EndCity); AdjList[i].Flight[AdjList[i].FlightNum].Cost=cost; AdjList[i].Flight[AdjList[i].FlightNum].EndCity=j; AdjList[i].Flight[AdjList[i].FlightNum].StartTime=StartTime; AdjList[i].Flight[AdjList[i].FlightNum].StopTime=EndTime; strcpy(AdjList[i].Train[AdjList[i].FlightNum].name,flight); AdjList[i].FlightNum++; return1;}intDelPath(char*name){ inti,j,flag=0; for(i=0;i<CityNum;i++) { for(j=0;j<AdjList[i].FlightNum;j++)//注意j是从0开始的 if(strcmp(AdjList[i].Flight[j].name,name)==0) { flag=1;break; } if(flag) { for(;j<AdjList[i].FlightNum-1;j++)//把删除的航班后的每个航班向前移一位 { AdjList[i].Flight[j].Cost=AdjList[i].Flight[j+1].Cost; AdjList[i].Flight[j].EndCity=AdjList[i].Flight[j+1].EndCity; strcpy(AdjList[i].Flight[j].name,AdjList[i].Flight[j+1].name); AdjList[i].Flight[j].StartTime=AdjList[i].Flight[j+1].StartTime; AdjList[i].Flight[j].StopTime=AdjList[i].Flight[j+1].StopTime; } AdjList[i].FlightNum--;break; } for(j=0;j<AdjList[i].TrainNum;j++) if(strcmp(AdjList[i].Train[j].name,name)==0) { flag=1;break; } if(flag) { for(;j<AdjList[i].TrainNum-1;j++)//把删除的列车后的每个列车车次都前移一位 { AdjList[i].Train[j].Cost=AdjList[i].Train[j+1].Cost; AdjList[i].Train[j].EndCity=AdjList[i].Train[j+1].EndCity; strcpy(AdjList[i].Train[j].name,AdjList[i].Train[j+1].name); AdjList[i].Train[j].StartTime=AdjList[i].Train[j+1].StartTime; AdjList[i].Train[j].StopTime=AdjList[i].Train[j+1].StopTime; } AdjList[i].TrainNum--;break; } } return1;}//==============================================CheckInfo================================================voidDijkstra_Output(intmatx[Dij_MAXN][Dij_MAXN],intPreCity[Dij_MAXN],intp_end,intTravelType){ inttrack[Dij_MAXN]; inti=0,j,k,min,tmp,end,cost=0; j=p_end;track[i++]=j; while(PreCity[j]>=0) { cost+=matx[PreCity[j]][j]; track[i++]=j=PreCity[j]; } printf("\nTrackWay:"); if(!TravelType) { for(i--;i>0;i--) { printf("\n%s:",CityName[track[i]]); end=track[i-1];min=32767; for(k=0;k<AdjList[track[i]].TrainNum;k++) if(AdjList[track[i]].Train[k].EndCity==end&&min>AdjList[track[i]].Train[k].Cost) { min=AdjList[track[i]].Train[k].Cost; tmp=k; } printf("%s",AdjList[track[i]].Train[tmp].name); printf("%2d:%2d-%2d:%2d",AdjList[track[i]].Train[tmp].StartTime/60,AdjList[track[i]].Train[tmp].StartTime%60,AdjList[track[i]].Train[tmp].StopTime/60,AdjList[track[i]].Train[tmp].StopTime%60); } } else { for(i--;i>0;i--) { printf("\n%s:",CityName[track[i]]); end=track[i-1];min=32767; for(k=0;k<AdjList[track[i]].FlightNum;k++) if(AdjList[track[i]].Train[k].EndCity==end&&min>AdjList[track[i]].Flight[k].Cost) { min=AdjList[track[i]].Flight[k].Cost; tmp=k; } printf("%s",AdjList[track[i]].Flight[tmp].name); printf("%2d:%2d-%2d:%2d",AdjList[track[i]].Flight[tmp].StartTime/60,AdjList[track[i]].Flight[tmp].StartTime%60,AdjList[track[i]].Flight[tmp].StopTime/60,AdjList[track[i]].Flight[tmp].StopTime%60); } } printf("\n%s:DESTINATION!",CityName[track[0]]); printf("\nMinCost:%d\n",cost);}voidDijkstra(intmatx[Dij_MAXN][Dij_MAXN],intp_start,intp_end,intTravelType){ intPreCity[Dij_MAXN];//PreCity[i]==-1,neverused; //PreCity>0,theprecityofCityi inti,j,min,pre,pos; for(i=0;i<CityNum;i++) { PreCity[i]=-1; } PreCity[p_start]=-2; while(PreCity[p_end]==-1) { min=-1; for(i=0;i<CityNum;i++) if(PreCity[i]!=-1) { for(j=0;j<CityNum;j++) if(PreCity[j]==-1&&matx[i][j]>0&&(min<0||matx[i][j]<min)) { pre=i;pos=j;min=matx[i][j]; } } PreCity[pos]=pre; } Dijkstra_Output(matx,PreCity,p_end,TravelType);}intInitSysData(){ FILE*fp; inti,j,hour,minute,num,cost; charstmp1[MAX_STRING_NUM]; charstmp2[MAX_STRING_NUM]; charstmp3[MAX_STRING_NUM]; fp=fopen(CityFile,"r"); if(!fp) { printf("\nError:CannotOpenCityFile...\n"); return-1; } fscanf(fp,"%d",&CityNum); for(i=0;i<CityNum;i++) { fscanf(fp,"%s",&CityName[i]); AdjList[i].city=i; AdjList[i].TrainNum=0; AdjList[i].FlightNum=0; } fclose(fp); fp=fopen(TrainFile,"r"); if(!fp) { printf("\nError:CannotOpenTrainFile...\n"); return-1; } fscanf(fp,"%d",&num); for(i=0;i<num;i++) { fscanf(fp,"%s",&stmp1);//列车的车次 fscanf(fp,"%s",&stmp2);//列车的始发站 fscanf(fp,"%s",&stmp3);//列车的终点站 j=SeekCity(stmp2); AdjList[j].Train[AdjList[j].TrainNum].EndCity=SeekCity(stmp3);//将列车的车次、始发站、终点站、出发时间、到达时间读出 strcpy(AdjList[j].Train[AdjList[j].TrainNum].name,stmp1); fscanf(fp,"%d:%d",&hour,&minute); AdjList[j].Train[AdjList[j].TrainNum].StartTime=hour*60+minute; fscanf(fp,"%d:%d",&hour,&minute); AdjList[j].Train[AdjList[j].TrainNum].StopTime=hour*60+minute; fscanf(fp,"%d",&cost); AdjList[j].Train[AdjList[j].TrainNum].Cost=cost; AdjList[j].TrainNum++; } fclose(fp); fp=fopen(FlightFile,"r"); if(!fp) { printf("\nError:CannotOpenFlightFile...\n"); return-1; } fscanf(fp,"%d",&num); for(i=0;i<num;i++) { fscanf(fp,"%s",&stmp1);//飞机的车次 fscanf(fp,"%s",&stmp2);//飞机的始发站 fscanf(fp,"%s",&stmp3);//飞机的终点站 j=SeekCity(stmp2); AdjList[j].Flight[AdjList[j].FlightNum].EndCity=SeekCity(stmp3); strcpy(AdjList[j].Flight[AdjList[j].FlightNum].name,stmp1); fscanf(fp,"%d:%d",&hour,&minute); AdjList[j].Flight[AdjList[j].FlightNum].StartTime=hour*60+minute; fscanf(fp,"%d:%d",&hour,&minute); AdjList[j].Flight[AdjList[j].FlightNum].StopTime=hour*60+minute; fscanf(fp,"%d",&cost); AdjList[j].Flight[AdjList[j].FlightNum].Cost=cost; AdjList[j].FlightNum++; } fclose(fp);return1;}intSearchMinTime(CityTypeCity,CityTypeEndCity,intCurTime,intcurPathNo,intTravelType){//CityType是一种短整形函数,SearchMinTime共有5个参数 inti; if(City==EndCity) { if(MinTime>CurTime-StartTime) { for(i=0;i<=curPathNo;i++) { MinPath[i].City=Path[i].City; MinPath[i].TraNo=Path[i].TraNo; curPath=curPathNo; } MinTime=CurTime-StartTime; } } else { curPathNo++; Path[curPathNo].City=City; if(!TravelType) { for(i=0;i<AdjList[City].TrainNum;i++) { if((AdjList[City].Train[i].StartTime>=(CurTime%1440))&&(AdjList[City].Train[i].StopTime+(CurTime/1440)*1440-StartTime<MinTime)) { Path[curPathNo].TraNo=i; SearchMinTime(AdjList[City].Train[i].EndCity,EndCity,AdjList[City].Train[i].StopTime+(CurTime/1440)*1440,curPathNo,TravelType); } if((AdjList[City].Train[i].StartTime<(CurTime%1440))&&(AdjList[City].Train[i].StopTime+(CurTime/1440)*1440-StartTime<MinTime)) { Path[curPathNo].TraNo=i; SearchMinTime(AdjList[City].Train[i].EndCity,EndCity,AdjList[City].Train[i].StopTime+(CurTime/1440+1)*1440,curPathNo,TravelType); } } } else { for(i=0;i<AdjList[City].FlightNum;i++) { if((AdjList[City].Flight[i].StartTime>=CurTime)&&(AdjList[City].Flight[i].StopTime+(CurTime/1440)*1440-StartTime<MinTime)) { Path[curPathNo].TraNo=i; SearchMinTime(AdjList[City].Flight[i].EndCity,EndCity,AdjList[City].Flight[i].StopTime+(CurTime/1440)*1440,curPathNo,TravelType); } if((AdjList[City].Flight[i].StartTime<CurTime)&&(AdjList[City].Flight[i].StopTime+(CurTime/1440)*1440-StartTime<MinTime)) { Path[curPathNo].TraNo=i; SearchMinTime(AdjList[City].Flight[i].EndCity,EndCity,AdjList[City].Flight[i].StopTime+(CurTime/1440+1)*1440,curPathNo,TravelType); } } } } return1;}intCalcMinTime(intStartCity,intEndCity,intTravelType){ inti; MinTime=32767;curPath=0; Path[0].City=StartCity; if(!TravelType) { for(i=0;i<AdjList[StartCity].TrainNum;i++) { Path[0].TraNo=i; StartTime=AdjList[StartCity].Train[i].StartTime; SearchMinTime(AdjList[StartCity].Train[i].EndCity,EndCity,AdjList[StartCity].Train[i].StopTime,0,TravelType); } } else { for(i=0;i<AdjList[StartCity].FlightNum;i++) { Path[0].TraNo=i; StartTime=AdjList[StartCity].Flight[i].StartTime; SearchMinTime(AdjList[StartCity].Flight[i].EndCity,EndCity,AdjList[StartCity].Flight[i].StopTime,0,TravelType); } } if(MinTime==32767) { printf("\nNoaccesstothatdestination!"); return0; } //if(!TravelType) //StartTime=AdjList[StartCity].Train[MinPath[0].TraNo].StartTime; //else //StartTime=AdjList[StartCity].Flight[MinPath[0].TraNo].StartTime; printf("\nPath:\n"); for(i=0;i<=curPath;i++) { if(!TravelType) printf("%s:%s",CityName[MinPath[i].City],AdjList[MinPath[i].City].Train[MinPath[i].TraNo].name); else printf("%s:%s",CityName[MinPath[i].City],AdjList[MinPath[i].City].Flight[MinPath[i].TraNo].name); printf("%2d:%2d-%2d:%2d\n",AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StartTime/60,AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StartTime%60,AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StopTime/60,AdjList[MinPath[i].City].Train[MinPath[i].TraNo].StopTime%60); } printf("%s:DESTINATION!",CityName[EndCity]); printf("\nTimeCost:%2d:%2d",MinTime/60,MinTime%60); return1;}intCalcMinCost(intStartCity,intEndCity,intTravelType){ intma[Dij_MAXN][Dij_MAXN]; inti,j,min,end; for(i=0;i<CityNum;i++) for(j=0;j<CityNum;j++) ma[i][j]=-1; if(TravelType==0) { for(i=0;i<CityNum;i++) { min=32767;j=0; while(j<AdjList[i].TrainNum) { min=32767; end=AdjList[i].Train[j].EndCity; while(end==AdjList[i].Train[j].EndCity&&j<AdjList[i].TrainNum) { if(AdjList[i].Train[j].Cost<min) { min=AdjList[i].Train[j].Cost; } j++; } ma[i][end]=min; } } } else { for(i=0;i<CityNum;i++) { min=32767;j=0; while(j<AdjList[i].FlightNum) { min=32767; end=AdjList[i].Flight[j].EndCity; while(end==AdjList[i].Flight[j].EndCity&&j<AdjList[i].FlightNum) { if(AdjList[i].Flight[j].Cost<min) { min=AdjList[i].Flight[j].Cost; } j++; } ma[i][end]=min; } } } Dijkstra(ma,StartCity,EndCity,TravelType); return1;}//========================================Main()=================================================intmain(){ charname[MAX_STRING_NUM];//城市名 chars_city[MAX_STRING_NUM];//始发站 chare_city[MAX_STRING_NUM];//终点站 intCommand,cost; intstartcity,endcity,traveltype; ints_hour,s_minute,e_hour,e_minute; while(1) { CopyRight();//版权信息 ShowMenu();//主菜单 scanf("%d",&Command);//输入选择 switch(Command)//对菜单的内容进行选择 { case0://退出 return0; case1://添加城市 InitSysData();
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 内勤激励方案
- 篮球培训积分方案
- 甘肃省白银市2024-2025学年九年级上学期期中考试化学试卷含答案
- 2024-2025学年辽宁省大连市名校联盟九年级(上)第二次月考数学试卷(含答案)
- 广西公务员面试模拟82
- 黑龙江公务员面试模拟112
- 2020年10月31日上午山西省大同市公务员面试真题
- 河南面试模拟43
- 2019年黑龙江公务员考试申论真题(公检法类)
- 2008年1月25日出入境边防检查总站面试真题
- 上海市普陀区2024-2025学年六年级(五四学制)上学期期中语文试题
- 采伐树木合同模板
- 培训师破冰游戏大全课件
- 期中测试卷-2024-2025学年统编版语文三年级上册
- 《气能破岩作业技术规程》征求意见稿编制说明
- 医院检验科实验室生物安全程序文件SOP
- 92式手枪基础训练
- 封条模板A4直接打印版
- 幼儿园教学课件《半条棉被》课件
- 电子证照管理系统建设方案
- 电子诊断在汽车维修技术中的应用
评论
0/150
提交评论