数据结构课程设计报告之模拟一个全国城市间的交通咨询程序_第1页
数据结构课程设计报告之模拟一个全国城市间的交通咨询程序_第2页
数据结构课程设计报告之模拟一个全国城市间的交通咨询程序_第3页
数据结构课程设计报告之模拟一个全国城市间的交通咨询程序_第4页
数据结构课程设计报告之模拟一个全国城市间的交通咨询程序_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

分类号编号华北水利水电学院NorthChinaInstituteofWaterConservancyandHydroelectricPower课程设计题目:全国交通资讯系统院系信息工程学院专业计算机科学与技术专业姓名指导教师杨彬2023年6月28日目录1.需求分析 1问题描述 11.1基本规定 22概要设计 32.1数据结构 32.2程序模块 53.具体设计 63.1用到的各种函数 63.2函数调用关系图 83.3测试与分析 84.用户说明书 135.总结 165.1李明月的总结 165.2刘璐璐的总结 175.3吕竹青的总结 18参考文献: 19附录:程序源代码 191.需求分析问题描述设计、模拟一个全国城市间的交通征询程序,为旅客提供三种最优征询方案:(1)时间最短;(2)费用最小;(3)中转次数最少。1.1基本规定1.1.1输入输出的形式和输入值的范围在程序中输入城市名称时,需输入10个字母以内的字母串;输入列车或飞机编号时需输入一个整型数据;输入列车或飞机的费用时需输入一个实型数据;输入列车或飞机开始时间和到达时间时均需输入两个整型数据(以hh:mm的形式);在选择功能时,应输入与所选功能相应的一个整型数据。1.1.2输出形式程序的输出信息重要是:最快需要多少时间才干到达,或最少需要多少旅费才干到达,或最少需要多少次中转到达,并具体说明依次于何时乘坐哪一趟列车或哪一次班机到何地。1.1.3程序所能达成的功能程序的功能涉及:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达,显示编辑的全国交通系统。1.1.4任务分派在本程序中,我们一共划分了三个模块。管理员模块的初始化数据,城市信息的编辑,以及显示交通系统和整体的界面由李明月完毕。航班班次以及列车车次添加删除以及数据结构的初步实现由吕竹青完毕。对于最少时间,最少花费以及最少的中转次数这三个函数的实现由刘璐璐进行完毕。2概要设计2.1数据结构#defineMAX_VERTEX_NUM18//城市节点数#defineMAX_ARC_SIZE100#defineMAX_ROUTE_NUM5//路线数#defineFalse0#defineTrue1#defineINFINITY10000structVehide{intnumber;//航班号,火车号floatexpenditure;//费用intbegintime[2];//出发时间intarrivetime[2];//到达时间};//航班、列车信息节点structinfolist{ Vehidestata[MAX_ROUTE_NUM];//一个出发地到达目的地所相应的航班数或列车车次数intlast;//顺序表所相应的下标,从0开始};//顺序表表达structArcNode{ intadjvex;//节点下标ArcNode*nextarc;//节点的下一个指针域infolistinfo;//节点的数据域};//邻接表中各个节点信息typedefstructVNode{ charcityname[10];//城市名ArcNode*planefirstarc,*trainfirstarc;//航班链、列车链}VNode,AdjList[MAX_VERTEX_NUM];structALGraph{ AdjListvertices;intvexnum,planearcnum,trainarcnum;//城市数、航班数、列车数};structNode{intadjvex;introute;Node*next;};//临时建立的一个邻接表,用来求最少中转次数和最少费用structQNode{intadjvex;structQNode*next;};//链队节点信息structLinkQueue{QNode*front;QNode*rear;};//链队信息typedefstructTimeNode{ intadjvex;introute;intbegintime[2];intarrivetime[2];structTimeNode*child[MAX_ROUTE_NUM];}TimeNode,*TimeTree;structarc{intco;charvt[10];//出发地名字charvh[10];//目的地名字intbt[2];//出发时间intat[2];//到达时间floatmo;//费用}a[MAX_ARC_SIZE];charcity[MAX_VERTEX_NUM][10];intTTime[2];inttime[2];inttime1[2];inttime2[2];intc[MAX_VERTEX_NUM];intd[MAX_VERTEX_NUM];2.2程序模块重要涉及管理员编辑模块和用户查询模块以及显示全国交通信息模块。2.2.1各模块之间的调用关系以及算法设计3.具体设计3.1用到的各种函数voidAdminister(ALGraph*G);//voidCityEdit(ALGraph*G);//城市编辑voidCreateCityFile();voidCreateGraph(ALGraph*G);voidCreatePlaneFile();voidCreateTrainFile();intDeleteplaneArc(ALGraph*G);voidDeleteQueue(LinkQueue*Q,int*x);intDeletetrainArc(ALGraph*G);voidDeleteVertex(ALGraph*G);voidDemandDispose(intn,ALGraphG);voidEnterplaneArc(ALGraph*G);voidEnterQueue(LinkQueue*Q,intx);voidEntertrainArc(ALGraph*G);voidEnterVertex(ALGraph*G);voidExpenditureDispose(intk,infolist(*arcs)[MAX_VERTEX_NUM],ALGraphG,intv0,intv1,float*M,int*final);voidflightedit(ALGraph*G);voidInitGraph(ALGraph*G);voidInitQueue(LinkQueue*Q);intIsEmpty(LinkQueue*Q);intLocateVertex(ALGraph*G,char*v);voidMinExpenditure(infolistarcs,float*expenditure,int*route);voidPrintGraph(ALGraph*G);intsave(ALGraph*G);voidtrainedit(ALGraph*G);voidTransferDispose(intk,infolist(*arcs)[MAX_VERTEX_NUM],ALGraphG,intv0,intv1);voidCopyTimeTree(TimeTreep,TimeTreeq);voidDestoryTimeTree(TimeTreep);voidMinTime(infolistarcs,int*time,int*route);voidVisitTimeTree(TimeTreep);voidTimeDispose(intk,infolist(*arcs)[MAX_VERTEX_NUM],ALGraphG,intv0,intv1,int(*T)[2],int*final);voidTimeTreeDispose(Node*head,infolist(*arcs)[MAX_VERTEX_NUM]);voidtrainedit(ALGraph*G);voidCreateTimeTree(TimeTreep,inti,intj,LinkQueue*Q,infolist(*arcs)[MAX_VERTEX_NUM]);voidUserDemand(ALGraphG);3.2函数调用关系图3.3测试与分析3.3.1测试数据与截图1.管理员操作界面2.对整个结构进行初始化3.对城市,飞机班次,列车车次的编辑对城市的编辑:对航班的编辑:对列车的编辑:1.用户操作界面1.查询最少费用2.查询最短时间3.查询最少的中转次数3.3.2测试分析考虑到道路网多是稀疏网,故采用了邻接表作存储结构,其空间复杂度位O(e),此时的时间复杂度也为O(e)。构建邻接表的时间复杂度位O(n+e),输出途径的时间复杂度为O(n2)。由此,本交通资讯系统的时间复杂度位O(n2)。本程序在求最短途径时使用了迪杰斯特拉算法,重要考虑在本程序的初级阶段,并不需要大量的查询,更多会是图信息的添加和修改,重在算法的理解和掌握,因此采用了算法复杂度相对较低的迪杰斯特拉算法。当然,从性能上来说,当交通图基本稳定,并且城市信息基本完善的时候,使用佛洛伊德把所有的最短途径信息存储起来也许会更方便一点,后续的查询的时间复杂度也会相对减少。由此可见,在选用算法时,不能单纯地只考虑算法的时间复杂度,有时还必须综合考虑各种因素。航班时刻表

