全国交通咨询系统设计C语言
数据结构课程设计报告全国交通咨询系统
.郑州工业应用技术学院课程设计任务书题目全国交通资询系统主要内容:设计了一个方便用户查询交通咨询系统。
该系统所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。
该系统可以进行城市,列车车次和飞机航班的编辑的基本信息输入操作。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。
基本要求:1、掌握C语言的变量及函数的灵活使用;2、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;3、掌握C语言中文件的基本操作;4、掌握VC++6.0软件的熟练使用。
主要参考资料:[1] 李春葆.数据结构程序设计[M].北京:清华大学出版社,2002,03[2] 王黎,袁永康战略[M].北京:清华大学出版社,2002,01[3] 谭浩强.C程序设计第二版[M].北京:清华大学出版社,2003,03[4] 任哲.MFC Windows程序设计[M].北京:清华大学出版社,2004,06完成期限:2016.12.05—2017.01.05指导教师签名:课程负责人签名:随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。
对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。
在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。
尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。
即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。
为此开发一个交通择优系统是十分必要的。
采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规范化和自动化。
全国交通咨询模拟系统C实现课程设计报告
全国交通咨询模拟一、设计目的掌握线性表、栈、图结构和对文件的操作,学习屏幕编辑和菜单技术,掌握用最短路径及其搜索算法编制较综合性的程序,能用图的邻接存储结构求解最优路线问题,解决有关实际问题。
得到软件设计技能的训练。
二、问题描述交通咨询模拟。
根据旅客的不同需要,要考虑到旅客希望在旅途中的时间尽可能短、希望旅费尽可能省等的要求。
旅途用火车或飞机作为交通工具。
用计算机编制程序,为旅客提供两种最优决策的交通咨询系统。
三、基本要求1、对城市信息(城市名、城市间的里程)进行编辑:具备添加、修改、删除功能;2、对城市间的两种交通工具:飞机和火车。
对飞机航班和列车时刻表进行编辑:里程、航班和列车班次的添加、修改、删除;3、提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具,可以不考虑回程;4、旅途中的耗费的总时间应包括中转站的等候时间。
其中飞机至少二小时,火车至少一小时;5、咨询以用户和计算机对话方式进行,要注意人机交互的屏幕界面。
由用户选择最优决策原则和交通工具,输入起始站、终点站、出发时间,输出信息:最快需要多长时间才能到达及旅费,或者最少需要多少旅费才能到达及时间,并详细说明依次于何时何地乘坐哪一趟班机或列车何时到达何地。
四、实现提示1、算法思路(1) 数据存储。
城市信息(城市名、代码)、交通信息(城市间的里程、各航班和列车时刻)存储于磁盘文件。
建议把城市信息存于文件前面,交通信息存于文件的后面,用fread和fwrite函数操作。
(2) 数据的逻辑结构。
根据设计任务的描述,其城市之间的旅游交通问题是典型的图结构,可看作为有向图,图的顶点是城市,边是城市之间所耗费的时间(要包括中转站的等候时间)或旅费。
(3) 数据的存储结构。
采用邻接表和邻接矩阵都可作为数据的存储结构,但当邻接边不多时,宜采用邻接表,以提高空间的存储效率。
这里建议采用邻接表作为数据的存储结构。
(4) 用不同的功能模块对城市信息和交通信息进行编辑。
交通图咨询查询系统数据结构(C语言)
信息科学与工程学院《结构数据》课程设计报告课程设计名称:交通咨询系统专业班级 : 计算机xxx学生姓名 : xxx学号: 2015xxxx指导教师 : xx课程设计时间:2016。
07.04—2016.07.08计算机应用技术专业课程设计任务书说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页填表说明1.“课题性质”一栏:A.工程设计;B.工程技术研究;C.软件工程(如CAI课题等);D.文献型综述;E.其它。
2.“课题来源"一栏:A.自然科学基金与部、省、市级以上科研课题;B.企、事业单位委托课题;C.校、院(系、部)级基金课题;D.自拟课题。
目录1 需求分析 01。
1 添加交通图信息 01。
2 查询单源最短路径 01。
3 查询多源最短路径 01。
4 更新交通图信息 01.6 读取、保存信息 (1)2 概要设计 (2)2.1 数据类型的定义 (2)2.2 功能模块结构图 (3)3 运行环境 (6)4 开发工具和编程语言 (6)5 详细设计 (7)5。
1 图结构的基本操作 (7)5。
1。
1添加城市结点和路径结点 (8)5。
1.2修改城市结点和路径结点 (8)5.1。
3删除城市结点和路径结点 (8)5。
1。
4退出保存 (8)5。
2 迪杰斯特拉算法的实现 (8)5.2。
1 迪杰斯特拉算法函数 (8)5.2.2 提取迪杰斯特拉函数信息 (8)5.2。
3 求多源最短路径 (8)6 程序编码 (9)7 运行结果 (39)8 心得体会 (45)9参考文献 (46)1需求分析本系统中的数据来源于标准输入设备(如键盘)和文件,可以实现对交通图城市、城市到其余城市的距离的操作,根据需要可查询某两个城市之间的最短距离、城市到各城市的最短距离,各个城市到各个城市的最短距离,以及路径。
本系统要实现的功能有:添加城市和城市间距离,删除城市及城市间距离,修改城市间距离,查询城市间的最短路径,查询某个城市到某个城市的最短路径。
数据结构课程设计全国交通咨询系统
.郑州工业应用技术学院课程设计任务书题目全国交通资询系统主要内容:设计了一个方便用户查询交通咨询系统。
该系统所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。
该系统可以进行城市,列车车次和飞机航班的编辑的基本信息输入操作。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。
基本要求:1、掌握C语言的变量及函数的灵活使用;2、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;3、掌握C语言中文件的基本操作;4、掌握VC++6.0软件的熟练使用。
主要参考资料:[1] 李春葆.数据结构程序设计[M].北京:清华大学出版社,2002,03[2] 王黎,袁永康战略[M].北京:清华大学出版社,2002,01[3] 谭浩强.C程序设计第二版[M].北京:清华大学出版社,2003,03[4] 任哲.MFC Windows程序设计[M].北京:清华大学出版社,2004,06完成期限:2016.12.05—2017.01.05指导教师签名:课程负责人签名:随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。
对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。
在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。
尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。
即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。
为此开发一个交通择优系统是十分必要的。
采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规范化和自动化。
数据结构课程设计全国交通咨询系统
.郑州工业应用技术学院课程设计任务书题目全国交通资询系统主要内容:设计了一个方便用户查询交通咨询系统。
该系统所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。
该系统可以进行城市,列车车次和飞机航班的编辑的基本信息输入操作。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。
基本要求:1、掌握C语言的变量及函数的灵活使用;2、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;3、掌握C语言中文件的基本操作;4、掌握VC++6.0软件的熟练使用。
主要参考资料:[1] 李春葆.数据结构程序设计[M].北京:清华大学出版社,2002,03[2] 王黎,袁永康战略[M].北京:清华大学出版社,2002,01[3] 谭浩强.C程序设计第二版[M].北京:清华大学出版社,2003,03[4] 任哲.MFC Windows程序设计[M].北京:清华大学出版社,2004,06完成期限:2016.12.05—2017.01.05指导教师签名:课程负责人签名:随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。
对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。
在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。
尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。
即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。
为此开发一个交通择优系统是十分必要的。
采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规范化和自动化。
数据结构课程设计全国交通咨询系统方案
工业应用技术学院课程设计任务书题目全国交通资询系统主要容:设计了一个方便用户查询交通咨询系统。
该系统所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。
该系统可以进行城市,列车车次和飞机航班的编辑的基本信息输入操作。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。
基本要求:1、掌握C语言的变量及函数的灵活使用;2、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;3、掌握C语言中文件的基本操作;4、掌握VC++6.0软件的熟练使用。
主要参考资料:[1] 春葆.数据结构程序设计[M].:清华大学,2002,03[2] 王黎,袁永康战略[M].:清华大学,2002,01[3] 谭浩强.C程序设计第二版[M].:清华大学,2003,03[4] 任哲.MFC Windows程序设计[M].:清华大学,2004,06完成期限:2016.12.05—2017.01.05指导教师签名:课程负责人签名:随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。
对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。
在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。
尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。
即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。
为此开发一个交通择优系统是十分必要的。
采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规化和自动化。
实验报告C语言数据结构全国交通模拟咨询
浙江工商大学计算机与信息工程学院数据结构实验大作业报告专业:物流1001班级: 1001学号:姓名:金渐指导教师:庄毅2011年12月8日一、问题描述处于对不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则希望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
【基本要求】(1)提供对城市信息进行编辑(如:添加或删除)的功能。
(2)城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。
(3)提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具。
(4)旅途中耗费的总时间应该包括中转站的等候时间。
(5)咨询以用户和计算机的对话方式进行。
由用户输入起始站、终点站、最优决策原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
系统框图:模块说明:本系统共分1、23、4、删除城市5、添加列车6、添加航班7、删除列车或航班8、找出最小费用路线9、打印出最小费用路线10、初始化系统数据(读入内存)11、找出最快路线12、计算最快路线耗费的时间并打印13、计算最小费用路线14、主界面15、存储信息到文件16、退出下面是系统总流程图:下面是各模块示意图:三、系统测试1、主界面2、添加城市模块:输入命令 1 后,将提示输入城市名,而后返回主界面3、删除城市:输入命令2后,提示输入城市名,而后返回主界面4、添加交通路线:输入命令3,提示输入起点站和重点站,并提示选择火车或飞机,而后输入班次、出发时间、到达时间、票价,而后返回主界面原train文件:添加路线后:5、删除路线:输入命令4,输入班次,而后返回主界面原train文件:删除后ttrain文件:6、查询最小费用路线:输入命令5,并输入起点站和重点站,然后选择交通工具结果正确!7、查询时间最短路线:输入命令6,并输入起点站和重点站,然后选择交通工具四、小结从小学家里买了电脑起,我对计算机就相当感兴趣,有事没事就喜欢捣鼓捣鼓。
数据结构课程设计交通咨询系统2.cpp
头文件:(TrafficGraph.h)#ifndef TrafficGraph_h#define TrafficGraph_h#define dingdian 18#define NULL 0#define hu 100#define lujing 5#include"queue.h"#include"heap.h"#include<string.h>#include<conio.h>#include<fstream>char *ch[2]={"列车","航班"};template<class T>class Graph{struct EdgeNode{int dest;double cost;operator int(){return dest;}};typedef struct{char number[20];float expenditure;int begintime[2];int arrivetime[2];}qiche;typedef struct{qiche stata[lujing];int last;}infolist;typedef struct ArcNode{int adjvex;struct ArcNode *nextarc;infolist info;}ArcNode;typedef struct VNode{char cityname[10];ArcNode *planefirstarc,*trainfirstarc;}VNode,AdjList[dingdian];typedef struct{AdjList vertices;int vexnum,planearcnum,trainarcnum; }ALGraph;AdjList vertices;int vexnum,planearcnum,trainarcnum; typedef struct Node{int adjvex;int route;struct Node *next;}Node;typedef struct QNode{int adjvex;struct QNode *next;}QNode;typedef struct{QNode *front;QNode *rear;}LinkQueue;typedef struct TimeNode{int adjvex;int route;int begintime[2];int arrivetime[2];struct TimeNode *child[lujing];}TimeNode,*TimeTree;struct arc{char co[20];char vt[10];char vh[10];int bt[2];int at[2];float mo;}a[hu];char city[dingdian][10];int TTime[2],time[2],time1[2],time2[2];int c[dingdian],d[dingdian];public:Graph(){}~Graph(){}void guanliyuan();void cityedit();void CopyTimeTree(TimeTree p,TimeTree q);void createcityfile();void CreateGraph();void createplanefile();void CreateTimeTree(TimeTree p,int i,int j,LinkQueue *Q,infolist (*arcs)[dingdian]);void createtrainfile();void DeleteEdge(int j,T *code,ArcNode *E,char *ch);int DeleteplaneArc();void DeleteQueue(LinkQueue *Q,int *x);int DeletetrainArc();void DeleteVertex();void DemandDispose(int n);void DestoryTimeTree(TimeTree p);void EnterEdge(int j,int *bt,int *at,T *code,float money,ArcNode *E,int s);void EnterplaneArc();void EnterQueue(LinkQueue *Q,int x);void EntertrainArc();void EnterVertex();void ExpenditureDispose(int k,infolist (*arcs)[dingdian],int v0,int v1,float *M,int *final);void flightedit();//编辑航班void chushihua();//初始化系统void InitQueue(LinkQueue *Q);int IsEmpty(LinkQueue *Q);int LocateVertex(T *v);void MinExpenditure(infolist arcs,float *expenditure,int *route);void MinTime(infolist arcs,int *time,int *route);void PrintGraph();int save();void TimeDispose(int k,infolist (*arcs)[dingdian],int v0,int v1,int (*S)[2],int *final);void TimeTreeDispose(Node *head,infolist (*arcs)[dingdian]);void trainedit();void TransferDispose(int k,infolist (*arcs)[dingdian],int v0,int v1);void UserDemand();void VisitTimeTree(TimeTree p);};template<class T>void Graph<T>::guanliyuan(){int i=0;while(i!=5){system("cls");cout<<"\n\t\t\t【管理员管理】"<<endl;cout<<"\t\t*******************************"<<endl;cout<<"\t\t\t1=初始化交通系统"<<endl;cout<<"\t\t\t2=城市编辑"<<endl;cout<<"\t\t\t3=飞机航班编辑"<<endl;cout<<"\t\t\t4=列车车次编辑"<<endl;cout<<"\t\t\t5=返回上一级菜单"<<endl;cout<<"\t\t*******************************"<<endl;cout<<"\t\t请输入您的选择:";cin>>i;getchar();switch(i){case 1:chushihua();break;case 2:cityedit();break;case 3:flightedit();break;case 4:trainedit();break;}}}template<class T>void Graph<T>::chushihua(){system("cls");int i;cout<<"\n\t\t您想从哪儿初始化(键盘(1)或文档(2)):";cin>>i;getchar();switch(i){createcityfile();createplanefile();createtrainfile();CreateGraph();break;case 2:CreateGraph();break;}}template<class T>void Graph<T>::createcityfile()//新建“城市”文件{int i=0;int j;char flag='y';FILE *fp;cout<<"【请输入城市名称的信息】"<<endl;while(flag=='y'||flag=='Y'){cout<<"城市名称(小于10字符):";gets(city[i]);i++;cout<<"继续输入?(Y/N)";cin>>flag;getchar();}if((fp=fopen("city.txt","wb"))==NULL){cout<<"无法打开文件!"<<endl;return;}for(j=0; j<i; j++)fprintf(fp,"%10s",city[j]);fclose(fp);}template<class T>void Graph<T>::createplanefile()//新建“航班”文件{T code[20];int bt[2],at[2];float money;int i;char vt[10],vh[10],flag;FILE *fp;flag='y';count=0;while(flag=='Y'||flag=='y'){cout<<"【请输入飞机航班的信息】"<<endl;cout<<"飞机航班编号:";cin>>code;getchar();cout<<"起始城市:";gets(vt);cout<<"目的城市:";gets(vh);cout<<"航班费用:";cin>>money;getchar();cout<<"起飞时间:(时:分)";scanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60) {cout<<"时间输入有误,请重新输入:";scanf("%d:%d",&bt[0],&bt[1]);getchar();}cout<<"到达时间:(时:分)";scanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60){cout<<"时间输入有误,请重新输入:";scanf("%d:%d",&at[0],&at[1]);getchar();}strcpy(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++;cout<<"继续输入?(Y/N)";cin>>flag;getchar();}if((fp=fopen("plane.txt","wb"))==NULL)cout<<"无法打开文件!"<<endl;fprintf(fp,"%d",count);for(i=0; i<count; i++)if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)cout<<"文件写入错误!"<<endl;fclose(fp);}template<class T>void Graph<T>::createtrainfile(){T code[20];int bt[2],at[2];float money;int i;int count;char vt[10],vh[10],flag;FILE *fp;flag='y';count=0;while(flag=='y'||flag=='Y'){cout<<"【请输入列车车次的信息】"<<endl;cout<<"列车车次编号:";cin>>code;getchar();cout<<"起始城市:";gets(vt);cout<<"目的城市:";gets(vh);cout<<"车次费用:";cin>>money;getchar();cout<<"发车时间:(时:分)";scanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60){cout<<"时间输入有误,请重新输入:";scanf("%d:%d",&bt[0],&bt[1]);getchar();}cout<<"到达时间:(时:分)";scanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60){cout<<"时间输入有误,请重新输入:";scanf("%d:%d",&at[0],&at[1]);getchar();}strcpy(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++;cout<<"继续输入?(Y/N)";cin>>flag;getchar();}if((fp=fopen("train.txt","wb"))==NULL)cout<<"无法打开文件!"<<endl;fprintf(fp,"%d",count);for(i=0; i<count; i++)if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)cout<<"文件写入错误!"<<endl;fclose(fp);}template<class T>int Graph<T>::LocateVertex(T *v){int j,k;j=-1;for(k=0; k<vexnum; k++)if(strcmp(vertices[k].cityname,v)==0){j=k;break;}return j;}template<class T>void Graph<T>::CreateGraph(){int i,j,k;int arc_num;int count1,count2;int m,t;ArcNode *p,*q;FILE *fp;i=0;if((fp=fopen("city.txt","rb"))==NULL){cout<<"无法打开文件!"<<endl;return;}while(!feof(fp)){fscanf(fp,"%10s",city[i]);i++;}fclose(fp);j=0;while(j<i){strcpy(vertices[j].cityname,city[j]);vertices[j].planefirstarc=NULL;vertices[j].trainfirstarc=NULL;j++;}vexnum=i;if((fp=fopen("plane.txt","rb"))==NULL)cout<<"无法打开文件!"<<endl;k=0;fscanf(fp,"%d",&count1);while(k<count1){if(fread(&a[k],sizeof(struct arc),1,fp)!=1)cout<<"文件读取错误!"<<endl;k++;}fclose(fp);k=0;arc_num=0;while(k<count1){i=LocateVertex(a[k].vt);j=LocateVertex(a[k].vh);q=vertices[i].planefirstarc;m=0;while(q!=NULL){if(q->adjvex==j){t=q->st+1;strcpy(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->st=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;strcpy(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->st=0;p->nextarc=vertices[i].planefirstarc;vertices[i].planefirstarc=p;arc_num++;}k++;}planearcnum=arc_num;if((fp=fopen("train.txt","rb"))==NULL){cout<<"无法打开文件!"<<endl;return;}k=0;fscanf(fp,"%d",&count2);while(k<count2){if(fread(&a[k],sizeof(struct arc),1,fp)!=1)cout<<"文件读取错误!"<<endl;k++;}fclose(fp);k=0;arc_num=0;while(k<count2){i=LocateVertex(a[k].vt);j=LocateVertex(a[k].vh);q=vertices[i].trainfirstarc;m=0;while(q!=NULL){if(q->adjvex==j){t=q->st+1;strcpy(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->st=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;strcpy(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->st=0;p->nextarc=vertices[i].trainfirstarc;vertices[i].trainfirstarc=p;arc_num++;}k++;}trainarcnum=arc_num;}template<class T>int Graph<T>::save(){int i,j,k,t;ArcNode *q;FILE *fp;j=0;while(j<vexnum){strcpy(city[j],vertices[j].cityname);j++;}i=0;if((fp=fopen("city.txt","wb"))==NULL)cout<<"无法打开文件!"<<endl;while(i<vexnum){fprintf(fp,"%10s",city[i]);i++;}fclose(fp);k=0;for(i=0; i<vexnum; i++){q=vertices[i].planefirstarc;while(q!=NULL){for(t=0; t<=q->st; t++){strcpy(a[k].vt,vertices[i].cityname);strcpy(a[k].vh,vertices[q->adjvex].cityname);strcpy(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){cout<<"无法打开文件!"<<endl;return 0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)cout<<"文件写入错误!"<<endl;i++;}fclose(fp);k=0;for(i=0; i<vexnum; i++){q=vertices[i].trainfirstarc;while(q!=NULL){for(t=0; t<=q->st; t++){strcpy(a[k].vt,vertices[i].cityname);strcpy(a[k].vh,vertices[q->adjvex].cityname);strcpy(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){cout<<"无法打开文件!"<<endl;return 0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)cout<<"文件写入错误!"<<endl;i++;}fclose(fp);return 1;}template<class T>void Graph<T>::cityedit(){system("cls");int i;cout<<"您想(1=增加城市,2=删除城市):";cin>>i;getchar();if(i==1)EnterVertex();if(i==2)DeleteVertex();getchar();}template<class T>void Graph<T>::EnterVertex(){char v[10],c;int i;cout<<"请输入新增城市的名称:";gets(v);i=LocateVertex(v);if(i>=0&&i<vexnum){cout<<"此城市已存在,不能新增了。
数据结构课程设计报告全国交通咨询系统
.郑州工业应用技术学院课程设计任务书题目全国交通资询系统主要内容:设计了一个方便用户查询交通咨询系统。
该系统所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。
该系统可以进行城市,列车车次和飞机航班的编辑的基本信息输入操作。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。
基本要求:1、掌握C语言的变量及函数的灵活使用;2、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;3、掌握C语言中文件的基本操作;4、掌握VC++6.0软件的熟练使用。
主要参考资料:[1] 李春葆.数据结构程序设计[M].北京:清华大学出版社,2002,03[2] 王黎,袁永康战略[M].北京:清华大学出版社,2002,01[3] 谭浩强.C程序设计第二版[M].北京:清华大学出版社,2003,03[4] 任哲.MFC Windows程序设计[M].北京:清华大学出版社,2004,06完成期限:2016.12.05—2017.01.05指导教师签名:课程负责人签名:随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。
对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。
在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。
尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。
即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。
为此开发一个交通择优系统是十分必要的。
采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规范化和自动化。
最新全国交通咨询模拟程序设计资料
全国交通咨询模拟程序设计设计人:啊目录一、绪论 (1)二、实验实现功能 (2)三、概要设计 (2)四、详细设计 (3)五、程序 (10)六、运行结果 (54)七、小结 (56)一、绪论1、设计题目:全国交通咨询模拟2、设计目的1、掌握C语言中对文件的操作方法,巩固结构体数据的定义和使用方法2、进一步熟悉图的定义、存储方法、遍历、最小生成树的相关知识,灵活利用图的相关知识解决现实生活中的实际问题。
3、需求分析1、提供对城市信息进行编辑(如:添加或删除)的功能。
2、城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。
3、提供两种最优决策:最快到达和最省钱到达。
全程只考虑一种交通工具4、旅途中耗费的总时间应该包括中转站的等候时间。
4、概要设计1、设计一个类,包含城市、航班、列车的信息,并能对其进行添加或删除操作2、用户咨询系统包括城市、列车、航班信息,根据用户选择不同使用不同指针指向程序3、设计一个函数,能够提供时间、费用、中转(任意一个)在最少的情况下的信息二、实现功能功能结构图如下:三、概要设计系统用到的抽象数据类型定义:1).ADT Graph{数据对象V:一个集合,该集合中的所有元素具有相同的特性数据关系R:R={VR}VR={<x,y>|P(x,y)^(x,y属于V)}基本操作:(1)initgraph(&G);(2)CreateGraph(&G);(3)EnterVertex(&G);(4)DeleteVertex(&G);(5)EnterplaneArc(&G);(6)DeleteplanArc(&G);(7)EntertrainArc(&G);(8)DeletetrainArc(&G);}ADT Graph2).ADT LinkQueue{数据元素:可以是任意类型的数据,但必须属于同一个数据对象关系:队列中数据元素之间是线性关系。
全国交通咨询系统设计
/* *建立一个模拟的交通网络(用有向网来表示),编程实现从某个城市 *出发到另一个城市所需的最短的时间及路径。
* *建立一个模拟的交通网络(用有向网来表示),编程实现从某个城市 *出发到另一个城市所需的最短的时间及路径。
* */ #define MAX_VERTEX_NUM 18#define NULL 0#define MAX_ARC_SIZE 100#define MAX_ROUTE_NUM 5#include""#include""#include""#define False 0#define True 1#define INFINITY 10000 /*预定义*/typedef struct {int number;float expenditure;int begintime[2];int arrivetime[2];}Vehide;typedef struct {Vehide stata[MAX_ROUTE_NUM];int last;}infolist;typedef struct ArcNode {int adjvex;struct ArcNode *nextarc;infolist info;}ArcNode;typedef struct VNode {char cityname[10];ArcNode *planefirstarc,*trainfirstarc;}VNode,AdjList[MAX_VERTEX_NUM];typedef struct {AdjList vertices;int vexnum,planearcnum,trainarcnum;}ALGraph;typedef struct Node {int adjvex;int route;struct Node *next;}Node;typedef struct QNode {int adjvex;struct QNode *next;}QNode;typedef struct {QNode *front;QNode *rear;}LinkQueue;typedef struct TimeNode {int adjvex;int route;int begintime[2];int arrivetime[2];struct TimeNode *child[MAX_ROUTE_NUM];}TimeNode,*TimeTree;struct arc {int co;char vt[10];char vh[10];int bt[2];int at[2];float mo;}a[MAX_ARC_SIZE]; /*数据结构定义*/char city[MAX_VERTEX_NUM][10];int TTime[2];int time[2];int time1[2];int time2[2];int c[MAX_VERTEX_NUM];int d[MAX_VERTEX_NUM]; /*变量定义*//*各种操作说明*/void Disp();void Administer(ALGraph *G);void cityedit(ALGraph *G);void CopyTimeTree(TimeTree p,TimeTree q);void createcityfile();void CreateGraph(ALGraph *G);void createplanefile();void CreateTimeTree(TimeTree p,int i,int j,LinkQueue *Q,infolist (*arcs)[MAX_VERTEX_NUM]);void createtrainfile();int DeleteplaneArc(ALGraph *G);void DeleteQueue(LinkQueue *Q,int *x);int DeletetrainArc(ALGraph *G);void DeleteVertex(ALGraph *G);void DemandDispose(int n,ALGraph G);void DestoryTimeTree(TimeTree p);void EnterplaneArc(ALGraph *G);void EnterQueue(LinkQueue *Q,int x);void EntertrainArc(ALGraph *G);void EnterVertex(ALGraph *G);void ExpenditureDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1,float *M,int *final);void flightedit(ALGraph *G);void initgraph(ALGraph *G);void InitQueue(LinkQueue *Q);int IsEmpty(LinkQueue *Q);int LocateVertex(ALGraph *G,char *v);void MinExpenditure(infolist arcs,float *expenditure,int *route);void MinTime(infolist arcs,int *time,int *route);void PrintGraph(ALGraph *G);int save(ALGraph *G);void TimeDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,intv0,int v1,int (*T)[2],int *final);void TimeTreeDispose(Node *head,infolist (*arcs)[MAX_VERTEX_NUM]);void trainedit(ALGraph *G);void TransferDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1);void UserDemand(ALGraph G);void VisitTimeTree(TimeTree p);void Disp() /*软件入口,显示函数*/{textbackground(7);textcolor(5);gotoxy(20,10);printf("--------------------------------\n");gotoxy(20,11);printf("| 交通咨询系统 Version |\n");gotoxy(20,12);printf("| |\n");gotoxy(20,13);printf("| 一叶方舟 |\n");gotoxy(20,14);printf("| |\n");gotoxy(20,15);printf("--------------------------------\n");gotoxy(40,20);printf("^_^ 欢迎使用 ^_^");sleep(3);clrscr();}int main() /*主函数,程序入口*//* 显示程序功能选择界面 */{ALGraph G;int i;textbackground(7);textcolor(5);clrscr();Disp();printf("请选择程序功能:\n");printf("*************************************\n"); printf("** 1=管理员管理 **\n");printf("** 2=用户咨询 **\n");printf("** 3=显示交通系统 **\n");printf("** 4=退出 **\n");printf("*************************************\n"); printf("请选择");scanf("%d",&i);getchar();while(i!=4){clrscr();switch(i){case 1:Administer(&G);break;case 2:UserDemand(G);break;case 3:PrintGraph(&G);break;}printf("\n请选择程序功能:\n");printf("*************************************\n"); printf("** 1=管理员管理 **\n");printf("** 2=用户咨询 **\n");printf("** 3=显示交通系统 **\n");printf("** 4=退出 **\n");printf("*************************************\n"); printf("选择");scanf("%d",&i);getchar();}clrscr();gotoxy(20,10);printf("--------------------------------\n");gotoxy(20,11);printf("| 指导老师:夏汉民老师 |\n");gotoxy(20,12);printf("| |\n");gotoxy(20,13);printf("| 制作:李济舟 |\n");gotoxy(20,14);printf("| |\n");gotoxy(20,15);printf("--------------------------------\n");gotoxy(40,20);printf("谢谢使用");sleep(1);gotoxy(40,20);printf("正在退出");for(i=0;i<3;i++){ printf(".");sleep(i);}return 0;}void Administer(ALGraph *G) /* 显示管理员管理项目选择界面 */ {int i,j=0;char password[5];be:clrscr();gotoxy(20,10);printf("-------------------------------------\n");gotoxy(20,11);printf("| 管理员管理项目 |\n");gotoxy(20,13);printf("| 1.初始化交通系统 |\n");gotoxy(20,15);printf("| 2.城市编辑 |\n");gotoxy(20,17);printf("| 3.飞机航班编辑 |\n");gotoxy(20,19);printf("| 4.列车车次编辑 |\n");gotoxy(20,20);printf("-------------------------------------\n");gotoxy(40,25);printf("请输入登陆密码(admin):");for(i=0;i<5;i++){password[i]=getch();printf("*");}if(password[0]!='a'||password[1]!='d'||password[2]!='m'||password[3]!='i '||password[4]!='n') {gotoxy(50,25);printf("输入错误,请重新输入!");j++;if(j==3)system(exit);getch();goto be;}printf("\n请选择管理项目:\n");printf("1=初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5=返回上一级菜单\n");printf("选择");scanf("%d",&i);while(i!=5){switch(i){case 1:initgraph(G); /*初始化交通系统*/ break;case 2:cityedit(G); /*城市编辑*/ break;case 3:flightedit(G); /*飞机航班编辑*/ break;case 4:trainedit(G); /*列车车次编辑*/ break;}printf("\n请选择管理项目:\n");printf("*************************************\n");printf("** 1=初始化交通系统 **\n"); printf("** 2=城市编辑 **\n");printf("** 3=飞机航班编辑 **\n");printf("** 4=列车车次编辑 **\n");printf("** 5=返回上一级菜单 **\n");printf("*************************************\n");printf("1=初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5=返回上一级菜单\n");printf("选择");scanf("%d",&i);}}void initgraph(ALGraph *G) /*初始化交通系统*//* 初始化交通系统方式选择界面 */{int i;printf("\n请选择初始化方式:\n");printf("1=键盘\n2=文档\n");printf("选择");scanf("%d",&i);getchar();switch(i){case 1:createcityfile();createplanefile();createtrainfile();CreateGraph(G);break;case 2:CreateGraph(G);break;}}void createcityfile() /* 创建城市名称文档 */ {int i=0;int j;char flag='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("","wb"))==NULL){printf("无法打开文件!\n");return;}for(j=0;j<i;j++)fprintf(fp,"%10s",city[j]);fclose(fp);}void createplanefile() /* 创建飞机航班文档 */{int code,bt[2],at[2]; /*code航班编号,bt出发时间,at到达时间*/ float money;int i;int count;char vt[10],vh[10],flag; /*vt起始城市,vh目标城市*/FILE *fp;flag='y';count=0;while(flag=='Y'||flag=='y') /*flag为标志位,初值为1*/{printf("请输入飞机航班的信息:\n");/*提示"输入航班信息"*/printf("飞机航班编号:"); /*输入航班code*/scanf("%d",&code);getchar();printf("起始城市:"); /*输入航班的出发城市vt*/gets(vt);getchar();printf("目的城市:"); /*输入航班的到达城市vh*/gets(vh);printf("航班费用:"); /*输入机票价格money*/scanf("%f",&money);getchar();printf("起飞时间:"); /*输入航班的出发时间bt*/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("到达时间:"); /*输入航班的到达时间at*/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; /*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+1*/printf("继续输入(Y/N)"); /*提示"是否要继续输入航班信息:"*/scanf("%c",&flag);getchar();printf("\n");}if((fp=fopen("","wb"))==NULL) /*航班文件不能以读写形式打开*/printf("\n无法打开文件!\n"); /*提示"无法打开文件"*/fprintf(fp,"%d",count); /*将计数值count写入航班车文件*/for(i=0;i<count;i++)if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1) /*无法将a[i]写入航班文件*/ printf("\n文件写入错误!\n"); /*提示"文件无法写入"*/fclose(fp); /*关闭航班文件*/}void createtrainfile() /* 创建列车车次文档 */{int code,bt[2],at[2];float money;int i;int count;char vt[10],vh[10],flag;FILE *fp;flag='y';count=0;while(flag=='y'||flag=='Y'){printf("请输入列车车次的信息:\n");printf("列车车次编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();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("","wb"))==NULL)printf("\n无法打开文件!\n");fprintf(fp,"%d",count); for(i=0;i<count;i++)if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)printf("\n文件写入错误!\n");fclose(fp);}int LocateVertex(ALGraph *G,char *v) /* 城市名在交通系统中定位操作,找出城市名在图中对应结点位置 */{int j,k;j=-1;for(k=0;k<G->vexnum;k++)if(strcmp(G->vertices[k].cityname,v)==0) /*第k个结点中的城市名与传过来的城市名相同*/{j=k; /*记录位置*/break;}return(j);}void CreateGraph(ALGraph *G) /* 用city,plan,train三个文档创建城市交通系统 */{int i,j,k;int arc_num;int count1,count2;int m,t;ArcNode *p,*q;FILE *fp;i=0;if((fp=fopen("","rb"))==NULL) /*打开城市文件,文件指针返回值为空*/{printf("\n无法打开文件!\n");return;}while(!feof(fp)) /*文件不为空*/{fscanf(fp,"%10s",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("","rb"))==NULL)printf("\n无法打开文件!\n");k=0;fscanf(fp,"%d",&count1); /*打开航班信息文件""*/while(k<count1){if(fread(&a[k],sizeof(struct arc),1,fp)!=1)printf("\n文件读入错误!\n");k++;}fclose(fp); /*关闭文件*/k=0; /*a的计数变量k=0*/arc_num=0; /*弧的计数变量 arc_num=0*/while(k<count1){i=LocateVertex(G,a[k].vt);/*调用函数 LocateVertex(G,a[k].vt)得到起始结点的位置 i*/ j=LocateVertex(G,a[k].vh);/*调用函数 LocateVertex(G,a[k].vh)得到起始结点的位置 j*/ q=G->vertices[i].planefirstarc;m=0;while(q!=NULL){if(q->adjvex==j) /*弧 q中的邻接顶点与j相等*/{t=q->+1; /* 将数组a[i] 中的内容都复制到弧q中*/q->[t].number=a[k].co;q->[t].expenditure=a[k].mo;q->[t].begintime[0]=a[k].bt[0];q->[t].begintime[1]=a[k].bt[1];q->[t].arrivetime[0]=a[k].at[0];q->[t].arrivetime[1]=a[k].at[1];q->=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode)); /*开辟一个弧结点*/ p->adjvex=j;/*将数组a[i]中的内容都复制到新的弧结点中*/p->[0].number=a[k].co;p->[0].expenditure=a[k].mo;p->[0].begintime[0]=a[k].bt[0];p->[0].arrivetime[0]=a[k].at[0];p->[0].arrivetime[1]=a[k].at[1];p->=0;p->nextarc=G->vertices[i].planefirstarc;G->vertices[i].planefirstarc=p; /* 将弧结点连接到适当的位置中去*/ arc_num++;}k++;}G->planearcnum=arc_num;if((fp=fopen("","rb"))==NULL){printf("\n无法打开文件!\n");return;}k=0;fscanf(fp,"%d",&count2); /*打开列车信息文件""*/while(k<count2){if(fread(&a[k],sizeof(struct arc),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)得到起始结点的位置 i*/j=LocateVertex(G,a[k].vh);/* 调用函数 LocateVertex(G,a[k].vh)得到起始结点的位置 j*/q=G->vertices[i].trainfirstarc;m=0;while(q!=NULL){if(q->adjvex==j) /*弧 q中的邻接顶点与j相等*/{t=q->+1; /*将数组a[i] 中的内容都复制到弧q中*/q->[t].number=a[k].co;q->[t].expenditure=a[k].mo;q->[t].begintime[0]=a[k].bt[0];q->[t].begintime[1]=a[k].bt[1];q->[t].arrivetime[1]=a[k].at[1];q->=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode)); /*开辟一个弧结点*/p->adjvex=j; /*将数组a[i]中的内容都复制到新的弧结点中*/p->[0].number=a[k].co;p->[0].expenditure=a[k].mo;p->[0].begintime[0]=a[k].bt[0];p->[0].begintime[1]=a[k].bt[1];p->[0].arrivetime[0]=a[k].at[0];p->[0].arrivetime[1]=a[k].at[1];p->=0;p->nextarc=G->vertices[i].trainfirstarc;G->vertices[i].trainfirstarc=p; /*将弧结点连接到适当的位置中去*/ arc_num++;}k++;}G->trainarcnum=arc_num;}int save(ALGraph *G) /* 保存城市交通系统到相应的文档 */{int i,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("","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->;t++){strcpy(a[k].vt,G->vertices[i].cityname);strcpy(a[k].vh,G->vertices[q->adjvex].cityname); a[k].co=q->[t].number;a[k].mo=q->[t].expenditure;a[k].bt[0]=q->[t].begintime[0];a[k].bt[1]=q->[t].begintime[1];a[k].at[0]=q->[t].arrivetime[0];a[k].at[1]=q->[t].arrivetime[1];k++;}q=q->nextarc;}}if((fp=fopen("","wb"))==NULL){printf("\n无法打开文件!\n");return 0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(struct arc),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->;t++){strcpy(a[k].vt,G->vertices[i].cityname);strcpy(a[k].vh,G->vertices[q->adjvex].cityname);a[k].co=q->[t].number;a[k].mo=q->[t].expenditure;a[k].bt[0]=q->[t].begintime[0];a[k].bt[1]=q->[t].begintime[1];a[k].at[0]=q->[t].arrivetime[0];a[k].at[1]=q->[t].arrivetime[1];k++;}q=q->nextarc;}}if((fp=fopen("","wb"))==NULL){printf("\n无法打开文件!\n");return 0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)printf("\n文件写入错误!\n");i++;}fclose(fp);return 1;}void cityedit(ALGraph *G) /* 显示城市编辑项目选择界面 */ {int i;printf("\n请选择城市编辑项目:\n");printf("1=增加城市\n2=删除城市\n");printf("选择");scanf("%d",&i);getchar();if(i==1)EnterVertex(G);if(i==2)DeleteVertex(G);}void EnterVertex(ALGraph *G) /* 增加城市 */{char v[10],c;int i;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);}else return;}}void DeleteVertex(ALGraph *G)/* G是程序头部定义的结构体*//* 删除城市 */{int i,j,k,n;char v[10],c;ArcNode *p,*q,*m;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表头结点总个数比实际大1*/n++;/*记数值n+1*/if(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; /*将该弧指向顶点位置-1*/q=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);}else return;}void flightedit(ALGraph *G) /* 飞机航班编辑项目选择界面 */ {int i; /* char q; */printf("\n请选择飞机航班编辑项目:\n");printf("1=新增航班\n2=删除航班\n");printf("选择");scanf("%d",&i);getchar();if(i==1)EnterplaneArc(G);if(i==2)DeleteplaneArc(G);}void trainedit(ALGraph *G) /* 列车车次编辑项目选择界面 */ {int i; /* char q; */printf("\n请选择列车车次编辑项目:\n");printf("1=新增车次\n2=删除车次\n");printf("选择");scanf("%d",&i);getchar();if(i==1)EntertrainArc(G);if(i==2)DeletetrainArc(G);}void EnterplaneArc(ALGraph *G) /* 增加飞机航班 */ {int i,j,bt[2],at[2];int code;float money;int m,t;char vt[10],vh[10],c;ArcNode *p,*q;printf("\n请输入新增飞机航班的信息:\n");printf("飞机航班编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();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->+1;q->[t].number=code;q->[t].expenditure=money;q->[t].begintime[0]=bt[0];q->[t].begintime[1]=bt[1];q->[t].arrivetime[0]=at[0];q->[t].arrivetime[1]=at[1];q->=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;p->[0].number=code;p->[0].expenditure=money;p->[0].begintime[0]=bt[0];p->[0].begintime[1]=bt[1];p->[0].arrivetime[0]=at[0];p->[0].arrivetime[1]=at[1];p->=0;p->nextarc=G->vertices[i].planefirstarc;G->vertices[i].planefirstarc=p;G->planearcnum++;}save(G);}else return;}void EntertrainArc(ALGraph *G) /* 增加列车车次 */ {int i,j,bt[2],at[2];int code;float money;int m,t;char vt[10],vh[10],c;ArcNode *p,*q;printf("\n请输入新增列车车次的信息:\n");printf("列车车次编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();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].trainfirstarc;m=0;while(q!=NULL){if(q->adjvex==j){t=q->+1;q->[t].number=code;q->[t].expenditure=money;q->[t].begintime[0]=bt[0];q->[t].begintime[1]=bt[1];q->[t].arrivetime[0]=at[0];q->[t].arrivetime[1]=at[1];q->=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=j;p->[0].number=code;p->[0].expenditure=money;p->[0].begintime[0]=bt[0];p->[0].begintime[1]=bt[1];p->[0].arrivetime[0]=at[0];p->[0].arrivetime[1]=at[1];p->=0;p->nextarc=G->vertices[i].trainfirstarc;G->vertices[i].trainfirstarc=p;G->trainarcnum++;}save(G);}else return;}int DeleteplaneArc(ALGraph *G) /* 删除飞机航班 */ {int i,j;int code;char vt[10],vh[10],c;int n;int k;ArcNode *p,*q;printf("\n请输入删除飞机航班的信息:\n");printf("飞机航班的编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();printf("目的城市:");gets(vh);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 0;}if(j==-1)printf("\n错误!无法找到目的城市\n");return 0;}p=G->vertices[i].planefirstarc;q=p;while(p!=NULL){if(p->adjvex==j){n=-1;for(k=0;k<=p->;k++){if(p->[k].number==code){n=k;break;}}if(n!=-1)if(p->==0){if(q==p)G->vertices[i].planefirstarc=p->nextarc;elseq->nextarc=p->nextarc;free(p);}else{for(k=n;k<p->;k++){p->[k].number=p->[k+1].number; p->[k].expenditure=p->[k+1].expenditure; p->[k].begintime[0]=p->[k+1].begintime[0];p->[k].begintime[1]=p->[k+1].begintime[1];p->[k].arrivetime[0]=p->[k+1].arrivetime[0];p->[k].arrivetime[1]=p->[k+1].arrivetime[1]; } p->=p->;}elseprintf("\n在此两城市之间无法找到No.%d飞机航班\n",code);save(G);return 0;}q=p;p=p->nextarc;if(p==NULL)printf("\n在此两城市之间无飞机航班存在\n");}elsereturn 1;return 1;}int DeletetrainArc(ALGraph *G) /* 删除列车车次 */ {int i,j;int code;char vt[10],vh[10],c;int n;int k;ArcNode *p,*q;printf("\n请输入删除列车车次的信息:\n");printf("列车车次的编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();printf("目的城市:");gets(vh);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 0;}if(j==-1){printf("\n错误!无法找到目的城市\n");return 0;}p=G->vertices[i].trainfirstarc;q=p;。
全国交通咨询系统C++代码
//全国交通咨询系统-代码部分//作者:JUNE 2011-6-11#include <iostream>#include <stdio.h>#include <windows.h>#include <string.h>#define Dij_MAXN 33#define MAX_VERTEX_NUM 31#define MAX_STRING_NUM 10#define MAX_TRAFFIC_NUM 10using namespace std;typedef short int CityType; //定义城市节点typedef struct TrafficNode /////////////////////////////////////////////////{char name[MAX_STRING_NUM]; //班次//int StartTime,StopTime; //起止时间int Time;int EndCity; //火车到达城市的编号int Cost; //票价} TrafficNodeDat;typedef struct VNode //////////////////////////////////////////////////////{CityType city; //城市编号int TrainNum,FlightNum; //标记下面Train数组和Flight数组里元素个数TrafficNodeDat Train[MAX_TRAFFIC_NUM]; //数组成员为结构体,记录了到达城市、起止时间、票价和班次TrafficNodeDat Flight[MAX_TRAFFIC_NUM];} VNodeDat;typedef struct PNode ///////////////////////////////////////////////{int City;int TraNo;} PNodeDat;char CityName[MAX_VERTEX_NUM][MAX_STRING_NUM]; //城市名,采用第一下标为该城市在本程序中的编号int CityNum; //城市数目VNodeDat AdjList[MAX_VERTEX_NUM]; //下标所在城市的线路int MinTime,StartTime;int curPath;int SeekCity(char *name)////////////////////////////////////////////{//查找城市int i;for(i=0;i<CityNum;i++)if(strcmp(name,CityName[i])==0)return i;return -1;}int SaveFile()///////////////////////////////////////////////////////////////{//将火车飞机交通信息写入文件FILE *fp;int i,j,total;if((fp=fopen("city.txt","wb"))==NULL){cout<<"\n\t无法打开文件!\n"; return -1;}fprintf(fp,"%d\n",CityNum);//在city文件中输入城市总数for(i=0;i<CityNum;i++)fprintf(fp,"%s\n",CityName[i]);//再输入城市名fclose(fp);total=0;if((fp=fopen("train.txt","wb"))==NULL){cout<<"\n\t无法打开文件!\n"; return -1;}for(i=0;i<CityNum;i++)total+=AdjList[i].TrainNum;fprintf(fp,"%d\n",total);//在train文件中输入火车总数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,"%d %d\n",AdjList[i].Train[j].Time,AdjList[i].Train[j].Cost);//输入发车时间和到站时间和费用}fclose(fp);total=0;if((fp=fopen("flight.txt","wb"))==NULL){cout<<"\n\t无法打开文件!\n";return -1;}for(i=0;i<CityNum;i++)total+=AdjList[i].FlightNum;fprintf(fp,"%d\n",total);//在flight文件中输入飞机总数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,"%d %d\n",AdjList[i].Flight[j].Time,AdjList[i].Flight[j].Cost);//输入起飞时间,到达时间和费用}fclose(fp);return 1;}int InsertCity(char *Name)///////////////////////////////////////////////////////{//添加城市strcpy(CityName[CityNum],Name);AdjList[CityNum].city=CityNum;//设置城市编号AdjList[CityNum].FlightNum=0;AdjList[CityNum].TrainNum=0;//新增城市火车数和飞机数初始为零CityNum++;//城市总数加1return 1;}int DelCity(char *Name)/////////////////////////////////////////////////////////{//删除城市int city,i,j;city=SeekCity(Name);for(i=city;i<CityNum-1;i++)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].Time=AdjList[i+1].Flight[j].Time;}}CityNum--;return 1;}int InsertTrain(char *train,char *StartCity,char *EndCity,int Time,int cost)//////////////////////////////////////////////{//添加火车路线int i,j;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].Time=Time;strcpy(AdjList[i].Train[AdjList[i].TrainNum].name,train);AdjList[i].TrainNum++;return 1;}int InsertFlight(char *flight,char *StartCity,char *EndCity,int Time,int cost){//添加飞机路线int i,j;i=SeekCity(StartCity);j=SeekCity(EndCity);AdjList[i].Flight[AdjList[i].FlightNum].Cost=cost;AdjList[i].Flight[AdjList[i].FlightNum].EndCit y=j;AdjList[i].Flight[AdjList[i].FlightNum].Time=Time;strcpy(AdjList[i].Flight[AdjList[i].FlightNum].name,flight);AdjList[i].FlightNum++;return 1;}int DelPath(char *name)/////////////////////////////////////////////////////////////////////////{//删除路线int i,j,flag=0;for(i=0;i<CityNum;i++){for(j=0;j<AdjList[i].FlightNum;j++)if(strcmp(AdjList[i].Flight[j].name,name)==0){flag=1;break;}//找到要删除的路线,找到跳出for循环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].Time=AdjList[i].Flight[j+1].Time;}AdjList[i].FlightNum--;//将要删除路线后面的路线全部向前移,并将总数减1 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].Time=AdjList[i].Train[j+1].Time;}AdjList[i].TrainNum--;break;}}return 1;}void Dijkstra_Output(int s[30][30],int PreCity[30],int p_end,int TravelType)/////////////////////////// {//输出最短路径int track[30];int i=0,j,k,min,tmp,end,cost=0;j=p_end;track[i++]=j;//下标为0中存储了终点站的城市编号,i变为1while(PreCity[j]>=0){cost+=s[PreCity[j]][j];//循环后cost为总费用j=PreCity[j];track[i++]=j;}cout<<"\n\t您要查找的路线为:";cout<<"\n\t*─────────────────────────────*\n"; cout<<"\t车号起始站终点站时间花费\n";if(!TravelType)//类型为火车{for(i--;i>0;i--)//初始时i--后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;//min为路径中的最小花费tmp=k;//k为一条路径中花费最小的火车编号}printf("\n\t%s",AdjList[track[i]].Train[tmp].name);//输出火车班次printf("\t%10s",CityName[track[i]]);//输出起始城市名printf("\t%10s",CityName[track[i-1]]);//输出终点城市名printf("\t%d",AdjList[track[i]].Train[tmp].Time);//输出时间printf("\t%d\n",AdjList[track[i]].Train[tmp].Cost);//输出花费}}else//类型为飞机{for(i--;i>0;i--){end=track[i-1];min=32767;for(k=0;k<AdjList[track[i]].FlightNum;k++)if(AdjList[track[i]].Flight[k].EndCity==end&&min>AdjList[track[i]].Flight[k].Cost){min=AdjList[track[i]].Flight[k].Cost;tmp=k;}printf("\n\t%s",AdjList[track[i]].Flight[tmp].name);printf("\t%10s",CityName[track[i]]);printf("\t%10s",CityName[track[i-1]]);printf("\t%d",AdjList[track[i]].Flight[tmp].Time);printf("\t%d\n",AdjList[track[i]].Flight[tmp].Cost);}}cout<<"\n\t最终得出最少为: ";cout<<cost<<"\n";cout<<"\t*─────────────────────────────*\n"; }void Dijkstra(int s[30][30],int p_start,int p_end,int TravelType){//迪杰斯特拉算法计算最短路径int PreCity[30];//数组的值为计算出的路线中下标表示的城市中的前一个城市编号int i,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)//i为起始站{for(j=0;j<CityNum;j++)if(PreCity[j]==-1&&s[i][j]>0&&(min<0||s[i][j]<min)){pre=i;pos=j;//j为起始站中花费最小的到达站的城市编号min=s[i][j];}}PreCity[pos]=pre;}Dijkstra_Output(s,PreCity,p_end,TravelType);}int CalcMinCost(int StartCity,int EndCity,int TravelType){//查询最小耗费路线int s[30][30];int i,j,min,end,flag1,flag2;flag1=0;flag2=0;for(i=0;i<CityNum;i++)for(j=0;j<CityNum;j++)s[i][j]=-1;//设空路径if(TravelType==0)//判断初始城市和终点城市是否在火车交通路线中for(i=0;i<CityNum;i++)for(j=0;j<AdjList[i].TrainNum;j++){if(AdjList[i].Train[j].EndCity==StartCity) flag1=1;if(AdjList[i].Train[j].EndCity==EndCity) flag2=1;}else if(TravelType==1)//判断初始和终点城市是否在飞机交通路线中for(i=0;i<CityNum;i++)for(j=0;j<AdjList[i].FlightNum;j++){if(AdjList[i].Flight[j].EndCity==StartCity) flag1=1;if(AdjList[i].Flight[j].EndCity==EndCity) flag2=1;}if(flag1!=1&&flag2!=1){printf("\n\t抱歉!没有您要查找的路线!");return 0;}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++;}//min为i城市中的最小花费,end为其路线终点站s[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++;}s[i][end]=min;}}}Dijkstra(s,StartCity,EndCity,TravelType);return 1;}int CalcMinRange(int StartCity,int EndCity,int TravelType){//查询最短路程int s[30][30];int i,j,min,end,flag1,flag2;flag1=0;flag2=0;for(i=0;i<CityNum;i++)for(j=0;j<CityNum;j++)s[i][j]=-1;//设空路径if(TravelType==0)//判断初始城市和终点城市是否在火车交通路线中for(i=0;i<CityNum;i++)for(j=0;j<AdjList[i].TrainNum;j++){if(AdjList[i].Train[j].EndCity==StartCity) flag1=1;if(AdjList[i].Train[j].EndCity==EndCity) flag2=1;}else if(TravelType==1)//判断初始和终点城市是否在飞机交通路线中for(i=0;i<CityNum;i++)for(j=0;j<AdjList[i].FlightNum;j++){if(AdjList[i].Flight[j].EndCity==StartCity) flag1=1;if(AdjList[i].Flight[j].EndCity==EndCity) flag2=1;}if(flag1!=1&&flag2!=1){printf("\n\t抱歉!没有您要查找的路线!");return 0;}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].Time<min) min=AdjList[i].Train[j].Time;j++;}//min为i城市中的最短路程,end为其路线终点站s[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].Time<min) min=AdjList[i].Flight[j].Time;j++;}s[i][end]=min;}}}Dijkstra(s,StartCity,EndCity,TravelType);return 1;}int InitSystem(){/////////////////////////////////////////////////////////////////////////////从文件中读信息FILE *fp;int i,j,num,cost,time;char stmp1[10];char stmp2[10];char stmp3[10];fp=fopen("city.txt","r");if(!fp){cout<<"\n\t无法打开文件!\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("train.txt","r");if(!fp){cout<<"\n\t无法打开文件!\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",&time);AdjList[j].Train[AdjList[j].TrainNum].Time=time;fscanf(fp,"%d",&cost);AdjList[j].Train[AdjList[j].TrainNum].Cost=cost;AdjList[j].TrainNum++;fclose(fp);fp=fopen("flight.txt","r");if(!fp){cout<<"\n\t无法打开文件!\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",&time);AdjList[j].Flight[AdjList[j].FlightNum].Time=time;fscanf(fp,"%d",&cost);AdjList[j].Flight[AdjList[j].FlightNum].Cost=cost;AdjList[j].FlightNum++;}fclose(fp);return 1;}void Administrators(){////////////////////////////////////////////////////////////////////////////////////////管理员的界面char name[10];char s_city[10];char e_city[10];int Command,cost,flag;int traveltype;int time;char user[10],password[10];cout<<"\n\t请输入用户名:";cin>>user;cout<<"\t请输入密码:";cin>>password;if((strcmp("june",user)!=0)||(strcmp("123",password)!=0))//主界面选择验证,用户名为:june,密码为:123{cout<<"\n\t输入信息错误!\n";system("cls");//清屏return;}do{cout<<"\t\t\t\tloading";Sleep(600);cout<<"\ .";Sleep(400);cout<<" .";Sleep(200);cout<<" ."<<endl;Sleep(100);cout<<endl;cout<<"\t\t\t\t 成功!";Sleep(1000);system("cls");//清屏cout<<"\n\t******这里是管理员的界面,欢迎进入******\n"; cout<<"\t∷━━━━━━━━━━━━━━━━━━━∷\n"; cout<<"\t 1.添加城市\n";cout<<"\t 2.删除城市\n";cout<<"\t 3.添加交通路线\n";cout<<"\t 4.删除交通路线\n";cout<<"\t 0.返回上一级菜单\n";cout<<"\t∷**************************************∷\n"; cout<<"\n\t请选择:";scanf("%d",&Command);switch(Command){case 0:system("cls");//清屏return;case 1://添加城市InitSystem();cout<<"\n\t输入城市名:";scanf("%s",&name);InsertCity(name);SaveFile();cout<<"\t系统信息输入成功!\n";break;case 2://删除城市InitSystem();cout<<"\n\t输入城市名:";scanf("%s",&name);DelCity(name);SaveFile();cout<<"\t系统信息输入成功!\n";break;case 3://添加交通路线InitSystem();cout<<"\t请输入起始站城市名:";scanf("%s",&s_city);cout<<"\t请输入终点站城市名:";scanf("%s",&e_city);cout<<"\t请选择交通工具(火车0,飞机1):";scanf("%d",&traveltype);cout<<"\t请输入火车/飞机班次:";scanf("%s",&name);cout<<"\t请输入所耗费的时间:";scanf("%d",&time);printf("\t请输入票价:");scanf("%d",&cost);if(traveltype)InsertFlight(name,s_city,e_city,time,cost);elseInsertTrain(name,s_city,e_city,time,cost);SaveFile();cout<<"\t系统信息输入成功!\n";break;case 4://删除交通路线InitSystem();cout<<"\t请输入班次:";scanf("%s",&name);DelPath(name);SaveFile();cout<<"\t系统信息输入成功!\n";break;default:cout<<"\t选择序号错误!请重新选择!\n";flag=1;}}while(flag);}void Line(int city,int traveltype)//////////////////////////////////////////////////{//////////////////////////////////////////////////////////////////////////////////查找城市中的所有路线int i;printf("\n\t您要查找的路线为:");printf("\n\t*─────────────────────────────*\n"); printf("\t车号起始站终点站时间花费\n");if(!traveltype)//类型为火车{for(i=0;i<AdjList[city].TrainNum;i++){printf("\n\t%s",AdjList[city].Train[i].name);//输出火车班次printf("\t%10s",CityName[city]);//输出起始城市名printf("\t%10s",CityName[AdjList[city].Train[i].EndCity]);//输出终点城市名printf("\t%2d",AdjList[city].Train[i].Time);//输出起止时间printf("\t%d\n",AdjList[city].Train[i].Cost);//输出花费}}else{for(i=0;i<AdjList[city].FlightNum;i++){printf("\n\t%s",AdjList[city].Flight[i].name);//输出火车班次printf("\t%10s",CityName[city]);//输出起始城市名printf("\t%10s",CityName[AdjList[city].Flight[i].EndCity]);//输出终点城市名printf("\t%2d",AdjList[city].Flight[i].Time );//输出起止时间printf("\t%d\n",AdjList[city].Flight[i].Cost);//输出花费}}printf("\t*─────────────────────────────*\n"); }void User(){//////////////////////////////////////////////////////////////////////////////////////用户界面system("cls");//清屏char name[10];int startcity,endcity;int Command,flag,traveltype;do{cout<<"\n\t*******这里是用户的界面,欢迎进入*******\n";cout<<"\t*━━━━━━━━━━━━━━━━━━━*\n";cout<<"\t 1.查询最小耗费路线\n";cout<<"\t 2.查询最短时间路线\n";cout<<"\t 3.查询城市所有路线\n";cout<<"\t 0.返回上一级菜单\n";cout<<"\t****************************************\n"; cout<<"\n\t请选择:";//用户功能选择scanf("%d",&Command);switch(Command){case 0:Sleep(100);system("cls");//清屏return;case 1://最小耗费InitSystem();cout<<"\n\t请输入起始城市:";scanf("%s",&name);startcity=SeekCity(name);if(startcity<0){cout<<"\t输入城市名错误!\n";break;}cout<<"\t请输入终点城市:";scanf("%s",&name);endcity=SeekCity(name);if(endcity<0){cout<<"\t输入城市名错误!\n";break;}cout<<"\t请选择交通工具(火车0,飞机1):";scanf("%d",&traveltype);if(traveltype!=0&&traveltype!=1){cout<<"\t输入错误!\n";break;}CalcMinCost(startcity,endcity,traveltype);cout<<"\n";system("pause");system("cls");//清屏break;case 2://最短时间InitSystem();cout<<"\n\t请输入起始城市:";scanf("%s",&name);startcity=SeekCity(name);if(startcity<0){cout<<"\t输入城市名错误!\n";break;}cout<<"\t请输入终点城市:";scanf("%s",&name);endcity=SeekCity(name);if(endcity<0){cout<<"\t输入城市名错误!\n";break;}cout<<"\t请选择交通工具(火车0,飞机1):"; scanf("%d",&traveltype);if(traveltype!=0&&traveltype!=1){printf("\t输入错误!\n");break;}CalcMinRange(startcity,endcity,traveltype); cout<<"\n";system("pause");system("cls");//清屏break;case 3://查找城市所有路线InitSystem();cout<<"\n\t请输入要查找路线的城市:"; scanf("%s",&name);startcity=SeekCity(name);if(startcity<0){cout<<"\t输入城市名错误!\n";break;}cout<<"\t请选择交通工具(火车0,飞机1):"; scanf("%d",&traveltype);if(traveltype!=0&&traveltype!=1){cout<<"\t输入错误!\n";break;}Line(startcity,traveltype);cout<<"\n";system("pause");system("cls");//清屏break;default:cout<<"\t选择序号错误!请重新选择!\n";flag=1;}}while(flag);}int main(){///////////////////////////////////////////////////////////////////////////////////////////////主界面int Command;int x=0;system("Color 3f");while(1){cout<<"\t ※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n"; cout<<"\t ※※\n"; cout<<"\t ※※\n"; cout<<"\t ※欢迎进入全国交通咨询系统※\n"; cout<<"\t ※※\n"; cout<<"\t ※※\n"; cout<<"\t ※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n"; cout<<"\n\t\t\t< 请选择登录身份>\n";cout<<"\n\t\t\t\t1: 管理员\n\n\t\t\t\t2: 旅客\n\n\t\t\t\t0: 退出\n\t您的选择是:"; cin>>Command;switch(Command){case 0:return 0;case 1:Administrators();break;case 2:User();break;default:cout<<"\t选择序号错误!请重新选择!\n"; }}}///以下是本系统用到的数据:/*Train.tet11K1 kunming huaihua 12 150K4 kunming huaihua 14 140K5 kunming huaihua 15 100K7 kunming shanghai 30 240K1 changsha shanghai 10 120K2 changsha shanghai 9 140K3 changsha shanghai 11 100K1 huaihua changsha 6 70K2 huaihua changsha 7 65K4 huaihua changsha 5 60K6 huaihua changsha 8 55city.txt4kunmingchangshahuaihuashanghaiflight.txt11F1 kunming huaihua 12 150F4 kunming huaihua 14 140F5 kunming huaihua 15 100F7 kunming shanghai 30 240F1 changsha shanghai 10 120F2 changsha shanghai 9 140F3 changsha shanghai 11 100F1 huaihua changsha 6 70F2 huaihua changsha 7 65F4 huaihua changsha 5 60F6 huaihua changsha 8 55如果对本代码有疑问之处,请下载本人文档里的《数据结构课程设计-全国交通咨询系统》以及《全国交通咨询系统测试说明》进行进一步了解。
交通咨询系统 C语言
CHINA交通咨询系统目录一、需求分析 (2)1、程序的功能及设计要求 (2)2、输入输出的要求 (2)二、环境说明 (2)三、详细设计 (3)1、模块设计 (3)2、画出各函数的调用关系图、主要函数的流程图。
(3)2、详细代码 (4)四、调试分析 (4)1、测试数据: (4)2、借鉴的资料 (5)五、课程总结 (6)六、附录 (6)一、需求分析1、程序的功能及设计要求在交通网络非常发达、交通工具和交通方式不断更新的今天,人们在出差、旅游或做其他出行时,不仅关心节省交通费用,而且对里程和所需时间等问题也感兴趣。
对于这样一个人们关心的问题,通过建立交通网络图的存储结构图,提供用户查询的功能,功能一:通过输入城市名及任意两个城市的距离,查询任意两个城市之间的最短距离,从而达到最省目的;功能二:通过输入城市名以及任意两个程序的距离,查询中转路线最少。
程序所具有的功能特色本程序主要目的是为了给用户提供路径咨询,可以通过输入设置,延续程序的拓展性。
设计要求及分析设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一城市顶点之间的中转次数最少问题或最低花费或最少时间(最短路径)问题。
该设计共分三个部分:一是建立交通网络图的存储结构;二是解决单源最短路径问题;最后再实现任意两个城市顶点之间的最短路径问题。
1. 建立交通网络图的存储结构要实现设计要求,首先要定义交通图的存储结构:邻接链表和邻接矩阵;2. 解决任意两个城市顶点之间的中转次数最少的问题;3. 解决任意两个城市顶点之间的最短路径(最低花费或最少时间)问题。
2、输入输出的要求定义变量类型应该保持类型一致,通过键盘输入,确保输入输出一致,使最短路径途径以及最短路径能够简单明了的输出,同时保持程序简洁美观,效果明显。
输入要求为输入界面直观、亲切;有利于快速输入;有利于准确输入;有利于输入、修改;方便操作。
输出要求:输出要求应简单、直观,一目了然,尽量符合用户的习惯,便于用户阅读、理解与使用。
C++数据结构-全国交通咨询模拟报告
数据结构课程设计报告班级:195182学号:20181003991姓名:钟欢日期:2019.12一、课程设计题目与要求1.课程设计题目:全国交通咨询模拟2.问题描述:出于不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
3.基本要求:3.1提供对城市信息进行编辑(如添加或删除)的功能。
3.2城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增加或删除)的功能。
3.3提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具。
3.4旅途中耗费的总时间应该包括中转站的等候时间。
3.5咨询以用户和计算机的对话方式进行。
二、需求分析1.问题描述搭建一个全国交通咨询模拟系统,可以实现简单的人机互动从而达到咨询的效果。
需要完成的功能有,对城市、列车时刻表、航班时刻表进行编辑(手动/文件添加,删除),能够根据出发城市以及到达城市进行相关线路推荐(花费最少线路、耗时最短线路),其中整个线路的耗时总时长包括中转等待时间。
2.程序的功能:2.1维护功能:2.1.1航班操作2.1.2列车操作2.1.3更改密码2.2咨询功能2.2.1选择出行交通工具2.2.2选择要查询的信息:○1查询花费最小的路径○2查询耗时最短的路径2.2.3进行进一步的输入得到所需要的结果三、设计1.设计思想1.1数据结构设计1.1.1逻辑结构设计采用图结构来表示该全国交通网络,用一个结构体来表示时间,结构体内有标准化的(天,时,分)的相关表示以及操作,重载的运算符“-”。
全国交通网络中的城市用结点表示,两个城市之间的航线或者列车线用两个结点之间的边来表示。
城市结点中包含城市名字、城市编号、第一条航线/列车线以及航线/列车线的数目;边结点中包含到达城市名称,指向下一航线/列车线的指针,以及指向该边所指代航线/列车线信息的指针;航班线/列车线信息结点包含航班号/列车号,出发时间,到达时间,花费时间,花费金额。
数据结构课程设计-全国交通咨询模拟系统 程序设计 源代码
数据结构课程设计-全国交通咨询模拟系统程序设计源代码一、程序界面A.关于程序1. 该程序以C语言为开发工具,运行该程序前请确保你地机器上已安装tc或turboc ,否则系统会提示:BGI Error: Graphics not initialized (use 'initgraph'>而无法使用该程序.遇到此情况请安装tc ,建议将其安装到C:目录下,以确保程序运行万无一失.2. 该软件完全支持鼠标,请放心使用.3. 该程序能将您输入地城市转换为象素坐标,显示在屏幕上,操作直观方便,选择城市时,用时标一点该城市即可,省去了输入地麻烦.如果您选择地两个城市间有路径地话,程序除了给您信息输出外,还会在地图上将此路径以不同颜色画出,更加直观.4. 该程序附带三个数据文件(num.txt,vex.txt,len.txt --此文件由系统默认>以供用户调试,用户还可自己创建文件,以备实验查询使用.B. 程序地使用用户打开程序,会看到命令行 : FILE CHANGE SHORTWAY MAP HELP ABOUT QUIT CLRSCR用户将鼠标放于某命令上会看到屏幕最下面有一行字在闪动,这是对命令地解释,如当鼠标访于FILE上时其下解释"press this button to open/creat a file" ,当鼠标空闲时在下面显示:"Please Enter Your Choice With Mouse Or Keyboard" ,提示用户进行命令选择.单机鼠标就会将某一功能打开从而进行某一操作2.用户运行程序时请先打开 FILE 菜单,该菜单有4个命令选项:[ 信息提示 ]1. 调用已存信息库文件(由用户提供>2. 创建新地信息库文件3. 调用演示信息库文件4. 退出程序[ 请输入你地选择(1/2/3/4> ]此时程序等待用户输入选择.输入正确后程序会自动打开地图由用户进行下一步操作.3. 对于其他命令,用户可由显示于屏幕下面地提示进行相关操作.二.程序内部设计及数据结构A. 数据地存放格式1.火车信息数据结构定义:typedef struct inf{ int num。
交通咨询系统数据结构c语言
数据结构课程设计交通咨询系统设计学生姓名:学号:指导教师:完成日期:目录1 设计任务书 (1)1.1 题目与要求 (1)1.2 知识点 (1)1.3 输入输出分析 (1)1.4 实现的功能 (2)2 概要设计 (2)2.1 结构体类型及函数声明 (2)2.2 主程序流程 (2)3 详细设计 (3)3.1 数据类型实现 (3)3.2 程序代码 (4)4 调试分析 (14)4.1 问题分析与回顾 (14)4.2 算法时空分析 (14)4.3 算法改进 (15)4.4 经验和体会 (15)5 测试结果 (16)参考文献 (17)1 设计任务书1.1 题目与要求题目:编写程序实现交通咨询系统设计的模拟。
要求:(1)建立交通网络网的存储结构;(2)总体设计要画流程图;(3)提供程序测试方案;(4)界面友好。
1.2 知识点本次课程设计应用到了图的创建、邻接矩阵、迪杰斯特拉算法、弗洛伊德算法、结构体、宏定义、自定义类型、函数的声明与调用等知识点。
1.3 输入输出分析(1)普通输入对于图的存储,我采用的是邻接矩阵的方法,借助于邻接矩阵容易判定任意两个顶点之间是否有弧相连,也容易求得各段弧的权值。
(2)对话式输入在用户选择系统功能时,我采用的是对话式输入,让用户输入系统功能的代号,利用switch语句判断用户输入的指令并调用相应的函数实现具体功能。
(3)程序输出对于用户查询结果的展示,考虑美观以及方便用户的因素,我写了一个pri()函数输出各个城市的代码城市名字对照表,用户可以更方便的使用。
对于用户查询一个城市到所有城市的最短路径时,考虑到显示结果较多,我采用表格的形式进行显示,使界面更美观。
1.4 实现的功能在交通网络越来越发达的今天,人们出去旅行、出差更多的会考虑选择最短路径或最小花费等问题,因此我设计了一个交通咨询系统。
这个系统可以根据用户的选择实现3种功能:求一个城市到所有城市的最短路径;求两个城市间的最短路径;求两个城市间的最小花费。
数据结构课程设计全国交通咨询系统
郑州工业应用技术学院课程设计任务书题目全国交通资询系统主要内容:设计了一个方便用户查询交通咨询系统。
该系统所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。
该系统可以进行城市,列车车次和飞机航班的编辑的基本信息输入操作。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。
基本要求:1、掌握C语言的变量及函数的灵活使用;2、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;3、掌握C语言中文件的基本操作;4、掌握VC++6.0软件的熟练使用。
主要参考资料:[1] 李春葆.数据结构程序设计[M].北京:清华大学出版社,2002,03[2] 王黎,袁永康战略[M].北京:清华大学出版社,2002,01[3] 谭浩强.C程序设计第二版[M].北京:清华大学出版社,2003,03[4] 任哲.MFC Windows程序设计[M].北京:清华大学出版社,2004,06完成期限:2016.12.05—2017.01.05指导教师签名:课程负责人签名:随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。
对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。
在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。
尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。
即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。
为此开发一个交通择优系统是十分必要的。
采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规范化和自动化。
全国交通咨询系统设计C语言
/* *建立一个模拟的交通网络(用有向网来表示),编程实现从某个城市 *出发到另一个城市所需的最短的时间及路径。
* *建立一个模拟的交通网络(用有向网来表示),编程实现从某个城市 *出发到另一个城市所需的最短的时间及路径。
* */ #define MAX_VERTEX_NUM 18#define NULL 0#define MAX_ARC_SIZE 100#define MAX_ROUTE_NUM 5#include"stdio.h"#include"stdlib.h"#include"string.h"#define False 0#define True 1#define INFINITY 10000 /*预定义*/typedef struct {int number;float expenditure;int begintime[2];}Vehide;typedef struct {Vehide stata[MAX_ROUTE_NUM];int last;}infolist;typedef struct ArcNode {int adjvex;struct ArcNode *nextarc;infolist info;}ArcNode;typedef struct VNode {char cityname[10];ArcNode *planefirstarc,*trainfirstarc; }VNode,AdjList[MAX_VERTEX_NUM];typedef struct {int vexnum,planearcnum,trainarcnum; }ALGraph;typedef struct Node {int adjvex;int route;struct Node *next;}Node;typedef struct QNode {int adjvex;struct QNode *next;}QNode;typedef struct {QNode *front;QNode *rear;}LinkQueue;typedef struct TimeNode {int adjvex;int route;int begintime[2];int arrivetime[2];struct TimeNode *child[MAX_ROUTE_NUM]; }TimeNode,*TimeTree;struct arc {int co;char vt[10];char vh[10];int bt[2];int at[2];float mo;}a[MAX_ARC_SIZE]; /*数据结构定义*/ char city[MAX_VERTEX_NUM][10];int TTime[2];int time[2];int time1[2];int time2[2];int c[MAX_VERTEX_NUM];int d[MAX_VERTEX_NUM]; /*变量定义*//*各种操作说明*/void Disp();void Administer(ALGraph *G);void cityedit(ALGraph *G);void CopyTimeTree(TimeTree p,TimeTree q);void createcityfile();void CreateGraph(ALGraph *G);void createplanefile();void CreateTimeTree(TimeTree p,int i,int j,LinkQueue *Q,infolist (*arcs)[MAX_VERTEX_NUM]);void createtrainfile();int DeleteplaneArc(ALGraph *G);void DeleteQueue(LinkQueue *Q,int *x);int DeletetrainArc(ALGraph *G);void DeleteVertex(ALGraph *G);void DemandDispose(int n,ALGraph G);void DestoryTimeTree(TimeTree p);void EnterplaneArc(ALGraph *G);void EnterQueue(LinkQueue *Q,int x);void EntertrainArc(ALGraph *G);void EnterVertex(ALGraph *G);void ExpenditureDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1,float *M,int *final);void flightedit(ALGraph *G);void initgraph(ALGraph *G);void InitQueue(LinkQueue *Q);int IsEmpty(LinkQueue *Q);int LocateVertex(ALGraph *G,char *v);void MinExpenditure(infolist arcs,float *expenditure,int *route);void MinTime(infolist arcs,int *time,int *route);void PrintGraph(ALGraph *G);int save(ALGraph *G);void TimeDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1,int (*T)[2],int *final);void TimeTreeDispose(Node *head,infolist (*arcs)[MAX_VERTEX_NUM]);void trainedit(ALGraph *G);void TransferDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1);void UserDemand(ALGraph G);void VisitTimeTree(TimeTree p);void Disp() /*软件入口,显示函数*/{textbackground(7);textcolor(5);gotoxy(20,10);printf("--------------------------------\n"); gotoxy(20,11);printf("| 交通咨询系统 Version 1.0 |\n"); gotoxy(20,12);printf("| |\n");gotoxy(20,13);printf("| 一叶方舟 |\n");gotoxy(20,14);printf("| |\n");gotoxy(20,15);printf("--------------------------------\n"); gotoxy(40,20);printf("^_^ 欢迎使用 ^_^");sleep(3);clrscr();}int main() /*主函数,程序入口*//* 显示程序功能选择界面 */{ALGraph G;int i;textbackground(7);textcolor(5);clrscr();Disp();printf("请选择程序功能:\n");printf("*************************************\n"); printf("** 1=管理员管理 **\n");printf("** 2=用户咨询 **\n");printf("** 3=显示交通系统 **\n");printf("** 4=退出 **\n");printf("*************************************\n"); printf("请选择?");scanf("%d",&i);getchar();while(i!=4){clrscr();switch(i){case 1:Administer(&G);break;case 2:UserDemand(G);break;case 3:PrintGraph(&G);break;}printf("\n请选择程序功能:\n");printf("*************************************\n"); printf("** 1=管理员管理 **\n");printf("** 2=用户咨询 **\n");printf("** 3=显示交通系统 **\n");printf("** 4=退出 **\n");printf("*************************************\n"); printf("选择?");scanf("%d",&i);getchar();}clrscr();gotoxy(20,10);printf("--------------------------------\n"); gotoxy(20,11);printf("| 指导老师:夏汉民老师 |\n"); gotoxy(20,12);printf("| |\n");gotoxy(20,13);printf("| 制作:李济舟 |\n");gotoxy(20,14);printf("| |\n");gotoxy(20,15);printf("--------------------------------\n"); gotoxy(40,20);printf("谢谢使用");sleep(1);gotoxy(40,20);printf("正在退出");for(i=0;i<3;i++){ printf(".");sleep(i);}return 0;}void Administer(ALGraph *G) /* 显示管理员管理项目选择界面 */ {int i,j=0;char password[5];be:clrscr();gotoxy(20,10);printf("-------------------------------------\n");gotoxy(20,11);printf("| 管理员管理项目 |\n");gotoxy(20,13);printf("| 1.初始化交通系统 |\n");gotoxy(20,15);printf("| 2.城市编辑 |\n");gotoxy(20,17);printf("| 3.飞机航班编辑 |\n");gotoxy(20,19);printf("| 4.列车车次编辑 |\n");gotoxy(20,20);printf("-------------------------------------\n"); gotoxy(40,25);printf("请输入登陆密码(admin):");for(i=0;i<5;i++){password[i]=getch();printf("*");}if(password[0]!='a'||password[1]!='d'||password[2]!='m'||password[3]!='i'||pas sword[4]!='n') {gotoxy(50,25);printf("输入错误,请重新输入!");j++;if(j==3)system(exit);getch();goto be;}printf("\n请选择管理项目:\n");printf("1=初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5=返回上一级菜单\n");printf("选择?");scanf("%d",&i);while(i!=5){switch(i){case 1:initgraph(G); /*初始化交通系统*/ break;case 2:cityedit(G); /*城市编辑*/ break;case 3:flightedit(G); /*飞机航班编辑*/ break;case 4:trainedit(G); /*列车车次编辑*/ break;}printf("\n请选择管理项目:\n");printf("*************************************\n");printf("** 1=初始化交通系统 **\n"); printf("** 2=城市编辑 **\n");printf("** 3=飞机航班编辑 **\n");printf("** 4=列车车次编辑 **\n");printf("** 5=返回上一级菜单 **\n");printf("*************************************\n");printf("1=初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5=返回上一级菜单\n");printf("选择?");scanf("%d",&i);}}void initgraph(ALGraph *G) /*初始化交通系统*/ /* 初始化交通系统方式选择界面 */{int i;printf("\n请选择初始化方式:\n");printf("1=键盘\n2=文档\n");printf("选择?");scanf("%d",&i);getchar();switch(i){case 1:createcityfile();createplanefile();createtrainfile();CreateGraph(G);break;case 2:CreateGraph(G);break;}}void createcityfile() /* 创建城市名称文档 */ {int i=0;int j;char flag='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]);fclose(fp);}void createplanefile() /* 创建飞机航班文档 */{int code,bt[2],at[2]; /*code航班编号,bt出发时间,at到达时间*/ float money;int i;int count;char vt[10],vh[10],flag; /*vt起始城市,vh目标城市*/FILE *fp;flag='y';count=0;while(flag=='Y'||flag=='y') /*flag为标志位,初值为1*/{printf("请输入飞机航班的信息:\n");/*提示"输入航班信息"*/printf("飞机航班编号:"); /*输入航班code*/ scanf("%d",&code);getchar();printf("起始城市:"); /*输入航班的出发城市vt*/ gets(vt);getchar();printf("目的城市:"); /*输入航班的到达城市vh*/ gets(vh);printf("航班费用:"); /*输入机票价格money*/ scanf("%f",&money);getchar();printf("起飞时间:"); /*输入航班的出发时间bt*/ 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("到达时间:"); /*输入航班的到达时间at*/ 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; /*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+1*/printf("继续输入?(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(struct arc),1,fp)!=1) /*无法将a[i]写入航班文件*/printf("\n文件写入错误!\n"); /*提示"文件无法写入"*/ fclose(fp); /*关闭航班文件*/}void createtrainfile() /* 创建列车车次文档 */{int code,bt[2],at[2];float money;int i;int count;char vt[10],vh[10],flag;FILE *fp;flag='y';count=0;while(flag=='y'||flag=='Y'){printf("请输入列车车次的信息:\n");printf("列车车次编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();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(struct arc),1,fp)!=1) printf("\n文件写入错误!\n");fclose(fp);}int LocateVertex(ALGraph *G,char *v) /* 城市名在交通系统中定位操作,找出城市名在图中对应结点位置 */{int j,k;j=-1;for(k=0;k<G->vexnum;k++)if(strcmp(G->vertices[k].cityname,v)==0) /*第k个结点中的城市名与传过来的城市名相同*/{j=k; /*记录位置*/break;}return(j);}void CreateGraph(ALGraph *G) /* 用city,plan,train三个文档创建城市交通系统 */{int i,j,k;int arc_num;int count1,count2;int m,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]);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(struct arc),1,fp)!=1)printf("\n文件读入错误!\n");k++;}fclose(fp); /*关闭文件*/k=0; /*a的计数变量k=0*/arc_num=0; /*弧的计数变量 arc_num=0*/while(k<count1){i=LocateVertex(G,a[k].vt);/*调用函数 LocateVertex(G,a[k].vt)得到起始结点的位置 i*/ j=LocateVertex(G,a[k].vh);/*调用函数 LocateVertex(G,a[k].vh)得到起始结点的位置 j*/q=G->vertices[i].planefirstarc;m=0;while(q!=NULL){if(q->adjvex==j) /*弧 q中的邻接顶点与j相等*/{t=q->st+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->st=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->st=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(struct arc),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)得到起始结点的位置 i*/ j=LocateVertex(G,a[k].vh);/* 调用函数 LocateVertex(G,a[k].vh)得到起始结点的位置 j*/ q=G->vertices[i].trainfirstarc;m=0;while(q!=NULL){if(q->adjvex==j) /*弧 q中的邻接顶点与j相等*/{t=q->st+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->st=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->st=0;p->nextarc=G->vertices[i].trainfirstarc;G->vertices[i].trainfirstarc=p; /*将弧结点连接到适当的位置中去*/ arc_num++;}k++;}G->trainarcnum=arc_num;}int save(ALGraph *G) /* 保存城市交通系统到相应的文档 */ {int i,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->st;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");return 0;}fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(struct arc),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->st;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");return 0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)printf("\n文件写入错误!\n");i++;}fclose(fp);return 1;}void cityedit(ALGraph *G) /* 显示城市编辑项目选择界面 */ {int i;printf("\n请选择城市编辑项目:\n");printf("1=增加城市\n2=删除城市\n");printf("选择?");scanf("%d",&i);getchar();if(i==1)EnterVertex(G);if(i==2)DeleteVertex(G);}void EnterVertex(ALGraph *G) /* 增加城市 */ {char v[10],c;int i;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);}else return;}}void DeleteVertex(ALGraph *G)/* G是程序头部定义的结构体*//* 删除城市 */{int i,j,k,n;char v[10],c;ArcNode *p,*q,*m;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表头结点总个数比实际大1*/ n++;/*记数值n+1*/if(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;。
全国交通咨询系统设计语言
/* *建立一个模拟的交通网络(用有向网来表示),编程实现从某个城市*出发到另一个城市所需的最短的时间及路径。
* *建立一个模拟的交通网络(用有向网来表示),编程实现从某个城市*出发到另一个城市所需的最短的时间及路径。
* */ #define MAX_VERTEX_NUM 18#define NULL 0#define MAX_ARC_SIZE 100#define MAX_ROUTE_NUM 5#include"stdio.h"#include"stdlib.h"#include"string.h"#define False 0#define True 1#define INFINITY 10000 /*预定义*/typedef struct {int number;float expenditure;int begintime[2];int arrivetime[2];}Vehide;typedef struct {Vehide stata[MAX_ROUTE_NUM];int last;}infolist;typedef struct ArcNode {int adjvex;struct ArcNode *nextarc;infolist info;}ArcNode;typedef struct VNode {char cityname[10];ArcNode *planefirstarc,*trainfirstarc;}VNode,AdjList[MAX_VERTEX_NUM];typedef struct {AdjList vertices;int vexnum,planearcnum,trainarcnum;}ALGraph;typedef struct Node {int adjvex;int route;struct Node *next;}Node;typedef struct QNode {int adjvex;struct QNode *next;}QNode;typedef struct {QNode *front;QNode *rear;}LinkQueue;typedef struct TimeNode {int adjvex;int route;int begintime[2];int arrivetime[2];struct TimeNode *child[MAX_ROUTE_NUM];}TimeNode,*TimeTree;struct arc {int co;char vt[10];char vh[10];int bt[2];int at[2];float mo;}a[MAX_ARC_SIZE]; /*数据结构定义*/char city[MAX_VERTEX_NUM][10];int TTime[2];int time[2];int time1[2];int time2[2];int c[MAX_VERTEX_NUM];int d[MAX_VERTEX_NUM]; /*变量定义*//*各种操作说明*/void Disp();void Administer(ALGraph *G);void cityedit(ALGraph *G);void CopyTimeTree(TimeTree p,TimeTree q);void createcityfile();void CreateGraph(ALGraph *G);void createplanefile();void CreateTimeTree(TimeTree p,int i,int j,LinkQueue *Q,infolist (*arcs)[MAX_VERTEX_NUM]);void createtrainfile();int DeleteplaneArc(ALGraph *G);void DeleteQueue(LinkQueue *Q,int *x);int DeletetrainArc(ALGraph *G);void DeleteVertex(ALGraph *G);void DemandDispose(int n,ALGraph G);void DestoryTimeTree(TimeTree p);void EnterplaneArc(ALGraph *G);void EnterQueue(LinkQueue *Q,int x);void EntertrainArc(ALGraph *G);void EnterVertex(ALGraph *G);void ExpenditureDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1,float *M,int *final);void flightedit(ALGraph *G);void initgraph(ALGraph *G);void InitQueue(LinkQueue *Q);int IsEmpty(LinkQueue *Q);int LocateVertex(ALGraph *G,char *v);void MinExpenditure(infolist arcs,float *expenditure,int *route);void MinTime(infolist arcs,int *time,int *route);void PrintGraph(ALGraph *G);int save(ALGraph *G);void TimeDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1,int (*T)[2],int *final);void TimeTreeDispose(Node *head,infolist (*arcs)[MAX_VERTEX_NUM]);void trainedit(ALGraph *G);void TransferDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1);void UserDemand(ALGraph G);void VisitTimeTree(TimeTree p);void Disp() /*软件入口,显示函数*/{textbackground(7);textcolor(5);gotoxy(20,10);printf("--------------------------------\n");gotoxy(20,11);printf("| 交通咨询系统Version 1.0 |\n");gotoxy(20,12);printf("| |\n");gotoxy(20,13);printf("| 一叶方舟|\n");gotoxy(20,14);printf("| |\n");gotoxy(20,15);printf("--------------------------------\n");gotoxy(40,20);printf("^_^ 欢迎使用^_^");sleep(3);clrscr();}int main() /*主函数,程序入口*//* 显示程序功能选择界面*/{ALGraph G;int i;textbackground(7);textcolor(5);clrscr();Disp();printf("请选择程序功能:\n");printf("*************************************\n"); printf("** 1=管理员管理**\n");printf("** 2=用户咨询**\n");printf("** 3=显示交通系统**\n");printf("** 4=退出**\n");printf("*************************************\n"); printf("请选择");scanf("%d",&i);getchar();while(i!=4){clrscr();switch(i){case 1:Administer(&G);break;case 2:UserDemand(G);break;case 3:PrintGraph(&G);break;}printf("\n请选择程序功能:\n");printf("*************************************\n"); printf("** 1=管理员管理**\n");printf("** 2=用户咨询**\n");printf("** 3=显示交通系统**\n");printf("** 4=退出**\n");printf("*************************************\n"); printf("选择");scanf("%d",&i);getchar();}clrscr();gotoxy(20,10);printf("--------------------------------\n");gotoxy(20,11);printf("| 指导老师:夏汉民老师|\n");gotoxy(20,12);printf("| |\n");gotoxy(20,13);printf("| 制作:李济舟|\n");gotoxy(20,14);printf("| |\n");gotoxy(20,15);printf("--------------------------------\n");gotoxy(40,20);printf("谢谢使用");sleep(1);gotoxy(40,20);printf("正在退出");for(i=0;i<3;i++){ printf(".");sleep(i);}return 0;}void Administer(ALGraph *G) /* 显示管理员管理项目选择界面*/ {int i,j=0;char password[5];be:clrscr();gotoxy(20,10);printf("-------------------------------------\n");gotoxy(20,11);printf("| 管理员管理项目|\n");gotoxy(20,13);printf("| 1.初始化交通系统|\n");gotoxy(20,15);printf("| 2.城市编辑|\n");gotoxy(20,17);printf("| 3.飞机航班编辑|\n");gotoxy(20,19);printf("| 4.列车车次编辑|\n");gotoxy(20,20);printf("-------------------------------------\n");gotoxy(40,25);printf("请输入登陆密码(admin):");for(i=0;i<5;i++){password[i]=getch();printf("*");}if(password[0]!='a'||password[1]!='d'||password[2]!='m'||password[3]!='i'||password[4]!='n') {gotoxy(50,25);printf("输入错误,请重新输入!");j++;if(j==3)system(exit);getch();goto be;}printf("\n请选择管理项目:\n");printf("1=初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5=返回上一级菜单\n");printf("选择");scanf("%d",&i);while(i!=5){switch(i){case 1:initgraph(G); /*初始化交通系统*/ break;case 2:cityedit(G); /*城市编辑*/ break;case 3:flightedit(G); /*飞机航班编辑*/ break;case 4:trainedit(G); /*列车车次编辑*/ break;}printf("\n请选择管理项目:\n");printf("*************************************\n");printf("** 1=初始化交通系统**\n"); printf("** 2=城市编辑**\n");printf("** 3=飞机航班编辑**\n");printf("** 4=列车车次编辑**\n");printf("** 5=返回上一级菜单**\n");printf("*************************************\n");printf("1=初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5=返回上一级菜单\n");printf("选择");scanf("%d",&i);}}void initgraph(ALGraph *G) /*初始化交通系统*//* 初始化交通系统方式选择界面*/{int i;printf("\n请选择初始化方式:\n");printf("1=键盘\n2=文档\n");printf("选择");scanf("%d",&i);getchar();switch(i){case 1:createcityfile();createplanefile();createtrainfile();CreateGraph(G);break;case 2:CreateGraph(G);break;}}void createcityfile() /* 创建城市名称文档*/ {int i=0;int j;char flag='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]);fclose(fp);}void createplanefile() /* 创建飞机航班文档*/{int code,bt[2],at[2]; /*code航班编号,bt出发时间,at到达时间*/ float money;int i;int count;char vt[10],vh[10],flag; /*vt起始城市,vh目标城市*/FILE *fp;flag='y';count=0;while(flag=='Y'||flag=='y') /*flag为标志位,初值为1*/{printf("请输入飞机航班的信息:\n");/*提示"输入航班信息"*/printf("飞机航班编号:"); /*输入航班code*/scanf("%d",&code);getchar();printf("起始城市:"); /*输入航班的出发城市vt*/gets(vt);getchar();printf("目的城市:"); /*输入航班的到达城市vh*/gets(vh);printf("航班费用:"); /*输入机票价格money*/scanf("%f",&money);getchar();printf("起飞时间:"); /*输入航班的出发时间bt*/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("到达时间:"); /*输入航班的到达时间at*/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; /*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+1*/printf("继续输入(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(struct arc),1,fp)!=1) /*无法将a[i]写入航班文件*/ printf("\n文件写入错误!\n"); /*提示"文件无法写入"*/fclose(fp); /*关闭航班文件*/}void createtrainfile() /* 创建列车车次文档*/{int code,bt[2],at[2];float money;int i;int count;char vt[10],vh[10],flag;FILE *fp;flag='y';count=0;while(flag=='y'||flag=='Y'){printf("请输入列车车次的信息:\n");printf("列车车次编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();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(struct arc),1,fp)!=1)printf("\n文件写入错误!\n");fclose(fp);}int LocateVertex(ALGraph *G,char *v) /* 城市名在交通系统中定位操作,找出城市名在图中对应结点位置*/{int j,k;j=-1;for(k=0;k<G->vexnum;k++)if(strcmp(G->vertices[k].cityname,v)==0) /*第k个结点中的城市名与传过来的城市名相同*/{j=k; /*记录位置*/break;}return(j);}void CreateGraph(ALGraph *G) /* 用city,plan,train三个文档创建城市交通系统*/ {int i,j,k;int arc_num;int count1,count2;int m,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]);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(struct arc),1,fp)!=1)printf("\n文件读入错误!\n");k++;}fclose(fp); /*关闭文件*/k=0; /*a的计数变量k=0*/arc_num=0; /*弧的计数变量arc_num=0*/while(k<count1){i=LocateVertex(G,a[k].vt);/*调用函数LocateVertex(G,a[k].vt)得到起始结点的位置i*/ j=LocateVertex(G,a[k].vh);/*调用函数LocateVertex(G,a[k].vh)得到起始结点的位置j*/ q=G->vertices[i].planefirstarc;m=0;while(q!=NULL){if(q->adjvex==j) /*弧q中的邻接顶点与j相等*/{t=q->st+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->st=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[1]=a[k].at[1];p->st=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(struct arc),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)得到起始结点的位置i*/j=LocateVertex(G,a[k].vh);/* 调用函数LocateVertex(G,a[k].vh)得到起始结点的位置j*/q=G->vertices[i].trainfirstarc;m=0;while(q!=NULL){if(q->adjvex==j) /*弧q中的邻接顶点与j相等*/{t=q->st+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->st=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->st=0;p->nextarc=G->vertices[i].trainfirstarc;G->vertices[i].trainfirstarc=p; /*将弧结点连接到适当的位置中去*/ arc_num++;}k++;}G->trainarcnum=arc_num;}int save(ALGraph *G) /* 保存城市交通系统到相应的文档*/{int i,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->st;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");return 0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(struct arc),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->st;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");return 0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)printf("\n文件写入错误!\n");i++;}fclose(fp);return 1;}void cityedit(ALGraph *G) /* 显示城市编辑项目选择界面*/ {int i;printf("\n请选择城市编辑项目:\n");printf("1=增加城市\n2=删除城市\n");printf("选择");scanf("%d",&i);getchar();if(i==1)EnterVertex(G);if(i==2)DeleteVertex(G);}void EnterVertex(ALGraph *G) /* 增加城市*/char v[10],c;int i;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);}else return;}}void DeleteVertex(ALGraph *G)/* G是程序头部定义的结构体*//* 删除城市*/{int i,j,k,n;char v[10],c;ArcNode *p,*q,*m;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表头结点总个数比实际大1*/n++;/*记数值n+1*/if(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; /*将该弧指向顶点位置-1*/q=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);}else return;}void flightedit(ALGraph *G) /* 飞机航班编辑项目选择界面*/ {int i; /* char q; */printf("\n请选择飞机航班编辑项目:\n");printf("1=新增航班\n2=删除航班\n");printf("选择");scanf("%d",&i);getchar();if(i==1)EnterplaneArc(G);if(i==2)DeleteplaneArc(G);}void trainedit(ALGraph *G) /* 列车车次编辑项目选择界面*/ {int i; /* char q; */printf("\n请选择列车车次编辑项目:\n");printf("1=新增车次\n2=删除车次\n");printf("选择");scanf("%d",&i);getchar();if(i==1)EntertrainArc(G);if(i==2)DeletetrainArc(G);}void EnterplaneArc(ALGraph *G) /* 增加飞机航班*/ {int i,j,bt[2],at[2];int code;float money;int m,t;char vt[10],vh[10],c;ArcNode *p,*q;printf("\n请输入新增飞机航班的信息:\n");printf("飞机航班编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();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->st+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->st=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->st=0;p->nextarc=G->vertices[i].planefirstarc;G->vertices[i].planefirstarc=p;G->planearcnum++;}save(G);}else return;}void EntertrainArc(ALGraph *G) /* 增加列车车次*/ {int i,j,bt[2],at[2];int code;float money;int m,t;char vt[10],vh[10],c;ArcNode *p,*q;printf("\n请输入新增列车车次的信息:\n");printf("列车车次编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();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].trainfirstarc;m=0;while(q!=NULL){if(q->adjvex==j){t=q->st+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->st=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->st=0;p->nextarc=G->vertices[i].trainfirstarc;G->vertices[i].trainfirstarc=p;G->trainarcnum++;}save(G);}else return;}int DeleteplaneArc(ALGraph *G) /* 删除飞机航班*/ {int i,j;int code;char vt[10],vh[10],c;int n;int k;ArcNode *p,*q;printf("\n请输入删除飞机航班的信息:\n");printf("飞机航班的编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();printf("目的城市:");gets(vh);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 0;}if(j==-1){printf("\n错误!无法找到目的城市\n");return 0;}p=G->vertices[i].planefirstarc;q=p;while(p!=NULL){if(p->adjvex==j){n=-1;for(k=0;k<=p->st;k++){if(p->info.stata[k].number==code){n=k;break;}}if(n!=-1)if(p->st==0){if(q==p)G->vertices[i].planefirstarc=p->nextarc;elseq->nextarc=p->nextarc;free(p);}else{for(k=n;k<p->st;k++){p->info.stata[k].number=p->info.stata[k+1].number;p->info.stata[k].expenditure=p->info.stata[k+1].expenditure;p->info.stata[k].begintime[0]=p->info.stata[k+1].begintime[0];p->info.stata[k].begintime[1]=p->info.stata[k+1].begintime[1];p->info.stata[k].arrivetime[0]=p->info.stata[k+1].arrivetime[0];p->info.stata[k].arrivetime[1]=p->info.stata[k+1].arrivetime[1]; } p->st=p->st-1;}elseprintf("\n在此两城市之间无法找到No.%d飞机航班\n",code);save(G);return 0;}q=p;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
全国交通咨询系统设计C语言公司标准化编码 [QQX96QT-XQQB89Q8-NQQJ6Q8-MQM9N]/* *建立一个模拟的交通网络(用有向网来表示),编程实现从某个城市 *出发到另一个城市所需的最短的时间及路径。
* *建立一个模拟的交通网络(用有向网来表示),编程实现从某个城市 *出发到另一个城市所需的最短的时间及路径。
* */ #define MAX_VERTEX_NUM 18#define NULL 0#define MAX_ARC_SIZE 100#define MAX_ROUTE_NUM 5#include"stdio.h"#include"stdlib.h"#include"string.h"#define False 0#define True 1#define INFINITY 10000 /*预定义*/typedef struct {int number;float expenditure;int begintime[2];int arrivetime[2];}Vehide;typedef struct {Vehide stata[MAX_ROUTE_NUM];int last;}infolist;typedef struct ArcNode {int adjvex;struct ArcNode *nextarc;infolist info;}ArcNode;typedef struct VNode {char cityname[10];ArcNode *planefirstarc,*trainfirstarc;}VNode,AdjList[MAX_VERTEX_NUM];typedef struct {AdjList vertices;int vexnum,planearcnum,trainarcnum;}ALGraph;typedef struct Node {int adjvex;int route;struct Node *next;}Node;typedef struct QNode {int adjvex;struct QNode *next;}QNode;typedef struct {QNode *front;QNode *rear;}LinkQueue;typedef struct TimeNode {int adjvex;int route;int begintime[2];int arrivetime[2];struct TimeNode *child[MAX_ROUTE_NUM];}TimeNode,*TimeTree;struct arc {int co;char vt[10];char vh[10];int bt[2];int at[2];float mo;}a[MAX_ARC_SIZE]; /*数据结构定义*/char city[MAX_VERTEX_NUM][10];int TTime[2];int time[2];int time1[2];int time2[2];int c[MAX_VERTEX_NUM];int d[MAX_VERTEX_NUM]; /*变量定义*//*各种操作说明*/void Disp();void Administer(ALGraph *G);void cityedit(ALGraph *G);void CopyTimeTree(TimeTree p,TimeTree q);void createcityfile();void CreateGraph(ALGraph *G);void createplanefile();void CreateTimeTree(TimeTree p,int i,int j,LinkQueue *Q,infolist(*arcs)[MAX_VERTEX_NUM]);void createtrainfile();int DeleteplaneArc(ALGraph *G);void DeleteQueue(LinkQueue *Q,int *x);int DeletetrainArc(ALGraph *G);void DeleteVertex(ALGraph *G);void DemandDispose(int n,ALGraph G);void DestoryTimeTree(TimeTree p);void EnterplaneArc(ALGraph *G);void EnterQueue(LinkQueue *Q,int x);void EntertrainArc(ALGraph *G);void EnterVertex(ALGraph *G);void ExpenditureDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1,float *M,int *final);void flightedit(ALGraph *G);void initgraph(ALGraph *G);void InitQueue(LinkQueue *Q);int IsEmpty(LinkQueue *Q);int LocateVertex(ALGraph *G,char *v);void MinExpenditure(infolist arcs,float *expenditure,int *route);void MinTime(infolist arcs,int *time,int *route);void PrintGraph(ALGraph *G);int save(ALGraph *G);void TimeDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1,int (*T)[2],int *final);void TimeTreeDispose(Node *head,infolist (*arcs)[MAX_VERTEX_NUM]);void trainedit(ALGraph *G);void TransferDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1);void UserDemand(ALGraph G);void VisitTimeTree(TimeTree p);void Disp() /*软件入口,显示函数*/{textbackground(7);textcolor(5);gotoxy(20,10);printf("--------------------------------\n");gotoxy(20,11);printf("| 交通咨询系统 Version 1.0 |\n");gotoxy(20,12);printf("| |\n");gotoxy(20,13);printf("| 一叶方舟 |\n");gotoxy(20,14);printf("| |\n");gotoxy(20,15);printf("--------------------------------\n"); gotoxy(40,20);printf("^_^ 欢迎使用 ^_^");sleep(3);clrscr();}int main() /*主函数,程序入口*//* 显示程序功能选择界面 */{ALGraph G;int i;textbackground(7);textcolor(5);clrscr();Disp();printf("请选择程序功能:\n");printf("*************************************\n"); printf("** 1=管理员管理 **\n");printf("** 2=用户咨询 **\n");printf("** 3=显示交通系统 **\n");printf("** 4=退出 **\n");printf("*************************************\n"); printf("请选择?");scanf("%d",&i);getchar();while(i!=4){clrscr();switch(i){case 1:Administer(&G);break;case 2:UserDemand(G);break;case 3:PrintGraph(&G);break;}printf("\n请选择程序功能:\n");printf("*************************************\n");printf("** 1=管理员管理 **\n");printf("** 2=用户咨询 **\n");printf("** 3=显示交通系统 **\n");printf("** 4=退出 **\n");printf("*************************************\n");printf("选择?");scanf("%d",&i);getchar();}clrscr();gotoxy(20,10);printf("--------------------------------\n");gotoxy(20,11);printf("| 指导老师:夏汉民老师 |\n");gotoxy(20,12);printf("| |\n");gotoxy(20,13);printf("| 制作:李济舟 |\n");gotoxy(20,14);printf("| |\n");gotoxy(20,15);printf("--------------------------------\n");gotoxy(40,20);printf("谢谢使用");sleep(1);gotoxy(40,20);printf("正在退出");for(i=0;i<3;i++){ printf(".");sleep(i);}return 0;}void Administer(ALGraph *G) /* 显示管理员管理项目选择界面 */int i,j=0;char password[5];be:clrscr();gotoxy(20,10);printf("-------------------------------------\n");gotoxy(20,11);printf("| 管理员管理项目 |\n");gotoxy(20,13);printf("| 1.初始化交通系统 |\n");gotoxy(20,15);printf("| 2.城市编辑 |\n");gotoxy(20,17);printf("| 3.飞机航班编辑 |\n");gotoxy(20,19);printf("| 4.列车车次编辑 |\n");gotoxy(20,20);printf("-------------------------------------\n");gotoxy(40,25);printf("请输入登陆密码(admin):");for(i=0;i<5;i++){password[i]=getch();printf("*");}if(password[0]!='a'||password[1]!='d'||password[2]!='m'||password[3]!='i '||password[4]!='n') {gotoxy(50,25);printf("输入错误,请重新输入!");j++;if(j==3)system(exit);getch();goto be;}printf("\n请选择管理项目:\n");printf("1=初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5=返回上一级菜单\n");printf("选择?");scanf("%d",&i);while(i!=5)switch(i){case 1:initgraph(G); /*初始化交通系统*/ break;case 2:cityedit(G); /*城市编辑*/ break;case 3:flightedit(G); /*飞机航班编辑*/ break;case 4:trainedit(G); /*列车车次编辑*/ break;}printf("\n请选择管理项目:\n");printf("*************************************\n");printf("** 1=初始化交通系统 **\n"); printf("** 2=城市编辑 **\n");printf("** 3=飞机航班编辑 **\n");printf("** 4=列车车次编辑 **\n");printf("** 5=返回上一级菜单 **\n");printf("*************************************\n");printf("1=初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5=返回上一级菜单\n");printf("选择?");scanf("%d",&i);}}void initgraph(ALGraph *G) /*初始化交通系统*//* 初始化交通系统方式选择界面 */{int i;printf("\n请选择初始化方式:\n");printf("1=键盘\n2=文档\n");printf("选择?");scanf("%d",&i);getchar();switch(i){case 1:createcityfile();createplanefile();createtrainfile();CreateGraph(G);break;case 2:CreateGraph(G);break;}}void createcityfile() /* 创建城市名称文档 */{int i=0;int j;char flag='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]);fclose(fp);}void createplanefile() /* 创建飞机航班文档 */{int code,bt[2],at[2]; /*code航班编号,bt出发时间,at到达时间*/ float money;int i;int count;char vt[10],vh[10],flag; /*vt起始城市,vh目标城市*/FILE *fp;flag='y';count=0;while(flag=='Y'||flag=='y') /*flag为标志位,初值为1*/{printf("请输入飞机航班的信息:\n");/*提示"输入航班信息"*/printf("飞机航班编号:"); /*输入航班code*/scanf("%d",&code);getchar();printf("起始城市:"); /*输入航班的出发城市vt*/gets(vt);getchar();printf("目的城市:"); /*输入航班的到达城市vh*/gets(vh);printf("航班费用:"); /*输入机票价格money*/scanf("%f",&money);getchar();printf("起飞时间:"); /*输入航班的出发时间bt*/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("到达时间:"); /*输入航班的到达时间at*/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; /*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+1*/printf("继续输入?(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(struct arc),1,fp)!=1) /*无法将a[i]写入航班文件*/ printf("\n文件写入错误!\n"); /*提示"文件无法写入"*/fclose(fp); /*关闭航班文件*/}void createtrainfile() /* 创建列车车次文档 */{int code,bt[2],at[2];float money;int i;int count;char vt[10],vh[10],flag;FILE *fp;flag='y';count=0;while(flag=='y'||flag=='Y'){printf("请输入列车车次的信息:\n");printf("列车车次编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();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(struct arc),1,fp)!=1)printf("\n文件写入错误!\n");fclose(fp);}int LocateVertex(ALGraph *G,char *v) /* 城市名在交通系统中定位操作,找出城市名在图中对应结点位置 */{int j,k;j=-1;for(k=0;k<G->vexnum;k++)if(strcmp(G->vertices[k].cityname,v)==0) /*第k个结点中的城市名与传过来的城市名相同*/{j=k; /*记录位置*/break;}return(j);}void CreateGraph(ALGraph *G) /* 用city,plan,train三个文档创建城市交通系统 */{int i,j,k;int arc_num;int count1,count2;int m,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]);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(struct arc),1,fp)!=1)printf("\n文件读入错误!\n");k++;}fclose(fp); /*关闭文件*/k=0; /*a的计数变量k=0*/arc_num=0; /*弧的计数变量 arc_num=0*/while(k<count1){i=LocateVertex(G,a[k].vt);/*调用函数 LocateVertex(G,a[k].vt)得到起始结点的位置 i*/j=LocateVertex(G,a[k].vh);/*调用函数 LocateVertex(G,a[k].vh)得到起始结点的位置 j*/q=G->vertices[i].planefirstarc;m=0;while(q!=NULL){if(q->adjvex==j) /*弧 q中的邻接顶点与j相等*/{t=q->st+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->st=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->st=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(struct arc),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)得到起始结点的位置 i*/ j=LocateVertex(G,a[k].vh);/* 调用函数 LocateVertex(G,a[k].vh)得到起始结点的位置 j*/ q=G->vertices[i].trainfirstarc;m=0;while(q!=NULL){if(q->adjvex==j) /*弧 q中的邻接顶点与j相等*/{t=q->st+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->st=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->st=0;p->nextarc=G->vertices[i].trainfirstarc;G->vertices[i].trainfirstarc=p; /*将弧结点连接到适当的位置中去*/ arc_num++;}k++;}G->trainarcnum=arc_num;}int save(ALGraph *G) /* 保存城市交通系统到相应的文档 */{int i,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->st;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");return 0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(struct arc),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->st;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");return 0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)printf("\n文件写入错误!\n");i++;}fclose(fp);return 1;}void cityedit(ALGraph *G) /* 显示城市编辑项目选择界面 */ {int i;printf("\n请选择城市编辑项目:\n");printf("1=增加城市\n2=删除城市\n");printf("选择?");scanf("%d",&i);getchar();if(i==1)EnterVertex(G);if(i==2)DeleteVertex(G);}void EnterVertex(ALGraph *G) /* 增加城市 */{char v[10],c;int i;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);}else return;}}void DeleteVertex(ALGraph *G)/* G是程序头部定义的结构体*//* 删除城市 */{int i,j,k,n;char v[10],c;ArcNode *p,*q,*m;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表头结点总个数比实际大1*/n++;/*记数值n+1*/if(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; /*将该弧指向顶点位置-1*/q=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);}else return;}void flightedit(ALGraph *G) /* 飞机航班编辑项目选择界面 */ {int i; /* char q; */printf("\n请选择飞机航班编辑项目:\n");printf("1=新增航班\n2=删除航班\n");printf("选择?");scanf("%d",&i);getchar();if(i==1)EnterplaneArc(G);if(i==2)DeleteplaneArc(G);}void trainedit(ALGraph *G) /* 列车车次编辑项目选择界面 */ {int i; /* char q; */printf("\n请选择列车车次编辑项目:\n");printf("1=新增车次\n2=删除车次\n");printf("选择?");scanf("%d",&i);getchar();if(i==1)EntertrainArc(G);if(i==2)DeletetrainArc(G);}void EnterplaneArc(ALGraph *G) /* 增加飞机航班 */ {int i,j,bt[2],at[2];int code;float money;int m,t;char vt[10],vh[10],c;ArcNode *p,*q;printf("\n请输入新增飞机航班的信息:\n");printf("飞机航班编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();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->st+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->st=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->st=0;p->nextarc=G->vertices[i].planefirstarc;G->vertices[i].planefirstarc=p;G->planearcnum++;}save(G);}else return;}void EntertrainArc(ALGraph *G) /* 增加列车车次 */ {int i,j,bt[2],at[2];int code;float money;int m,t;char vt[10],vh[10],c;ArcNode *p,*q;printf("\n请输入新增列车车次的信息:\n");printf("列车车次编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();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].trainfirstarc;m=0;while(q!=NULL){if(q->adjvex==j){t=q->st+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->st=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->st=0;p->nextarc=G->vertices[i].trainfirstarc;G->vertices[i].trainfirstarc=p;G->trainarcnum++;}save(G);}else return;}int DeleteplaneArc(ALGraph *G) /* 删除飞机航班 */ {int i,j;int code;char vt[10],vh[10],c;int n;int k;ArcNode *p,*q;printf("\n请输入删除飞机航班的信息:\n");printf("飞机航班的编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();printf("目的城市:");gets(vh);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 0;}if(j==-1){printf("\n错误!无法找到目的城市\n");return 0;}p=G->vertices[i].planefirstarc;q=p;while(p!=NULL){if(p->adjvex==j){n=-1;for(k=0;k<=p->st;k++){if(p->info.stata[k].number==code){n=k;break;}}if(n!=-1)if(p->st==0){if(q==p)G->vertices[i].planefirstarc=p->nextarc;elseq->nextarc=p->nextarc;free(p);}else{for(k=n;k<p->st;k++){p->info.stata[k].number=p->info.stata[k+1].number; p->info.stata[k].expenditure=p->info.stata[k+1].expenditure; p->info.stata[k].begintime[0]=p->info.stata[k+1].begintime[0]; p->info.stata[k].begintime[1]=p->info.stata[k+1].begintime[1]; p->info.stata[k].arrivetime[0]=p->info.stata[k+1].arrivetime[0]; p->info.stata[k].arrivetime[1]=p->info.stata[k+1].arrivetime[1]; } p->st=p->st-1;}elseprintf("\n在此两城市之间无法找到No.%d飞机航班\n",code);save(G);return 0;}q=p;。