课题:全国交通咨询模拟学院:计算机科学与技术专业:通信工程班级:0903学号:2009115020322学生姓名:指导教师:数据结构课程设计一、题目分析1.【问题描述】处于对不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能的短,出门旅游的游客则希望旅费尽可能的省,而老年旅客则要求中转次数最少。编制一个全国城市间的交通咨询程序,为旅客提供两到三种最优决策的交通咨询。2.【基本要求】(1)提供对城市信息进行编辑(添加、删除)的功能。(2)城市之间有两种工具:火车和飞机。提供对列车时刻表和飞机航班表的编辑。(3)提供两种最优决策:最快到达或最省钱到达。全程只考虑一种交通工具。(4)旅途中耗费的总时间应该包括中转站的等候时间。(5)咨询以用户和计算机的对话方式进行。由用户输入起始站、终点站、最优决策原则和交通工具。输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。二、概要设计1.【抽象数据类型】本程序运用了图这种数据结构,并以邻接表作交通图的存储结构。数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。数据关系R:R={VR}VR={v,w|v,w∈V且P(v,w),v,w表示从v到w的弧。谓词P(v,w)定义了弧v,w的意义或信息}基本操作:AdjInitiate(&G)初始化邻接表AdjDestroy(&G)撤销邻接表InsertVertex(&G,i,&a)插入结点DeleteVertex(&G,i)删除结点InsertEdge()插入边DeleteEdge()删除边GetFirstVex()取第一个邻接结点GetNextVex()取下一个邻接结点CreatGraph()创建图邻接表的存储结构typedefstructNode{intdest;structNode*next;intt_time;floatt_price;intt_start[5];intt_get[5];intf_time;floatf_price;intf_start[5];intf_get[5];}Edge;typedefstruct{DataTypedata[20];intscore;Edge*adj;}AdjLHeight;typedefstruct{AdjLHeighta[Max];intnumOfVerts;intnumOfEdges;}AdjLGraph;栈的存储结构typedefstructsnode{intdata;structsnode*next;}LSNode;其他基本操作:voidAdminister(AdjLGraph*G);voidUserDemand(AdjLGraph*G);voidCreatTraffic(AdjLGraph*G);voidEditCity(AdjLGraph*G);voidAddCity(AdjLGraph*G);voidDeleteCity(AdjLGraph*G);voidEditTraffic(AdjLGraph*G);intAddTraffic(AdjLGraph*G,inta[]);intDeleteTraffic(AdjLGraph*G,inta[]);voidLeastMoney(AdjLGraph*G,intv1,intv2,intTraffic[])voidLeastTime(AdjLGraph*G,intv1,intv2,intTraffic[])2.【程序的模块】主函数main管理系统AdministerAdminister(&G)Administer(&G)用户咨询UserDemand退出管理系统Administer初始化交通系统CreatTraffic编辑城市EditCity编辑道路EditTraffic退出三、详细设计1.【函数调用关系】编辑城市EditCity添加城市AddCity删除城市DeleteCity退出编辑道路EditTraffic添加道路Addtraffic删除道路DeleteTraffic退出用户咨询UserDemand最省钱到达LeastMoney最快到达LeastTime退出EditTrafficDeletetCityAddcityUserDemandAdministerEditCityCreatTrafficLeastMoneyDeleteTrafficAddTrafficMain()LeastTimeInsertVextexDeleteVextexInsertEdgeDeleteEdgeStackPushStackPopStackTop2.【源文件】#includestdio.h#includestdlib.h#includestring.h#includemalloc.htypedefcharDataType;#defineMax30#defineMaxEdges60#defineMaxWeight10000intTraffic[5*MaxEdges];inttag=0;#includeAdj.h#includeLStack.h#includeDijkstra.hvoidAdminister(AdjLGraph*G);voidUserDemand(AdjLGraph*G);voidCreatTraffic(AdjLGraph*G);voidEditCity(AdjLGraph*G);voidAddCity(AdjLGraph*G);voidDeleteCity(AdjLGraph*G);voidEditTraffic(AdjLGraph*G);intAddTraffic(AdjLGraph*G,inta[]);intDeleteTraffic(AdjLGraph*G,inta[]);voidmain(){AdjLGraphG;AdjInitiate(&G);inti;do{system(cls);printf(\n\n\n\n\n\n\n请选择程序功能:\n);printf(*************************************\n);printf(**1=管理系统**\n);printf(**2=用户咨询**\n);printf(**3=退出**\n);printf(*************************************\n);printf(选择?);scanf(%d,&i);getchar();switch(i){case1:Administer(&G);break;case2:UserDemand(&G);break;case3:break;}}while(i!=3);}voidAdminister(AdjLGraph*G){inti;do{system(cls);printf(\n\n\n\n\n\n\n请选择程序功能:\n);printf(*************************************\n);printf(**1=初始化交通系统**\n);printf(**2=编辑城市**\n);printf(**3=编辑交通**\n);printf(**4=返回**\n);printf(*************************************\n);printf(选择?);scanf(%d,&i);getchar();switch(i){case1:CreatTraffic(G);break;case2:EditCity(G);break;case3:EditTraffic(G);break;case4:break;}}while(i!=4);}voidUserDemand(AdjLGraph*G){inti=0,e=0,j,v1,v2;FILE*fp,*fr;if((fp=fopen(city.txt,rb))==NULL){printf(无法打开文件!\n);}while(!feof(fp)){fscanf(fp,%10s,G-a[i].data);i++;}fclose(fp);G-numOfVerts=i;if((fr=fopen(traffic.txt,rb))==NULL){printf(无法打开文件!\n);}while(!feof(fr)){fscanf(fr,%5d,&Traffic[e]);if(Traffic[e]==-1)e--;e++;}fclose(fr);G-numOfEdges=e/5;if(tag==0){for(j=0;jG-numOfEdges;j++){Edge*p;p=(Edge*)malloc(sizeof(Edge));/*申请邻接边单链表结点空间*/p-dest=Traffic[5*j+1];/*置邻接边弧头序号*/p-next=G-a[Traffic[5*j]].adj;/*新结点插入单链表的表头*/G-a[Traffic[5*j]].adj=p;/*头指针指向新的单链表表头*/EditEdge(p,Traffic[5*j+2],Traffic[5*j+3],Traffic[5*j+4]);}}system(cls);for(j=0;jG-numOfVerts;j++)printf(%d=%s\n,j,G-a[j].data);printf(\n选取起始站:);scanf(%d,&v1);printf(\n选取终点站:);scanf(%d,&v2);do{system(cls);printf(\n\n\n\n\n\n\n请选择程序功能:\n);printf(*************************************\n);printf(**1=最省钱到达**\n);printf(**2=最快到达**\n);printf(**3=返回**\n);printf(*************************************\n);printf(选择?);scanf(%d,&i);getchar();switch(i){case1:LeastMoney(G,v1,v2,Traffic);break;case2:LeastTime(G,v1,v2,Traffic);break;case3:AdjDestroy(G);AdjInitiate(G);break;}}while(i!=3);tag=0;}voidCreatTraffic(AdjLGraph*G){tag=1;inti=0,e=0,j,v1,v2;DataTypecity[Max][20];charflag='Y';while(flag=='y'||flag=='Y'){system(cls);printf(\n\n\n\n\n\n\n输入城市名:);gets(city[i]);i++;printf(\n继续输入?(Y/N));flag=getchar();getchar();}printf(\n是否保存城市文本?(Y/N));flag=getchar();getchar();if(flag=='y'||flag=='Y'){FILE*fp;if((fp=fopen(city.txt,wb))==NULL){printf(无法打开文件!\n);}for(j=0;ji;j++)fprintf(fp,%10s,city[j]);fclose(fp);}do{system(cls);for(j=0;ji;j++)printf(%d=%s\n,j,city[j]);printf(\n选择初始站:);scanf(%d,&v1);printf(\n选择到达站:);scanf(%d,&v2);getchar();Traffic[5*e]=v1;Traffic[5*e+1]=v2;e++;printf(\n继续编辑?(Y/N));flag=getchar();getchar();}whi