出发地到达地出发时间到达时间费

6320北京上海上海北京16:2018:00

17:2519:05680元2104北京乌鲁木齐乌鲁木齐

北京8:0010:459:5511:401150元201

北京

西安

西安

北京15:2512:3517:0014:15930元2323

西安广州

广州

西安7:1510:159:3511:351320元173

拉萨

昆明

昆明拉萨10:2012:3511:4514:00830元3304

拉萨

武汉

武汉拉萨14:1516:2515:4517:55890元82乌鲁木齐昆明

昆明乌鲁木齐

9:3013:0512:1515:501480元4723

武汉广州

广州

武汉7:0511:258:4513:05810元列车时刻表车次出发地到达地出发时间到达时间车

费27北京郑州西安郑州郑州西安郑州北京

13:1521:2405:4113:4221:1205:1313:3021:39

78元

82元82元78元41

北京

郑州

上海

郑州郑州上海郑州北京7:1115:2000:3509:4015:0800:1309:2817:37

90元

100元

100元90元59

上海广州

广州上海08:2003:3903:1622:53

182元134

兰州

北京

北京

兰州03:5219:2418:5610:28

162元323

广州

昆明

昆明

广州06:1816:3116:1402:27

102元873

武汉

昆明

昆明

武汉07:1321:4221:1711:46134元116

武汉

长沙

长沙

武汉9:3618:5418:3203:48

98元373

长沙

广州

广州

长沙13:1500:3500:1511:35116元

747兰州武汉武汉兰州17:4115:1314:4712:19210元371

兰州乌鲁木齐

乌鲁木齐

兰州11:4200:3523:5411:23114元218武汉西安

西安

武汉18:5001:3411:5118:35178元4.用户说明书本程序运营在Windows系统下,执行文献为:全国交通资讯系统.exe;双击运营程序后会显示控制台窗口,如图所示:输入操作命令“1”,进入管理员操作界面,输入1-5的操作命令可以执行相应的操作,如图所示:输入“2”操作命令则进入用户查询窗口,如图所示:输入“3”命令则显示整个交通网络.5.总结5.1李明月的总结在这次的课程设计中,我们抽中了这个全国交通征询系统,刚看完题目真的感觉无从下手,最后通过我们的讨论以及需求分析,我们这个系统所要用的结构重要是图,我被分到的模块重要是对整个这个交通系统的初始化,以及对城市信息的编辑,也就是对城市的添加和删除,尚有对整个系统的界面的操作。虽然看似简朴,但是对于我来说事实上很困难,由于我们这个要存储的信息比较复杂,所以不能单纯的每次都要进行由键盘进行输入,进行初始化,那么这就势必要用到文献操作。所以通过这次的时间让我对于文献的操作有了很大的提高。并且城市的信息的编辑也不是那么的简朴,当然添加还相对简朴一点,但是在做删除的时候真的很困难,要删除这个城市到别的地方的弧,还要删除别的城市到这个城市的航班链以及列车链。

在真的下手去做的时候,我真的碰到了好多问题。一方面就是在用文献对系统进行初始化的时候,一开始选错了函数,我选用的是fprintf进行由电脑输入到文献,但是在进行对航班和列车的信息添加的时候就没那么方便了,由于这个函数只能对简朴的类型进行操作,于是我改成了fwrite这个函数,通过无数次的尝试,以及上网搜集资料,终于可以成功的把我从键盘输入的信息传入到文献中了。然后开始尝试将自己存入到文献中的数据对建立的图的结构进行初始化,在这一步上我先把文献中存入的信息都依次读入到一个结构体数组中,然后再用这个结构体数组对图的相应的结构以及弧进行赋值,将相关的城市信息,列车信息以及飞机信息都存入到这个整个的结构中。在对城市进行删除的时候,一开始认为只要我把这个节点的相关信息删除掉,就是把这个城市的信息从这个交通网中删除掉了,但是当调试的时候才发现,这样是不对的,假如我只是删除了这个节点的信息,只是把这个城市到其他的地方的航班和列车信息删除了,但是并没有将别的城市到这个城市的一些航班,列车进行删除,怎么做都做不对,吕竹青和我做的功能想类似,通过我们两个的讨论以及搜集资料,最后功夫不负有心人,我们终于成功的把删除这一块给做了出来。当然在最后的调试中我们也碰到了各种各样的问题,由于各人都是分模块写的所以调试的时候有很大的困难,但是通过我们三个人不懈的努力,终于把各自写的模块像融合,这个系统成功的调试出来了,在这两周的课程设计中,我相信我们都收益良多。5.2刘璐璐的总结开始抽到我们做的题,题目是全国交通征询系统,重要实现城市以及航班的编辑以及最短时间,最少费用,最少中转次数。我是该小组的负责人,在抽到题目的前两天,我们做了具体的需求分析与分工,我们做的题目中重要用到的是第七章图的知识,实现各种功能的时候,用的算法都是书中的,只是结构很负责,我对第七章的算法比较熟悉,所以重要实现的是最小费用、最短时间、以及最少中转次数。最少时间和最少费用用到的算法是迪杰斯特拉算法。最少中转次数使用的是广度优先遍历。刚开始时我认为只是函数的简朴整合,但是在实验过程中,有很多函数的传递参数,在传参的时候出现了很多错误。在实现最少费用的时候权值是费用,但是在最少时间的时候权值是时间,题目的规定中时间是用两个整形进行存储的,要用用两点间的时间作为权值(需通过一些简朴的运算,用到达的时间减去刚开始的时间,但是时间不能简朴的相减,当小时不够减时和当分钟不够减时,应当进行相关的转化)。通过本次实验,我对网(带权图)的操作有了更深刻的理解。也对数据结构这门课在实际中的应用有了深刻的体会。同时,我也明白了要学好任何一门语言,基础要打牢,只有在坚实的基础上,以后在应用时才可以进行变通。最后,感谢杨老师在这学期的指导。5.3吕竹青的总结该课程设计我重要负责数据结构的构建,飞机航班的添加、删除,火车车次的添加、删除。(1)、数据结构的设计:一方面拿到题目就考虑到,必须有存储航班及车次信息的结构体(structVehide),重要涉及航班或车次号、费用、出发到达的时间。又考虑到每一个城市也许具有一个或多个航班,又创建了structinfolist里面涉及:与城市相邻的城市之间的航班信息及与该城市相连接的航班数目。然后总的结点为structArcNode里面涉及结点的下标,一个结点指针,尚有一个infolist变量。最后是存储城市的信息,structVNode里面涉及:城市的名称,两个结点指针(航班结点,车次结点)。紧接着创建交通系统图structALGraph(以邻接表为存储结构),里面涉及:结点数组,城市的个数,航班的个数,列车的个数。Structarc用于写入文档。其他的尚有临时建立的邻接表的结点结构,链队列结点结构,链队列信息结构,structLinkQueue里面涉及:指向链对结点类型的两个指针(尾指针,头指针)。(2)、添加航班或车次:存储结构由同组人员完毕,邻接表。输入要加入的车次或航班的编号,起始城市,目的城市,费用及出发到达的时间,运用广度遍历遍历邻接表,假如原先起始城市,目的城市无航班到达则直接插入到两则的next位置即可,若有就插入到最后的一个邻接的后面,last(通往该结点的航班的个数)分别加1。(3)、删除航班或车次:反复上面的输入,以广度优先遍历邻接表,找到要删除的航班或车次的下标(即找到了起始城市和目的城市),找到起始城市的那个航班或列车链,遍历到目的城市,从这个位置开始,后边的链结点向前移动一位,被删除的航班被覆盖,释放最后那各结点。通过两周的努力,小组查阅资料,向杨老师征询,终于把自己的系统完毕了,感触最深的是小组协作,虽然我们各自都分了模块,但是完毕的过程中我们都是在商议其实现的思想,其中又把数据结构这门课程系统的复习了一下,把整个学期学习的知识汇总了。参考文献:[1]《数据结构C语言版》严蔚敏、吴伟民,清华大学出版社,2023[2]《数据结构课程实验》徐孝凯,清华大学出版社,2023[3]《数据结构程序设计题典》李春葆,清华大学出版社,2023 附录:程序源代码intmain()//程序功能选择界面{ ALGraphG;inti;printf("\t\t***********************************************\t\t"); printf("\n\n\n\n\n");printf("尊敬的用户,你好!\n\n\n");printf("欢迎进入全国交通征询系统.\n\n\n"); printf("在这里我们将为您提供最便捷,最优惠的出行方案.\n\n\n"); printf("\n\n\n"); printf("\t\t***********************************************\t\t"); printf("\n请您按任意键进入查询系统!\n\n"); system("pause"); system("cls"); printf("\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\t\t\n"); printf("\t\t1、管理员登陆\t\t\n"); printf("\t\t2、用户查询\t\t\n"); printf("\t\t3、显示交通系统\t\t\n"); printf("\t\t4、退出系统\t\t\n"); printf("\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\t\t\n"); printf("\t\t请输入您要进行的操作:"); scanf("%d",&i); getchar(); system("cls"); while(i!=4)//只要没有退出选择退出系统就可以一直执行下去 {switch(i) {case1:Administer(&G);break;case2:UserDemand(G);break;case3:PrintGraph(&G);break; } printf("\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\t\t\n"); printf("\t\t1、管理员登陆\t\t\n"); printf("\t\t2、用户查询\t\t\n"); printf("\t\t3、显示交通系统\t\t\n"); printf("\t\t4、退出系统\t\t\n"); printf("\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\t\t\n"); printf("\t\t请您对的输入您要进行的操作:"); scanf("%d",&i);getchar(); system("cls"); } return1;}voidAdminister(ALGraph*G)//管理员管理项目选择界面{ inti;printf("\n\n\n"); printf("\t\t尊敬的管理员,请您选择您要进行的操作:\t\t\n\n");printf("\t\t***********************************************\t\t\n"); printf("\t\t1、初始化交通系统;\t\t\n"); printf("\t\t2、城市信息编辑;\t\t\n"); printf("\t\t3、航班班次编辑;\t\t\n"); printf("\t\t4、列车车次编辑;\t\t\n"); printf("\t\t5、退出管理员登录;\t\t\n"); printf("\t\t***********************************************\t\t\n"); printf("\t\t请您输入您要进行的操作:"); scanf("%d",&i);getchar(); system("cls"); while(i!=5) { switch(i) { case1:InitGraph(G);break;//初始化交通系统case2:CityEdit(G);break;//城市编辑case3:flightedit(G);break;//飞机航班编辑case4:trainedit(G);break;//列车车次编辑 } printf("请您按回车键继续:"); getchar();printf("\n\n\n");printf("\n\n\n");printf("\t\t***********************************************\t\t\n"); printf("\t\t请选择操作:\t\t\n"); printf("\t\t1、初始化交通系统;\t\t\n"); printf("\t\t2、城市信息编辑;\t\t\n"); printf("\t\t3、航班航班编辑;\t\t\n"); printf("\t\t4、列车车次编辑;\t\t\n"); printf("\t\t5、退出管理员登录;\t\t\n"); printf("\t\t***********************************************\t\t\n"); printf("\t\t请您输入您要进行的操作:"); scanf("%d",&i);getchar(); system("cls"); }}voidInitGraph(ALGraph*G)//初始化交通系统{ inti;system("cls");printf("\n\n\n"); printf("\n\n\n"); printf("\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\t\t\n"); printf("\t\t1、用键盘输入\t\t\n\n"); printf("\t\t2、用文献导入\t\t\n"); printf("\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\t\t\n"); printf("\t\t请您输入您要进行的操作:");scanf("%d",&i);getchar();system("cls");switch(i) { case1: CreateCityFile();CreatePlaneFile();CreateTrainFile();CreateGraph(G);break;case2:CreateGraph(G);break; }}voidCreateCityFile()//创建城市名称文档{ inti=0;intj;charflag='y';FILE*fp;//定义一个指向文献型数据的指针变量printf("\n请输入城市名称的信息:\n");while(flag=='y'||flag=='Y') { printf("城市名称:");gets(city[i]);//输入一个城市名i++;printf("继续输入?(Y/N)");scanf("%c",&flag);getchar(); }printf("\n");if((fp=fopen("city.txt","wb"))==NULL) { printf("无法打开文献!\n");return; }for(j=0;j<i;j++)fprintf(fp,"%10s",city[j]);//把用键盘输入的城市名输出到fp所指向的文献中fclose(fp);//关闭文献}voidCreatePlaneFile()//创建飞机航班文档{ inti,count,code,bt[2],at[2];//code航班编号,bt出发时间,at到达时间floatmoney;//费用charvt[10],vh[10],flag;//vt起始城市,vh目的城市FILE*fp;flag='y';count=0;while(flag=='Y'||flag=='y')/*flag为标志位,初值为1*/ { printf("请输入飞机航班的信息:\n");//提醒"输入航班信息"printf("飞机航班编号:");//输入航班codescanf("%d",&code);getchar();printf("起始城市:");//输入航班的出发城市vtgets(vt);printf("目的城市:");//输入航班的到达城市vhgets(vh);printf("航班费用:");//输入机票价格moneyscanf("%f",&money);getchar();printf("起飞时间:");//输入航班的出发时间btscanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60) { printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&bt[0],&bt[1]);getchar(); }printf("到达时间:");//输入航班的到达时间atscanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60) { printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&at[0],&at[1]);getchar(); }a[count].co=code;//a为程序头部定义的结构体strcpy(a[count].vt,vt);strcpy(a[count].vh,vh);a[count].bt[0]=bt[0];a[count].bt[1]=bt[1];a[count].at[0]=at[0];a[count].at[1]=at[1];a[count].mo=money;count++;//计数值count+1printf("继续输入?(Y/N)");//提醒"是否要继续输入航班信息:"scanf("%c",&flag);getchar();printf("\n"); }if((fp=fopen("plane.txt","wb"))==NULL)//航班文献不能以读写形式打开printf("\n无法打开文献!\n");//提醒"无法打开文献"fprintf(fp,"%d",count);//将计数值count写入航班车文献for(i=0;i<count;i++)if(fwrite(&a[i],sizeof(structarc),1,fp)!=1)//无法将a[i]写入航班文献printf("\n文献写入错误!\n");//提醒"文献无法写入"fclose(fp);//关闭航班文献}voidCreateTrainFile()//创建列车车次文档{ inti,count=0,code,bt[2],at[2];floatmoney;charvt[10],vh[10],flag;FILE*fp;flag='y';while(flag=='y'||flag=='Y') { printf("请输入列车车次的信息:\n");printf("列车车次编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);printf("目的城市:");gets(vh);printf("车次费用:");scanf("%f",&money);getchar();printf("发车时间:");scanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60) { printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&bt[0],&bt[1]);getchar(); }printf("到达时间:");scanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60) { printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&at[0],&at[1]);getchar(); }a[count].co=code;strcpy(a[count].vt,vt);strcpy(a[count].vh,vh); a[count].bt[0]=bt[0]; a[count].bt[1]=bt[1]; a[count].at[0]=at[0]; a[count].at[1]=at[1]; a[count].mo=money; count++; printf("继续输入?(Y/N)"); scanf("%c",&flag); getchar(); printf("\n"); } if((fp=fopen("train.txt","wb"))==NULL) printf("\n无法打开文献!\n"); fprintf(fp,"%d",count); for(i=0;i<count;i++) if(fwrite(&a[i],sizeof(structarc),1,fp)!=1) printf("\n文献写入错误!\n");fclose(fp);}intLocateVertex(ALGraph*G,char*v)//找出城市名在图中相应结点位置{intj,k;j=-1;for(k=0;k<G->vexnum;k++)if(strcmp(G->vertices[k].cityname,v)==0)//第k个结点中的城市名与传过来的城市名相同{j=k;/*记录位置*/break;}return(j);}voidCreateGraph(ALGraph*G)//用city,plan,train三个文档创建城市交通系统{ inti,j,k;intarc_num;intcount1,count2;intm,t;ArcNode*p,*q;FILE*fp;i=0;if((fp=fopen("city.txt","rb"))==NULL)//打开城市文献,文献指针返回值为空 { printf("\n无法打开文献!\n");return; }while(!feof(fp))//文献不为空 { fscanf(fp,"%10s",city[i]);//从磁盘文献读取一个字符串格式的值赋给city[i]i++; }fclose(fp);//关闭文献j=0;while(j<i) { strcpy(G->vertices[j].cityname,city[j]);//将city[i]中的内容复制到图的结构体的结点数组中;G->vertices[j].planefirstarc=NULL;//图的结构体其他项赋初值;G->vertices[j].trainfirstarc=NULL;j++; }G->vexnum=i;if((fp=fopen("plane.txt","rb"))==NULL)printf("\n无法打开文献!\n");k=0;fscanf(fp,"%d",&count1);//打开航班信息文献"plane.txt"while(k<count1) { if(fread(&a[k],sizeof(structarc),1,fp)!=1)printf("\n文献读入错误!\n");k++; }fclose(fp);//关闭文献k=0;//a的计数变量k=0arc_num=0;//弧的计数变量arc_num=0while(k<count1) { i=LocateVertex(G,a[k].vt);//调用函数LocateVertex(G,a[k].vt)得到起始结点的位置ij=LocateVertex(G,a[k].vh);//调用函数LocateVertex(G,a[k].vh)得到起始结点的位置jq=G->vertices[i].planefirstarc;m=0;while(q!=NULL) { if(q->adjvex==j)//弧q中的邻接顶点与j相等 { t=q->info.last+1;//将数组a[i]中的内容都复制到弧q中q->info.stata[t].number=a[k].co;q->info.stata[t].expenditure=a[k].mo;q->info.stata[t].begintime[0]=a[k].bt[0];q->info.stata[t].begintime[1]=a[k].bt[1];q->info.stata[t].arrivetime[0]=a[k].at[0];q->info.stata[t].arrivetime[1]=a[k].at[1];q->info.last=t;m=1;break; }q=q->nextarc; }if(m==0) { p=(ArcNode*)malloc(sizeof(ArcNode));//开辟一个弧结点p->adjvex=j;//将数组a[i]中的内容都复制到新的弧结点中p->info.stata[0].number=a[k].co;p->info.stata[0].expenditure=a[k].mo;p->info.stata[0].begintime[0]=a[k].bt[0];p->info.stata[0].begintime[1]=a[k].bt[1];p->info.stata[0].arrivetime[0]=a[k].at[0];p->info.stata[0].arrivetime[1]=a[k].at[1];p->info.last=0;p->nextarc=G->vertices[i].planefirstarc;G->vertices[i].planefirstarc=p;//将弧结点连接到适当的位置中去arc_num++; }k++; }G->planearcnum=arc_num;if((fp=fopen("train.txt","rb"))==NULL) { printf("\n无法打开文献!\n");return; }k=0;fscanf(fp,"%d",&count2);//打开列车信息文献"plane.txt"while(k<count2) { if(fread(&a[k],sizeof(structarc),1,fp)!=1)printf("\n文献读入错误!\n");k++; }fclose(fp);//关闭文献k=0;//a的计数变量k=0;arc_num=0;//弧的计数变量arc_num=0;while(k<count2) { i=LocateVertex(G,a[k].vt);//调用函数LocateVertex(G,a[k].vt)得到起始结点的位置ij=LocateVertex(G,a[k].vh);//调用函数LocateVertex(G,a[k].vh)得到起始结点的位置jq=G->vertices[i].trainfirstarc;m=0;while(q!=NULL) { if(q->adjvex==j)//弧q中的邻接顶点与j相等 { t=q->info.last+1;//将数组a[i]中的内容都复制到弧q中q->info.stata[t].number=a[k].co;q->info.stata[t].expenditure=a[k].mo;q->info.stata[t].begintime[0]=a[k].bt[0];q->info.stata[t].begintime[1]=a[k].bt[1];q->info.stata[t].arrivetime[0]=a[k].at[0];q->info.stata[t].arrivetime[1]=a[k].at[1];q->info.last=t;m=1;break; }q=q->nextarc; }if(m==0) { p=(ArcNode*)malloc(sizeof(ArcNode));//开辟一个弧结点p->adjvex=j;//将数组a[i]中的内容都复制到新的弧结点中p->info.stata[0].number=a[k].co;p->info.stata[0].expenditure=a[k].mo;p->info.stata[0].begintime[0]=a[k].bt[0];p->info.stata[0].begintime[1]=a[k].bt[1];p->info.stata[0].arrivetime[0]=a[k].at[0];p->info.stata[0].arrivetime[1]=a[k].at[1];p->info.last=0;p->nextarc=G->vertices[i].trainfirstarc;G->vertices[i].trainfirstarc=p;//将弧结点连接到适当的位置中去 arc_num++; }k++; }G->trainarcnum=arc_num;}intsave(ALGraph*G)//保存城市交通系统到相应的文档{inti,j,k,t;ArcNode*q;FILE*fp;j=0;while(j<G->vexnum){strcpy(city[j],G->vertices[j].cityname);j++;}i=0;if((fp=fopen("city.txt","wb"))==NULL)printf("\n错误,无法打开文献!\n");while(i<G->vexnum){fprintf(fp,"%10s",city[i]);i++;}fclose(fp);k=0;for(i=0;i<G->vexnum;i++){q=G->vertices[i].planefirstarc;while(q!=NULL){for(t=0;t<=q->info.last;t++){strcpy(a[k].vt,G->vertices[i].cityname);strcpy(a[k].vh,G->vertices[q->adjvex].cityname);a[k].co=q->info.stata[t].number;a[k].mo=q->info.stata[t].expenditure;a[k].bt[0]=q->info.stata[t].begintime[0];a[k].bt[1]=q->info.stata[t].begintime[1];a[k].at[0]=q->info.stata[t].arrivetime[0];a[k].at[1]=q->info.stata[t].arrivetime[1];k++;}q=q->nextarc;}}if((fp=fopen("plane.txt","wb"))==NULL){printf("\n无法打开文献!\n");return0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(structarc),1,fp)!=1)printf("\n文献写入错误!\n");i++;}fclose(fp);k=0;for(i=0;i<G->vexnum;i++){q=G->vertices[i].trainfirstarc;while(q!=NULL){for(t=0;t<=q->info.last;t++){strcpy(a[k].vt,G->vertices[i].cityname);strcpy(a[k].vh,G->vertices[q->adjvex].cityname);a[k].co=q->info.stata[t].number;a[k].mo=q->info.stata[t].expenditure;a[k].bt[0]=q->info.stata[t].begintime[0];a[k].bt[1]=q->info.stata[t].begintime[1];a[k].at[0]=q->info.stata[t].arrivetime[0];a[k].at[1]=q->info.stata[t].arrivetime[1];k++;}q=q->nextarc;}}if((fp=fopen("train.txt","wb"))==NULL){printf("\n无法打开文献!\n");return0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(structarc),1,fp)!=1)printf("\n文献写入错误!\n");i++;}fclose(fp);return1;}voidCityEdit(ALGraph*G)//城市编辑项目选择界面{inti;system("cls");printf("\n请选择城市编辑项目:\n");printf("1.增长城市\n2.删除城市\n");printf("选择:");scanf("%d",&i);getchar();system("cls");if(i==1)EnterVertex(G);if(i==2)DeleteVertex(G);}voidEnterVertex(ALGraph*G)//增长城市{charv[10],c;inti;system("cls");printf("\n请输入新增城市的名称:");gets(v);i=LocateVertex(G,v);if(i>=0&&i<G->vexnum){printf("\n错误!此城市已存在\n");return;}else{printf("\n确认?(Y/N)");c=getchar();//getchar();if(c=='Y'||c=='y'){i=G->vexnum;strcpy(G->vertices[i].cityname,v);G->vertices[i].planefirstarc=NULL;G->vertices[i].trainfirstarc=NULL;G->vexnum=i+1;save(G);}elsereturn;}}voidDeleteVertex(ALGraph*G)//删除城市{inti,j,k,n;charv[10],c;ArcNode*p,*q,*m;system("cls");printf("\n请输入删除的城市:");//提醒"输入删除城市名"gets(v);printf("\n确认?(Y/N)");//提醒"是否拟定要删除(Y/N)"c=getchar();getchar();if(c=='Y'||c=='y'){n=0;//0是记数标志,控制循环次数while(n<G->vexnum&&strcmp(G->vertices[n].cityname,v)!=0)//n<图G表头接点总个数&&图G的存储城市名与v不同,G表头结点总个数比实际大1n++;//记数值n+1if(n==G->vexnum)//n==图G表头结点总个数printf("\n错误!无法找到此城市!\n");//提醒"无法找到此城市"else{i=LocateVertex(G,v);//运用G函数找到此城市名所处在G中位置p=G->vertices[i].planefirstarc;while(p!=NULL){q=p;p=p->nextarc;free(q);//删除从此结点出发的所有航班弧}p=G->vertices[i].trainfirstarc;while(p!=NULL){q=p;p=p->nextarc;free(q);//删除从此结点出发的所有列车弧}for(j=i;j<G->vexnum-1;j++){strcpy(G->vertices[j].cityname,G->vertices[j+1].cityname);//将G第j个结点的信息依前移1位G->vertices[j].planefirstarc=G->vertices[j+1].planefirstarc;G->vertices[j].trainfirstarc=G->vertices[j+1].trainfirstarc;}G->vertices[j].planefirstarc=NULL;//将G第j个结点的信息置空G->vertices[j].trainfirstarc=NULL;for(k=0;k<G->vexnum-1;k++)//以下是删除所有指向此结点的航班弧{p=G->vertices[k].planefirstarc;while(p!=NULL){if(p->adjvex>i){p->adjvex=p->adjvex-1;q=p;p=p->nextarc;//p指向下一条飞机弧}elseif(p->adjvex==i)//该弧指向的顶点位置(p->adjvex)==i{if(p==G->vertices[k].planefirstarc)//p指向图G中k结点的第一条飞机弧{m=p;G->vertices[k].planefirstarc=p->nextarc;//将图G中k结点的第二条飞机弧改为第一弧p=p->nextarc;//p指向下一条飞机弧free(m);//释放(m)}else{q->nextarc=p->nextarc;//将p的下一条弧赋给q的下一条弧m=p;p=p->nextarc;//p指向下一条飞机弧free(q);//释放(q)}}else{q=p;p=p->nextarc;//p指向下一条飞机弧}}}for(k=0;k<G->vexnum-1;k++)///*以下是删除所有指向此结点的列车弧*/{p=G->vertices[k].trainfirstarc;//p指向图G中k结点的第一条列车弧while(p!=NULL){if(p->adjvex>i)//该弧指向的顶点位置(p->adjvex)>i{p->adjvex=p->adjvex-1;//将该弧指向顶点位置-1q=p;p=p->nextarc;//p指向下一条列车弧}elseif(p->adjvex==i)//该弧指向的顶点位置(p->adjvex)==i{if(p==G->vertices[k].trainfirstarc)//p指向图G中k结点的第一条列车{m=p;G->vertices[k].trainfirstarc=p->nextarc;//将图G中k结点的第二条列车弧改为第一弧p=p->nextarc;free(m);}else{q->nextarc=p->nextarc;m=p;p=p->nextarc;free(q);}}else{q=p;p=p->nextarc;}}}}G->vexnum--;save(G);}elsereturn;}voidflightedit(ALGraph*G)//飞机航班编辑项目选择界面{inti;printf("\n请选择飞机航班编辑项目:\n");printf("1.新增航班\n2.删除航班\n");printf("选择:");scanf("%d",&i);getchar();if(i==1)EnterplaneArc(G);if(i==2)DeleteplaneArc(G);}voidtrainedit(ALGraph*G)//列车车次编辑项目选择界面{inti;printf("\n请选择列车车次编辑项目:\n");printf("1.新增车次\n2.删除车次\n");printf("选择:");scanf("%d",&i);getchar();if(i==1)EntertrainArc(G);if(i==2)DeletetrainArc(G);}voidEnterplaneArc(ALGraph*G)//增长飞机航班{inti,j,bt[2],at[2];intcode;floatmoney;intm,t;charvt[10],vh[10],c;ArcNode*p,*q;system("cls");printf("\n请输入新增飞机航班的信息:\n");printf("飞机航班编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);printf("目的城市:");gets(vh);printf("航班费用:");scanf("%f",&money);getchar();printf("起飞时间:");scanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60){printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&bt[0],&bt[1]);getchar();}printf("到达时间:");scanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60){printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&at[0],&at[1]);getchar();}printf("\n确认?(Y/N)");c=getchar();getchar();if(c=='Y'||c=='y'){i=LocateVertex(G,vt);j=LocateVertex(G,vh);if(i==-1){printf("\n错误!无法找到起始城市\n");return;}if(j==-1){printf("\n错误!无法找到到达城市\n");return;}q=G->vertices[i].planefirstarc;m=0;while(q!=NULL){if(q->adjvex==j){t=q->info.last+1;q->info.stata[t].number=code;q->info.stata[t].expenditure=money;q->info.stata[t].begintime[0]=bt[0];q->info.stata[t].begintime[1]=bt[1];q->info.stata[t].arrivetime[0]=at[0];q->info.stata[t].arrivetime[1]=at[1];q->info.last=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;p->info.stata[0].number=code;p->info.stata[0].expenditure=money;p->info.stata[0].begintime[0]=bt[0];p->info.stata[0].begintime[1]=bt[1];p->info.stata[0].arrivetime[0]=at[0];p->info.stata[0].arrivetime[1]=at[1];p->info.last=0;p->nextarc=G->vertices[i].planefirstarc;G->vertices[i].planefirstarc=p;G->planearcnum++;}save(G);}elsereturn;}voidEntertrainArc(ALGraph*G)//增长列车车次{inti,j,bt[2],at[2];intcode;floatmoney;intm,t;charvt[10],vh[10],c;ArcNode*p,*q;system("cls");printf("\n请输入新增列车车次的信息:\n");printf("列车车次编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);printf("目的城市:");gets(vh);printf("车次费用:");scanf("%f",&money);getchar();printf("发车时间:");scanf("%d:%d",&bt[0],&bt[

温馨提示

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

评论

0/150

提交评论