数据结构课程设计--全国交通咨询模拟 代码
数据结构课程设计全国交通咨询系统
.郑州工业应用技术学院课程设计任务书题目全国交通资询系统主要内容:设计了一个方便用户查询交通咨询系统。
该系统所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。
该系统可以进行城市,列车车次和飞机航班的编辑的基本信息输入操作。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。
基本要求: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指导教师签名:课程负责人签名:随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。
对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。
在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。
尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。
即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。
为此开发一个交通择优系统是十分必要的。
采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规范化和自动化。
全国交通咨询模拟系统源代码
12050741班(郭晓湛,李佳豪,廖川,杨鹤)课题:全国交通系统咨询模拟源程序代码:#include <windows.h>#include <stdio.h>#include <string.h>#include <vector>#include<iostream>#include <malloc.h>#define INF 65535 //定义一个最大数定为无穷值#define MAX 23using namespace std;static int c_number=10;static int k=0;static int v=0,z=0,r=0,t=0;typedef struct search{int c_transer;int c_cost;int c_time;int f_cost;int f_time;}search;search m[20],x[20],n[20];typedef int costAdj[MAX+1][MAX+1];//图邻接矩阵从1开始记数int Path[MAX+1][MAX+1];//图邻接矩阵从1开始记数typedef struct unDiGraph{int numVerts; //结点costAdj cost; //邻接矩阵}unDiGraph,*UNG; //图的定义typedef struct c_edit{char a[10];}c_edit;c_edit add[10];costAdj B,L;//定位函数,输出城市列表,增添城市。
int pr(int i,int j){int h=0;if (j==0){h=i;}else if (j==1){cin>>add[i].a;}switch(h)//运用switch语句。
{case(0):cout<<"";break;case(1) : cout<<"成都 ";break; case(2) : cout<<"西安 ";break; case(3) : cout<<"郑州 ";break; case(4) : cout<<"武汉 ";break; case(5) : cout<<"株洲 ";break;case(6) : cout<<"贵阳 ";break;case(7) : cout<<"柳州 ";break;case(8) : cout<<"广州 ";break;case(9) : cout<<"南宁 ";break;case(10) : cout<<"徐州 ";break;default:cout<<add[i-10].a;}return 1;}//输出城市列表及相应代码void pri(){int i;cout<<" 城市及其代码"<<endl<<endl<<endl;cout<<"****************************"<<endl; for (i=1;i<=c_number;i++){cout<<i<<".";pr(i,0);}cout<<endl<<"***********************"<<endl<<endl<<endl< <endl<<endl<<endl;}//构造带权(费用)图返回首地址G:unDiGraph *CreateCostG(int o)//火车的花费的存贮和编辑功能{unDiGraph *G;int i,j;int a=0,b=0,f,h=1;if(!(G=(unDiGraph *)malloc(sizeof(unDiGraph)))) //为G 分配存储空间。
实验报告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,并输入起点站和重点站,然后选择交通工具四、小结从小学家里买了电脑起,我对计算机就相当感兴趣,有事没事就喜欢捣鼓捣鼓。
全国交通咨询系统设计(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];int arrivetime[2];}V ehide;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 DeleteV ertex(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 EnterV ertex(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 LocateV ertex(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 LocateV ertex(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=LocateV ertex(G,a[k].vt);/*调用函数LocateV ertex(G ,a[k].vt) 得到起始结点的位置i*/j=LocateV ertex(G,a[k].vh);/*调用函数LocateV ertex(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=LocateV ertex(G,a[k].vt);/* 调用函数LocateV ertex(G,a[k].vt) 得到起始结点的位置i*/ j=LocateV ertex(G,a[k].vh);/* 调用函数LocateV ertex(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)EnterV ertex(G);if(i==2)DeleteVertex(G);}void EnterV ertex(ALGraph *G) /* 增加城市*/{char v[10],c;int i;printf("\n 请输入新增城市的名称:");gets(v);i=LocateV ertex(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 DeleteV ertex(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=LocateV ertex(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=LocateV ertex(G,vt);j=LocateV ertex(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=LocateV ertex(G,vt);j=LocateV ertex(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=LocateV ertex(G,vt);j=LocateV ertex(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;p=p->nextarc;}。
数据结构课程设计交通咨询系统实验参考代码
数据结构课程设计交通咨询系统实验参考代码#include<stdio.h>#include<stdlib.h>#define MVNum 100//最大顶点数#define Maxint 32767enum boolean{FALSE,TRUE};typedef char VertexType;typedef int Adjmatrix;typedef struct{VertexType vexs[MVNum];//顶点数组,类型假定为charAdjmatrix arcs[MVNum][MVNum];//邻接矩阵,类型假定为int 型}MGraph;int D1[MVNum],P1[MVNum];int D[MVNum][MVNum],P[MVNum][MVNum];/*建立有向图的储存结构*/void CreateMGraph(MGraph * G,int n,int e){//采用邻接矩阵表示法构造有向图G,n、e表示图的当前顶点数和边数int i,j,k,w;for(i=1;i<=n;i++)//输入顶点信息G->vexs[i]=(char)i;for(i=1;i<=n;i++)for(j=1;j<=n;j++)G->arcs[i][j]=Maxint;//初始化邻接矩阵printf("输入%d条边人i、j及w:\n",e);for(k=1;k<=e;k++)//读入e条边,建立邻接矩阵{scanf("%d,%d,%d",&i,&j,&w);G->arcs[i][j]=w;}printf("有向图人存储结构建立完毕!\n");}/*迪杰斯特拉算法*/void Dijkstra(MGraph *G,int v1,int n){//利用迪杰斯特拉算法,求出有向图G的v1顶点到其他顶点v 的最短路径P[v]及权D[v]int D2[MVNum],P2[MVNum];int v,i,w,min;enum boolean S[MVNum];for(v=1;v<=n;v++)//初始化S和D{S[v]=FALSE;//置空最短路径终点集D2[v]=G->arcs[v1][v];//置初始的最短路径值if(D2[v]<Maxint)P2[v]=v1;//v1是v的前趋(双亲)elseP2[v]=0;//v无前趋(双亲)}D2[v1]=0;S[v1]=TRUE;//S集初始时只有源点,距离为0for(i=2;i<n;i++)//其余n-1个顶点{min=Maxint;for(w=1;w<=n;w++)if(!S[w] && D2[w]<min){ v=w;min=D2[w]; }//w顶点离v1顶点更近S[v]=TRUE;for(w=1;w<=n;w++)//更新当前最短路径及距离if(!S[w]&&(D2[v]+G->arcs[v][w]<D2[w])) { D2[w]=D2[v]+G->arcs[v][w];P2[w]=v;}}printf("路径长度,路径\n");for(i=1;i<=n;i++){ printf("%5d",D2[i]);printf("%5d",i); v=P2[i];while(v!=0){printf("<-%d",v);v=P2[v];}printf("\n");}}/*费洛伊德算法*/void Floyd(MGraph *G,int n){//利用费洛伊德算法,求出最短路径int i,j,k;for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(G->arcs[i][j]!=Maxint)P[i][j]=j;elseP[i][j]=0;D[i][j]=G->arcs[i][j];}for(k=1;k<=n;k++){for(i=1;i<=n;i++)for(j=1;j<=n;j++){ if(D[i][k]+D[k][j]<D[i][j]){D[i][j]=D[i][k]+D[k][j];P[i][j]=P[i][k];}}}}void main(){MGraph *G;int n,e,v,w,k;int xz=1;G=(MGraph *)malloc(sizeof(MGraph));printf("输入图中顶点个数和边数n,e:");scanf("%d,%d",&n,&e);CreateMGraph(G,n,e);//建立图的存储结构while(xz!=0){printf("***********求城市之间的最短距离***********\n");printf("================================= =========\n");printf("1.求一个城市到所有城市的最短距离\n");printf("2.求任意的两个城市之间的最短距离\n");printf("================================== ========\n");printf("请选择:1或2,选择0 退出:\n");scanf("%d",&xz);if(xz==2){Floyd(G,n);////调用费洛伊德算法printf("输入源点和终点:v,w:\n");scanf("%d,%d",&v,&w);k=P[v][w];if(k==0)printf("顶点 %d 到 %d 无路径!\n",v,w);else{printf("从顶点 %d 到 %d 最短路径是 %d",v,w,v); while(k!=w){printf("->%d",k);k=P[k][w];//k为v的后继顶点}printf("->%d",k);//输出后继顶点printf("路径长度:%d\n",D[v][w]);}}elseif(xz==1){printf("求单源路径,输入源点v;");scanf("%d",&v);Dijkstra(G,v,n);//调用迪杰斯特拉算法}}printf("结束求最短路径,再见!\n");}。
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逻辑结构设计采用图结构来表示该全国交通网络,用一个结构体来表示时间,结构体内有标准化的(天,时,分)的相关表示以及操作,重载的运算符“-”。
全国交通网络中的城市用结点表示,两个城市之间的航线或者列车线用两个结点之间的边来表示。
城市结点中包含城市名字、城市编号、第一条航线/列车线以及航线/列车线的数目;边结点中包含到达城市名称,指向下一航线/列车线的指针,以及指向该边所指代航线/列车线信息的指针;航班线/列车线信息结点包含航班号/列车号,出发时间,到达时间,花费时间,花费金额。
数据结构《交通咨询系统》完整代码
数据结构《交通咨询系统》完整代码#include#include#include#include#define zuida 32767#define max 20typedef struct lu{int distance;int cost;int time;}lu,lujin[max][max];typedef struct city{char name[20];}citys[max];typedef struct{citys clist;lujin arcs;int c_n,l_n;}Graph;typedef struct{char adjvex;int mincost;int mindistance;int mintime;}closedge;void zairu(Graph *G);void Administer(Graph G);void show(Graph G);int insertcity(Graph *G);int insertlu(Graph *G);int Located(Graph *G, char *p);void baocun(Graph G);int serchlu(Graph *G);int main(){int y,j;Graph G;zairu(&G);//载⼊交通信息while(1){system("cls");printf("\n\n\n\n\n\n");printf("**********************************欢迎使⽤交通咨询系统**************************\n\n"); printf("\t\t\t※※※※※※※※※※※※※※※※※※※※※\n");printf("\t\t\t※※ 1=管理员管理※\n");printf("\t\t\t※※ 2=⽤户咨询路径※\n");printf("\t\t\t※※ 3=显⽰交通系统信息※\n");printf("\t\t\t※※ 4=退出※\n");printf("\t\t\t※※※※※※※※※※※※※※※※※※※※※\n\n\n");printf("********************************************************************************\n");printf("\t\t\t请选择?");scanf("%d",&y);getchar();switch(y){case 1: system("cls");Administer(G);break; //管理员case 2: system("cls");j = serchlu(&G);break; //⽤户case 3: show(G);//显⽰所有路径break;case 4: system("cls");printf("\n\n\n\t\t\t\t谢谢使⽤.......\n\n\n\n");exit(0);break;default:printf("请按提⽰重新输⼊\n");}}return 0;}void Administer(Graph G)/* 显⽰管理员管理项⽬选择界⾯ */{int i,j=0,x,y;char password[5],a;printf("请输⼊登陆密码(admin)|错误三次退出|:");while(1){ for(x=0;x<5;x++){scanf("%c",&a);password[x]=a;}if(password[0]!='a'||password[1]!='d'||password[2]!='m'||password[3]!='i'||password[4]!='n') {printf("输⼊错误,请重新输⼊!\n密码:");j++;if(j==3)exit(0);scanf("%c",&a);}else break;}system("cls");while(1){ printf("\n\n\n\n\n\n");printf("********************************************************************************\n\n");printf("\t\t\t※※※※※※※请选择管理项⽬※※※※※※\n");printf("\t\t\t※※ 1=增加城市※\n");printf("\t\t\t※※ 2=增加旅游路径※\n");printf("\t\t\t※※ 3=返回上⼀级菜单※\n");printf("\t\t\t※※※※※※※※※※※※※※※※※※※※\n\n\n");printf("********************************************************************************\n");printf("选择?");scanf("%d",&y);switch(y){case 1:i =insertcity(&G); /*增加城市*/if(i == -1)printf("该城市已经存在\n");elseprintf("增加成功\n");break;case 2: i = insertlu(&G);/*增加路径*/if(i == -1)printf("增加失败、不存在此城市\n");elseprintf("增加成功\n");break;case 3: baocun (G);system("cls");main(); break; /*返回主菜单*/default:printf("请按提⽰重新输⼊\n");}}}int insertlu(Graph *G)//增加城市交通信息{char Fromc[20], Toc[20];int i, j;int d, c, t;printf("输⼊增加路径的出发城市、⽬的城市、距离(公⾥)、花费(元)、时间(⼩时): \n"); scanf("%s %s %d %d %d", Fromc, Toc, &d, &c, &t);getchar();i = Located(G, Fromc);j = Located(G, Toc);if(i == -1 || j == -1)return -1;else{G->arcs[i][j].distance = G->arcs[j][i].distance = d;G->arcs[i][j].cost = G->arcs[j][i].cost = c;G->arcs[i][j].time = G->arcs[j][i].time = t;G->l_n++;}return 1;}int insertcity(Graph *G)//增加城市{char name[20];printf("输⼊要增加的城市: ");scanf("%s", name);getchar();if(G->c_n == 0){strcpy(G->clist[0].name, name);G->c_n++;}else{for(int i = 0; i < G->c_n; i++)if(strcmp(G->clist[i].name, name) == 0)return -1;elsestrcpy(G->clist[G->c_n].name, name);G->c_n++;}return 1;void mindistance(Graph *G, int v0, int v1)//最短距离{int *d;int vd,w,i,j,v;int mind, *pred, *finald;finald = (int *)malloc(G ->c_n * sizeof(int));//判断顶点是否已求出最短路径d = (int *)malloc(G ->c_n * sizeof(int));//储存起始点到各点的最短路径pred = (int *)malloc(G ->c_n * sizeof(int));//最后⽤于输出最短路径for(v=0;v < G->c_n; v++){finald[v] =0 ;d[v] =G ->arcs[v0][v].cost ;if(d[v] < zuida)pred[v] =v0;elsepred[v] =-1;}d[v0] = 0;//到起始点⽆路径finald[v0] =1;//v0放⼊到final数组⾥for(i=1;ic_n ;i++)//从1开始、因为起始点已经在final⾥⾯、剩下n - 1个顶点、循环n - 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。
全国交通咨询模拟(数据结构Java课程设计)
一、课程设计概述:使用语言:java编译环境:java虚拟机二、课程设计题目一[实验内容]全国交通咨询模拟[问题描述]1、管理员可以添加、修改、删除各交通路线信息。
2、用户查询从某一地点到另一地点的信息,提供查询转车次数最少、花费最少、所用时间最少的相关信息。
[需求分析]1、管理员和用户拥有不同的操作界面。
管理员从键盘输入个交通路线并保存在trainInformation.txt中。
2、对文件trainInformation.txt中的数据进行处理,要求具有如下功能:①、城市信息进行编辑。
②、对列车时刻表进行编辑(增设或删除)的功能。
③、提供三种最优决策:最省钱到达,转车最少。
④、提供各列车详细信息。
3、界面美观[概要设计]class MoneyLeast{}//求出两站点花费最少的路径class TrainContral{}//从文件中读出列车的所有信息或者将列车的信息写入到文件class TrainGraph{}//列车航线交通图class AdmFrame{}//管理员登陆界面class SearchInFrame{}//用户查询信息和显示信息界面[存储结构]class City{//城市存储private String cityName;}class Train {//列车存储private String trainID;private City startCity;private City endCity;private Date startDate;private Date endDate;private int money;}[详细设计]---City----/*** 城市的对象* 城市有城市名* 实现序列化* 重写equals方法和toString方法*/package com.consel;import java.io.Serializable;//实现序列化的接口public class City implements Serializable {private static final long serialVersionUID = 5612649006026227701L;private String cityName;public City(String cityName) {this.cityName = cityName;}public String getCityName() {return cityName;}public void setCityName(String cityName) {this.cityName = cityName;}@Overridepublic String toString() {return cityName;}@Overridepublic boolean equals(Object obj) {if (obj instanceof City) {City temp = (City) obj;if (this.cityName.equals(temp.cityName)) {return true;}}return false;}}----MoneyLeast-----/*** MoneyLeast 查找从花费最少的路径,及乘车路径* 使用的是普里姆算法*/package com.consel;public class MoneyLeast {final static int maxMoney = 10000;int n;int[] s;//s用来存储n个节点的标记int minMoney, u = 0;//t为列车信息图,c为起始城市,数组money是用来存储最少花费的路径,path是用来存储节点的上一节点public void leastMoney(TrainGraph t, City c, int[] money, City[] path) throws Exception {n = t.getNumOfVer();s = new int[n];for (int i = 0; i < n; i++) {money[i] = t.getMoney(c, t.city.get(i));s[i] = 0;if (money[i] < maxMoney) {path[i] = c;} else {path[i] = null;}}s[t.city.indexOf(c)] = 1;for (int i = 0; i < n; i++) {minMoney = maxMoney;for (int j = 0; j < n; j++) {if (s[j] == 0 && money[j] < minMoney) {u = j;minMoney = money[j];}}if (minMoney == maxMoney) {return;}s[u] = 1;City city = t.city.get(u);for (int j = 0; j < n; j++) {if (s[j] == 0 && t.getMoney(city, t.city.get(j)) < maxMoney &&money[u] + t.getMoney(city, t.city.get(j)) < money[j]) {money[j] = money[u] + t.getMoney(city, t.city.get(j));path[j] = city;}}}}}----MoneyTest-----package com.consel;import java.util.Iterator;import java.util.Stack;public class MoneyTest {MoneyLeast ml = new MoneyLeast();TrainGraph tg = new TrainGraph();int[] money;City[] path;public Stack<Train> st = new Stack<Train>();public MoneyTest() {int n = tg.city.size();money = new int[n];path = new City[n];for (int i = 0; i < n; i++) {money[i] = tg.maxMoney;path[i] = null;}}public Stack findMoneyLeast(City c1,City c2) throws Exception{ml.leastMoney(tg, c1,money, path);Stack<City> s = new Stack();s.add(c2);while (!c2.equals(c1)) {City c3 = path[tg.city.indexOf(c2)];s.add(c3);TrainContral ct = new TrainContral();ct.trainRead();Iterator<Train> i = ct.train.iterator();while(i.hasNext()){Train temp = i.next();if(temp.getStartCity().equals(c3) && temp.getEndCity().equals(c2)){st.add(temp);}}c2 = c3;}return s;}}----Train-----/*** Train 序列化,存储列车的信息,包括ID,起始站,终点站,发车时间,到站时间,价格*/package com.consel;import java.util.*;import java.io.Serializable;public class Train implements Serializable {private static final long serialVersionUID = 5612649006026227700L;private String trainID;//列车号private City startCity;//起始站private City endCity;//终点站private Date startDate;//发车时间private Date endDate;//到站时间private int money;//价格public Train(String trainID, City startCity, City endCity, Date startDate, Date endDate, int money) {this.trainID = trainID;this.startCity = startCity;this.endCity = endCity;this.startDate = startDate;this.endDate = endDate;this.money = money;/*** @return the trainID*/public String getTrainID() { return trainID;}/*** @return the money*/public int getMoney() {return money;}/*** @return the startCity*/public City getStartCity() { return startCity;}/*** @return the endCity*/public City getEndCity() { return endCity;}/*** @return the startDate */public Date getStartDate() { return startDate;}/*** @return the endDatepublic Date getEndDate() {return endDate;}}-----TrainContral------/*** TrainContral 从文件trainInformation.txt中读出各列车信息或将各列车信息写入到文件trainInformation.txt中*/package com.consel;import java.io.*;import java.util.*;public class TrainContral {File filename = new File("config/trainInformation.txt");ObjectInputStream ois;ObjectOutputStream oos;public List<Train> train = new ArrayList<Train>();/** 从trainInformation.txt读出所有列车的信息* 并存储于链表train中*/public void trainRead() {try {ois = new ObjectInputStream(new FileInputStream(filename));//文件输入流train = (List<Train>) ois.readObject();} catch (FileNotFoundException ex) {ex.printStackTrace();} catch (IOException ex) {ex.printStackTrace();} catch (ClassNotFoundException ex) {ex.printStackTrace();} finally {try {ois.close();// 关闭文件输入流} catch (Exception exx) {exx.printStackTrace();}}}/*** 将链表t中的所有火车信息写入到trainInformation.txt中* @param t*/public void trainWrite(List<Train> t) {try {oos = new ObjectOutputStream(new FileOutputStream(filename));// 文件输出流oos.writeObject(t);} catch (FileNotFoundException ex) {ex.printStackTrace();} catch (IOException ex) {ex.printStackTrace();} finally {try {oos.flush();//关闭文件缓冲流oos.close();//关闭文件流} catch (Exception exx) {exx.printStackTrace();}}}}------TrainGraph-------/*** TrainGraph 表示所有列车的信息* 查找以一个城市作为起点站,可以到达的另一个城市*/package com.consel;import java.util.*;public class TrainGraph {final static int maxMoney = 10000;List<City> city = new ArrayList<City>();TrainContral tc = new TrainContral();int[][] edges;public List<Train> train;Stack stack1 = new Stack();public Stack<City> stack = new Stack();/*临时保存路径节点的栈*/ public ArrayList<Stack> sers = new ArrayList();/*存储路径的集合*/public int getNumOfVer() {return city.size();}public TrainGraph() {//构造方法tc.trainRead();//从文件中读出所有列车的信息int n = tc.train.size();train = tc.train;Iterator it = train.iterator();/*** 存储交通路线中所有涉及到的城市*/while (it.hasNext()) {Train t = (Train) it.next();City c1 = t.getStartCity();City c2 = t.getEndCity();int x = city.indexOf(c1);int y = city.indexOf(c2);if (x < 0) {}if (y < 0) {city.add(c2);}}edges = new int[city.size()][city.size()];for (int i = 0; i < city.size(); i++) {for (int j = 0; j < city.size(); j++) {edges[i][j] = 0;}}it = tc.train.iterator();while (it.hasNext()) {Train t = (Train) it.next();City c1 = t.getStartCity();City c2 = t.getEndCity();int x = city.indexOf(c1);int y = city.indexOf(c2);edges[x][y] = 1;}}//以c为起始站的第一个终点站public int getFirstNeighbor(City c) throws Exception { int n = city.indexOf(c);if (n >= 0) {return getFirstNeighbor(n);}return - 1;}//查找邻接的城市private int getFirstNeighbor(int v) throws Exception { if (v < 0 || v > city.size()) {throw new Exception("参数错误!");}for (int col = 0; col < city.size(); col++) {if (edges[v][col] > 0) {}}return -1;}//查找下一个邻接城市public int getNextNeighbor(City c1, City c2) throws Exception { int m = city.indexOf(c1);int n = city.indexOf(c2);if (m >= 0 && n >= 0) {return getNextNeighbor(m, n);}return -1;}//查找下一个邻接城市private int getNextNeighbor(int v1, int v2) throws Exception { if (v1 < 0 || v1 > city.size() || v2 < 0 || v2 > city.size()) {throw new Exception("参数错误!");}for (int col = v2 + 1; col < city.size(); col++) {if (edges[v1][col] > 0) {return col;}}return -1;}//返回从c1到c2直达所花费的钱public int getMoney(City c1, City c2) throws Exception { int m = city.indexOf(c1);int n = city.indexOf(c2);if (m < 0 || n < 0) {throw new Exception("城市C1或C2错误!");} else {Iterator<Train> i = train.iterator();boolean flag = false;while (i.hasNext()) {temp = i.next();if (temp.getStartCity().equals(c1) && temp.getEndCity().equals(c2)) { flag = true;break;}}if (flag) {return temp.getMoney();} else {return maxMoney;}}}private boolean isCityInStack(City city) {//判断节点是否在栈中Iterator<City> it = stack.iterator();while (it.hasNext()) {City node1 = it.next();if (city.equals(node1)) {return true;}}return false;}// 存储一条通路private void savePath() {Stack<City> temp = new Stack();Iterator<City> i = stack.iterator();while (i.hasNext()) {City c = i.next();temp.add(c);}sers.add(temp); /*转储*/}// 查找从startCity到endCity的所有路径public void getPaths(City startCity, City endCity) throws Exception {stack.push(startCity);int n = getFirstNeighbor(startCity);if (n >= 0) {City c = city.get(n);getPaths(startCity, endCity, c, startCity);while (c != null) {n = getNextNeighbor(startCity, c);if (n > 0) {c = city.get(n);getPaths(startCity, endCity, c, startCity);} else {c = null;}}}}// 用递归的方法求startCity到endCity的路径currentCity是当前的城市,perCity是currentCity的上一个城市private boolean getPaths(City startCity, City endCity, City currentCity, City perCity) throws Exception {City nCity = null;if (currentCity != null && perCity != null && currentCity.equals(perCity)) { return false;}if (currentCity != null) {stack.push(currentCity);if (currentCity.equals(endCity)) {savePath();stack.pop();return true;} else {int n = getFirstNeighbor(currentCity);if (n >= 0) {nCity = city.get(n);} else {nCity = null;}while (nCity != null) {if (perCity != null && (nCity.equals(startCity) || perCity.equals(nCity) || isCityInStack(nCity))) {n = getNextNeighbor(currentCity, nCity);if (n >= 0) {nCity = city.get(n);} else {nCity = null;}continue;}if (getPaths(startCity, endCity, nCity, currentCity)) {if (!stack.isEmpty()) {stack.pop();}}n = getNextNeighbor(currentCity, nCity);if (n >= 0) {nCity = city.get(n);} else {nCity = null;}}if (!stack.isEmpty()) {stack.pop();}return false;}} else {return false;}}}-----AdmFrame-------/** 管理员登陆界面* 用户名为:Adm* 口令为:123456*/package com.desgin;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class AdmFrame {ImageIcon img = new ImageIcon("config/Adm.gif");JLabel background = new JLabel(img);JFrame admFrame = new JFrame();JLabel user = new JLabel("用户名:");JTextField userInput = new JTextField(20);JLabel passWord = new JLabel("口令:");JPasswordField passWordIn = new JPasswordField(20);JPanel panel = new JPanel();JButton login = new JButton("登陆");JButton exit = new JButton("退出");public AdmFrame() {admFrame.setLayout(null);admFrame.setTitle("Administrator");admFrame.setSize(img.getIconWidth(), img.getIconHeight() + 20);admFrame.setLocationRelativeTo(null);admFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);panel.setLayout(new GridLayout(2, 2, 20, 20));panel.add(user);user.setHorizontalAlignment(JTextField.RIGHT);passWord.setHorizontalAlignment(JTextField.RIGHT);panel.add(userInput);panel.add(passWord);panel.add(passWordIn);panel.setBounds(40, 50, 250, 60);JPanel tempPanel = new JPanel();tempPanel.add(login);tempPanel.add(exit);tempPanel.setBounds(130, 130, 200, 40);admFrame.add(panel);admFrame.add(tempPanel);admFrame.add(background);background.setBounds(0, 0, img.getIconWidth(), img.getIconHeight());admFrame.setVisible(true);admFrame.setResizable(false);exit.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.exit(0);}});login.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if (userInput.getText().trim().equals("") || passWordIn.getText().trim().equals("")) {JOptionPane.showMessageDialog(null, "请输入用户名或口令!","Warning", JOptionPane.WARNING_MESSAGE);} else if (userInput.getText().equals("Adm") && passWordIn.getText().equals("123456")) {admFrame.dispose();AdmMainWindow amw = new AdmMainWindow();amw.setVisible(true);} else {JOptionPane.showMessageDialog(null, "用户名或口令错误,请重新输入!","用户名或口令错误", JOptionPane.ERROR_MESSAGE);}}});}public static void main(String[] args) {AdmFrame af = new AdmFrame();}}-----AdmMFListener-------/** 管理员登陆后的界面监听器* 对添加、修改、删除作出相应的变化*/package com.desgin;import com.consel.*;import com.consel.TrainContral;import java.awt.event.*;import java.util.*;import javax.swing.JOptionPane;public class AdmMFListener extends MouseAdapter {AdmMainWindow amw;public AdmMFListener(AdmMainWindow amw) {this.amw = amw;}/** 鼠标点击事件监听*/@Overridepublic void mouseClicked(MouseEvent e) {if (e.getSource() == amw.add) {ChangeDialog cd = new ChangeDialog(amw, "添加", true);cd.setVisible(true);}if (e.getSource() == amw.change) {int selectedRow = amw.table.getSelectedRow();if (selectedRow > -1) {ChangeDialog cd = new ChangeDialog(amw, "添加", true,(String) amw.table.getValueAt(selectedRow, 0));cd.setVisible(true);} else {JOptionPane.showMessageDialog(null, "请选中要修改对象","Warnnig", JOptionPane.WARNING_MESSAGE);}}if (e.getSource() == amw.exit) {amw.dispose();}if (e.getSource() == amw.delete) {int selectedRow = amw.table.getSelectedRow();if (selectedRow > -1) {TrainContral tc = new TrainContral();tc.trainRead();Iterator<Train> i = tc.train.iterator();while (i.hasNext()) {Train temp = i.next();if (temp.getTrainID().equals(amw.table.getValueAt(selectedRow, 0))) {i.remove();tc.trainWrite(tc.train);break;}}amw.table.setModel(new AdmTable());} else {JOptionPane.showMessageDialog(null, "请选中要删除对象","Warnnig", JOptionPane.WARNING_MESSAGE);}}}}------AdmMainWindow-------/*** 管理员管理列车信息的主界面* 显示所有列车的相关信息*/package com.desgin;import javax.swing.*;public class AdmMainWindow extends JFrame {JTable table;JScrollPane jsp;AdmTable model = new AdmTable();JButton change = new JButton("修改");JButton add = new JButton("添加");JButton delete = new JButton("删除");JButton exit = new JButton("退出");AdmMFListener amfl;public AdmMainWindow() {this.setTitle("Administrator");this.setSize(400, 300);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);amfl = new AdmMFListener(this);table = new JTable(model);jsp = new JScrollPane(table);JPanel panel = new JPanel();panel.add(add);add.addMouseListener(amfl);panel.add(change);change.addMouseListener(amfl);panel.add(delete);delete.addMouseListener(amfl);panel.add(exit);exit.addMouseListener(amfl);this.add(jsp, "Center");this.add(new JLabel(" "), "North");this.add(panel, "South");}}-----AdmTable------/** Table的一个模式* 从文件中读取列车的信息,添加到table中* 显示在主界面中*/package com.desgin;import com.consel.*;import java.text.SimpleDateFormat;import java.util.*;import javax.swing.table.*;public class AdmTable extends AbstractTableModel {TrainContral tc = new TrainContral();Vector rowData, columnNames;List<Train> train;SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");public AdmTable() {tc.trainRead();train = tc.train;init(train);}private void init(List<Train> train) {columnNames = new Vector();columnNames.add("列车号");columnNames.add("出发地");columnNames.add("到达地");columnNames.add("发车时间");columnNames.add("到站时间");columnNames.add("票价");rowData = new Vector();boolean flag = true;Iterator i = train.iterator();while (i.hasNext()) {Train c = (Train) i.next();Vector hang = new Vector();hang.add(c.getTrainID());hang.add(c.getStartCity());hang.add(c.getEndCity());hang.add(formatter.format(c.getStartDate()));hang.add(formatter.format(c.getEndDate()));hang.add(c.getMoney() + "元");rowData.add(hang);}}// 返回行数public int getRowCount() {return this.rowData.size();}//返回列数public int getColumnCount() {return this.columnNames.size();}//返回rowIndex,column处的值public Object getValueAt(int rowIndex, int column) { return ((Vector) this.rowData.get(rowIndex)).get(column); }//返回表头@Overridepublic String getColumnName(int arg0) {return (String) this.columnNames.get(arg0);}}----ChangeDialog-----/** 管理员修改或者添加航线的信息的UI界面*/package com.desgin;import com.consel.*;import java.awt.*;import java.awt.event.*;import java.util.*;import java.util.Iterator;import javax.swing.*;public class ChangeDialog extends JDialog implements ActionListener {JTextField t1 = new JTextField(15);JTextField t2 = new JTextField(15);JTextField t3 = new JTextField(15);JTextField t41 = new JTextField(5);JTextField t42 = new JTextField(5);JTextField t51 = new JTextField(5);JTextField t52 = new JTextField(5);JTextField t6 = new JTextField(15);AdmMainWindow amw;JButton save = new JButton("保存");JButton exit = new JButton("取消");//添加时的构造方法public ChangeDialog(AdmMainWindow amw, String s, boolean b) { super(amw, s, b);this.amw = amw;this.setSize(300, 275);this.setResizable(false);JPanel p1 = new JPanel();p1.setLayout(new GridLayout(7, 1, 8, 8));p1.add(new JLabel("列车号: ", SwingConstants.CENTER));p1.add(t1);p1.add(new JLabel("出发地: ", SwingConstants.CENTER));p1.add(t2);p1.add(new JLabel("到达地: ", SwingConstants.CENTER));p1.add(t3);p1.add(new JLabel("发车时间: ", SwingConstants.CENTER));JPanel panel1 = new JPanel();panel1.add(t41);panel1.add(new JLabel(":"));panel1.add(t42);p1.add(panel1);p1.add(new JLabel("到站时间: ", SwingConstants.CENTER));JPanel panel2 = new JPanel();panel2.add(t51);panel2.add(new JLabel(":"));panel2.add(t52);p1.add(panel2);p1.add(new JLabel("票价: ", SwingConstants.CENTER));p1.add(t6);p1.add(new JLabel("", SwingConstants.CENTER));JPanel pane2 = new JPanel();pane2.add(save);pane2.add(exit);p1.add(pane2);this.add(p1);save.addActionListener(this);exit.addActionListener(this);}//修改时的构造方法public ChangeDialog(AdmMainWindow amw, String s, boolean b, String x) { super(amw, s, b);this.amw = amw;this.setSize(300, 275);this.setResizable(false);JPanel p1 = new JPanel();p1.setLayout(new GridLayout(7, 1, 8, 8));TrainContral tc = new TrainContral();tc.trainRead();Iterator<Train> i = tc.train.iterator();Train temp = null;while (i.hasNext()) {temp = i.next();if (temp.getTrainID().equals(x)) {break;}}p1.add(new JLabel("列车号: ", SwingConstants.CENTER)); p1.add(t1);p1.add(new JLabel("出发地: ", SwingConstants.CENTER)); p1.add(t2);p1.add(new JLabel("到达地: ", SwingConstants.CENTER)); p1.add(t3);p1.add(new JLabel("发车时间: ", SwingConstants.CENTER)); JPanel panel1 = new JPanel();panel1.add(t41);panel1.add(new JLabel(":"));panel1.add(t42);p1.add(panel1);p1.add(new JLabel("到站时间: ", SwingConstants.CENTER)); JPanel panel2 = new JPanel();panel2.add(t51);panel2.add(new JLabel(":"));panel2.add(t52);p1.add(panel2);p1.add(new JLabel("票价: ", SwingConstants.CENTER));p1.add(t6);p1.add(new JLabel("", SwingConstants.CENTER));JPanel pane2 = new JPanel();pane2.add(save);pane2.add(exit);p1.add(pane2);this.add(p1);save.addActionListener(this);exit.addActionListener(this);t1.setText(temp.getTrainID());t2.setText(temp.getStartCity().toString());t3.setText(temp.getEndCity().toString());t41.setText(temp.getStartDate().getHours() + "");t42.setText(temp.getStartDate().getMinutes() + "");t51.setText(temp.getEndDate().getHours() + "");t52.setText(temp.getEndDate().getMinutes() + "");t6.setText(temp.getMoney() + "");}//监听器,对保存、退出按钮进行监听public void actionPerformed(ActionEvent e) {if (e.getSource() == exit) {this.dispose();}if (e.getSource() == save) {TrainContral tc = new TrainContral();tc.trainRead();Date d1 = new Date();d1.setHours(Integer.parseInt(t41.getText().trim()));d1.setHours(Integer.parseInt(t42.getText().trim()));Date d2 = new Date();d2.setHours(Integer.parseInt(t51.getText().trim()));d2.setHours(Integer.parseInt(t52.getText().trim()));Train t = new Train(t1.getText().trim(),new City(t2.getText().trim()),new City(t3.getText().trim()),d1,d2,Integer.parseInt(t6.getText().trim()));Iterator<Train> i = tc.train.iterator();while(i.hasNext()){Train temp = i.next();if(t.getStartCity().equals(temp.getStartCity()) && t.getEndCity().equals(temp.getEndCity())){i.remove();}}tc.train.add(t);tc.trainWrite(tc.train);this.dispose();amw.table.setModel(new AdmTable());}}}-----MainWindow----/** 用户界面测试*/package com.desgin;public class MainWindow {UserFrame uf = new UserFrame();public static void main(String[] args) {MainWindow m = new MainWindow();m.uf.jf.setVisible(true);}}-----MoreDialog-------/** 显示详细信息*/package com.desgin;import com.consel.*;import java.awt.Color;import java.awt.event.*;import java.text.SimpleDateFormat;import java.util.*;import javax.swing.*;public class MoreDialog extends JDialog {SearchInFrame sif;JButton back = new JButton("返回");TrainGraph tg = new TrainGraph();JTable table;Vector colName = new Vector();Vector rowData = new Vector();SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");JButton exit = new JButton("退出");public MoreDialog(SearchInFrame sif, String string, boolean b) { super(sif.mainFrame, string, b);this.sif = sif;this.setSize(300, 275);this.setLocationRelativeTo(null);//设置窗口居中int rowCount = sif.infTable.getSelectedRow();String str = (String) sif.infTable.getValueAt(rowCount, 1);colName.add("列车号");colName.add("起始站");colName.add("终点站");colName.add("发车时间");colName.add("到站时间");colName.add("票价");try {TrainGraph tg = new TrainGraph();tg.getPaths(new City(sif.start), new City(sif.end));Iterator<Stack> iter = tg.sers.iterator();Stack<City> temp = new Stack();while (iter.hasNext()) {if (!temp.isEmpty()) {temp.removeAllElements();}Stack stack = iter.next();Vector hang = new Vector();String s = "";while (!stack.isEmpty()) {City c = (City) stack.pop();if (!(c.getCityName().equals(sif.start) || c.getCityName().equals(sif.end))) {s = c.getCityName() + " " + s;}temp.push(c);}if (s.equals("")) {s += "无";}if (s.equals(str)) {break;}}City eCity = null;City sCity = null;if (!temp.isEmpty()) {sCity = temp.pop();}while (!temp.isEmpty()) {eCity = temp.pop();Iterator<Train> i = tg.train.iterator();while (i.hasNext()) {Train t = i.next();if (t.getStartCity().equals(sCity) && t.getEndCity().equals(eCity)) {Vector hang = new Vector();hang.add(t.getTrainID());hang.add(t.getStartCity());hang.add(t.getEndCity());hang.add(formatter.format(t.getStartDate()));hang.add(formatter.format(t.getEndDate()));hang.add(t.getMoney() + "元");rowData.add(hang);}}sCity = eCity;}} catch (Exception ex) {ex.printStackTrace();}table = new JTable(rowData, colName);JScrollPane jsp = new JScrollPane(table);this.add(jsp);exit.setBackground(Color.lightGray);exit.setBounds(0, 0, 10, 10);exit.addMouseListener(new MouseAdapter() {@Overridepublic void mousePressed(MouseEvent e) {System.exit(0);}});this.add(exit, "South");table.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {int selectedRow = table.getSelectedRow();if (selectedRow > 0) {table.setSelectionForeground(Color.RED);}}});}}------MyMonitor-----/** 用户界面的监听器* 查询、退出的相关操作*/package com.desgin;import java.awt.event.*;import javax.swing.JOptionPane;public class MyMonitor extends MouseAdapter {UserFrame uf;public MyMonitor(UserFrame uf) {super();this.uf = uf;}@Overridepublic void mousePressed(MouseEvent e) {if (e.getSource() == uf.exit) {System.exit(0);}if (e.getSource() == uf.search) {if (uf.start.getText().trim().equals("") || uf.end.getText().trim().equals("")) { JOptionPane.showMessageDialog(null, "请正确输入起始站和终点站!","Warnnig", JOptionPane.WARNING_MESSAGE);} else {uf.sif = new SearchInFrame(uf.start.getText().trim(),uf.end.getText().trim());uf.sif.mainFrame.setVisible(true);uf.jf.dispose();}}}}----MyTable-----/** 用户界面显示在table中的列车信息的模板*/package com.desgin;import com.consel.*;import java.util.*;import javax.swing.table.*;public class MyTable extends AbstractTableModel {TrainContral tc = new TrainContral();Vector rowData, columnNames;String startCity, endCity;SearchInFrame sf;int n;List<Train> train;//构造方法public MyTable(String startCity, String endCity, SearchInFrame sf, int n) { this.sf = sf;this.startCity = startCity;this.endCity = endCity;tc.trainRead();train = tc.train;this.n = n;init(train);}public void init(List<Train> train) {columnNames = new Vector();columnNames.add("出发地");columnNames.add("中转站");columnNames.add("到达地");。
(完整word版)数据结构课程设计_____全国交通咨询系统
数据结构课程设计设计题目:全国交通网络咨询系统陈敏 指导教师:太原 学院级: 计算机科学与技术 号: 132054103 名:刘海静四、五、六、七、八、课程设计题目需求分析测试数据概要设计调用关系图程序代码测试结果心得体会及总结目录1414全国交通网络咨询系统、课程设计题目数据结构课程设计二、需求分析1、实现功能对城市信息(城市名、城市间的里程)进行编辑:具备添加、修改、删除功能; 对城市间的交通工具:火车。
对列车时刻表进行编辑:里程、和列车班次的添加、修改、删除;提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具,可以不考虑回程;咨询以用户和计算机对话方式进行,要注意人机交互的屏幕界面。
由用户选择最优决策 原则和交通工具,输入起始站、终点站、出发时间,输出信息:最快需要多长时间才能到达 及旅费,或者最少需要多少旅费才能到达及时间, 并详细说明依次于何时何地乘坐哪一趟列 车何时到达何地。
2、设计思路(1)数据存储。
城市信息(城市名、代码)、交通信息(城市间的里程、各航班和列车时刻 ) 存储于磁盘文件。
在实验中本想用文本储存数据, 但操作不熟悉,而是改用图的邻接矩阵 储 存原始信息,而后用数组进行添加删改(2)数据的逻辑结构。
根据设计任务的描述,其城市之间的旅游交通问题是典型的 图结构, 可看作为无向图,图的顶点是城市, 边是城市之间所耗费的时间(要包括中转站的时间)或 旅费。
(3)数据的存储结构。
采用邻接表和邻接矩阵都可作为数据的存储结构, 矩阵作为数据的存储结构。
这里建议采用邻接 删除功能可用菜单方 但要注意人机界面, (4)用不同的功能模块对城市信息和交通信息进行 编辑。
添加、修改、 式或命令提示方式。
只要能方便的对城市信息和交通信息进行管理即可, 具体实现由学生自行设计, 也可参考有关程序(届时在网上提供)。
这些工作有不小的工作量。
(5)最优决策功能模块①读入城市信息和交通信息,用邻接表生成含权网络,表头数组中的元素存放城市名及对 方城市到达该元素所代表城市的所有信息; 所代表的城市有交通联系的城市(代码、 表头数组中的元素所对应的单链表存放与该元素 里程、列车车次)。
全国交通咨询模拟 数据结构 源代码
全国交通咨询模拟数据结构源代码在进行全国交通咨询模拟的开发过程中,合理的数据结构设计是至关重要的。
本文将详细介绍一个基于数据结构的全国交通咨询模拟的源代码。
1. 数据结构设计在进行全国交通咨询模拟时,我们需要考虑以下几个关键的数据结构:1.1 城市节点城市节点是全国交通咨询模拟的基本组成单元。
每个城市节点包含以下信息:- 城市名称:用字符串表示城市的名称。
- 城市编号:用整数表示城市的唯一编号。
- 邻接城市:用链表或数组表示与当前城市直接相连的邻接城市。
- 交通方式:用枚举类型表示与邻接城市之间的交通方式,如公路、铁路、航空等。
1.2 邻接链表邻接链表是用于存储城市节点之间连接关系的数据结构。
每个城市节点都有一个邻接链表,用于存储与该城市直接相连的邻接城市。
1.3 城市图城市图是全国交通咨询模拟的核心数据结构,由所有城市节点和它们之间的连接关系组成。
城市图可以用邻接链表的数组来表示,数组的索引对应城市编号,数组的每个元素对应一个城市节点。
2. 源代码实现下面是一个简化版的全国交通咨询模拟的源代码示例:```c++#include <iostream>#include <string>#include <vector>// 定义交通方式的枚举类型enum class Transportation {Highway,Railway,Aviation};// 城市节点的定义struct CityNode {std::string name;int id;std::vector<CityNode*> adjacentCities;std::vector<Transportation> transportationModes;};// 城市图的定义class CityGraph {public:CityGraph(int numCities) {cities.resize(numCities);}void addCity(int id, const std::string& name) {CityNode* city = new CityNode;city->id = id;city->name = name;cities[id] = city;}void addConnection(int city1Id, int city2Id, Transportation mode) {CityNode* city1 = cities[city1Id];CityNode* city2 = cities[city2Id];city1->adjacentCities.push_back(city2);city2->adjacentCities.push_back(city1);city1->transportationModes.push_back(mode);city2->transportationModes.push_back(mode);}void printCityConnections(int cityId) {CityNode* city = cities[cityId];std::cout << "Connections for city " << city->name << " (ID: " << city->id << "):" << std::endl;for (int i = 0; i < city->adjacentCities.size(); i++) {CityNode* adjacentCity = city->adjacentCities[i];Transportation mode = city->transportationModes[i];std::cout << "- " << adjacentCity->name << " (ID: " << adjacentCity->id << "), Transportation: ";switch (mode) {case Transportation::Highway:std::cout << "Highway";break;case Transportation::Railway:std::cout << "Railway";break;case Transportation::Aviation:std::cout << "Aviation";break;}std::cout << std::endl;}}private:std::vector<CityNode*> cities;};int main() {// 创建城市图CityGraph graph(5);// 添加城市节点graph.addCity(0, "City A");graph.addCity(1, "City B");graph.addCity(2, "City C");graph.addCity(3, "City D");graph.addCity(4, "City E");// 添加城市连接关系graph.addConnection(0, 1, Transportation::Highway); graph.addConnection(0, 2, Transportation::Railway); graph.addConnection(1, 3, Transportation::Aviation); graph.addConnection(2, 4, Transportation::Highway); // 打印城市连接关系graph.printCityConnections(0);return 0;}```3. 示例说明上述源代码示例实现了一个简化的全国交通咨询模拟。
全国交通咨询模拟系统源代码
12050741班(郭晓湛,李佳豪,廖川,杨鹤)课题:全国交通系统咨询模拟源程序代码:#include <windows.h>#include <stdio.h>#include <string.h>#include <vector>#include<iostream>#include <malloc.h>#define INF 65535 //定义一个最大数定为无穷值#define MAX 23using namespace std;static int c_number=10;static int k=0;static int v=0,z=0,r=0,t=0;typedef struct search{int c_transer;int c_cost;int c_time;int f_cost;int f_time;}search;search m[20],x[20],n[20];typedef int costAdj[MAX+1][MAX+1];//图邻接矩阵从1开始记数int Path[MAX+1][MAX+1];//图邻接矩阵从1开始记数typedef struct unDiGraph{int numVerts; //结点costAdj cost; //邻接矩阵}unDiGraph,*UNG; //图的定义typedef struct c_edit{char a[10];}c_edit;c_edit add[10];costAdj B,L;//定位函数,输出城市列表,增添城市。
int pr(int i,int j){int h=0;if (j==0){h=i;}else if (j==1){cin>>add[i].a;}switch(h)//运用switch语句。
{case(0):cout<<"";break;case(1) : cout<<"成都 ";break; case(2) : cout<<"西安 ";break; case(3) : cout<<"郑州 ";break; case(4) : cout<<"武汉 ";break; case(5) : cout<<"株洲 ";break;case(6) : cout<<"贵阳 ";break;case(7) : cout<<"柳州 ";break;case(8) : cout<<"广州 ";break;case(9) : cout<<"南宁 ";break;case(10) : cout<<"徐州 ";break;default:cout<<add[i-10].a;}return 1;}//输出城市列表及相应代码void pri(){int i;cout<<" 城市及其代码"<<endl<<endl<<endl;cout<<"****************************"<<endl; for (i=1;i<=c_number;i++){cout<<i<<".";pr(i,0);}cout<<endl<<"***********************"<<endl<<endl<<endl< <endl<<endl<<endl;}//构造带权(费用)图返回首地址G:unDiGraph *CreateCostG(int o)//火车的花费的存贮和编辑功能{unDiGraph *G;int i,j;int a=0,b=0,f,h=1;if(!(G=(unDiGraph *)malloc(sizeof(unDiGraph)))) //为G 分配存储空间。
全国交通咨询模拟 数据结构 源代码
全国交通咨询摹拟数据结构源代码在全国范围内建立一个交通咨询摹拟系统,可以为用户提供交通信息查询和路线规划的功能。
为了实现这个系统,我们需要设计和实现合适的数据结构,并编写相应的源代码。
首先,我们需要考虑的是如何表示交通网络。
一个简单而有效的方法是使用图来表示道路和交通节点。
我们可以使用邻接矩阵或者邻接表来表示图。
在这个摹拟系统中,每一个城市可以看做是一个节点,每条道路可以看做是两个节点之间的边。
邻接矩阵可以用一个二维数组来表示,其中数组的每一个元素表示两个节点之间的距离或者道路的权重。
邻接表则使用链表来表示每一个节点的邻接节点。
接下来,我们需要考虑如何实现交通信息查询功能。
用户可以输入起始城市和目的城市,系统需要返回最短路径或者最快路径。
为了实现这个功能,我们可以使用Dijkstra算法或者A*算法。
Dijkstra算法可以找到两个节点之间的最短路径,而A*算法则可以找到两个节点之间的最快路径。
这些算法需要在图的基础上进行计算,并使用合适的数据结构来存储节点和路径信息。
除了交通信息查询,用户还可以查询特定城市的交通拥堵情况。
为了实现这个功能,我们可以为每一个城市维护一个拥堵指数。
拥堵指数可以表示道路的通行能力或者交通流量。
当用户查询某个城市的交通拥堵情况时,系统可以返回该城市的拥堵指数,并根据指数的高低提供相应的建议。
在实现这个交通咨询摹拟系统时,我们还需要考虑数据的存储和更新。
可以使用数据库来存储城市、道路和拥堵指数等信息。
数据库可以提供高效的数据查询和更新功能,并且可以方便地与系统的源代码进行交互。
以下是一个简单的伪代码示例,展示了如何使用数据结构和算法实现交通咨询摹拟系统:```class City:def __init__(self, name): = nameself.adjacent_cities = []self.congestion_index = 0def add_adjacent_city(self, city, distance):self.adjacent_cities.append((city, distance))def update_congestion_index(self, index):self.congestion_index = indexclass TrafficConsultation:def __init__(self):self.cities = {}def add_city(self, name):city = City(name)self.cities[name] = citydef add_road(self, city1, city2, distance):self.cities[city1].add_adjacent_city(self.cities[city2], distance) self.cities[city2].add_adjacent_city(self.cities[city1], distance) def update_congestion_index(self, city, index):self.cities[city].update_congestion_index(index)def shortest_path(self, start_city, end_city):# 使用Dijkstra算法计算最短路径# 返回最短路径和距离def fastest_path(self, start_city, end_city):# 使用A*算法计算最快路径# 返回最快路径和时间def get_congestion_index(self, city):# 返回城市的拥堵指数# 创建交通咨询摹拟系统实例consultation = TrafficConsultation()# 添加城市consultation.add_city("北京")consultation.add_city("上海")consultation.add_city("广州")# 添加道路consultation.add_road("北京", "上海", 1000) consultation.add_road("北京", "广州", 1500) consultation.add_road("上海", "广州", 1200)# 更新拥堵指数consultation.update_congestion_index("北京", 80) consultation.update_congestion_index("上海", 70)consultation.update_congestion_index("广州", 90)# 查询最短路径和最快路径shortest_path, distance = consultation.shortest_path("北京", "广州")fastest_path, time = consultation.fastest_path("北京", "广州")# 查询拥堵指数congestion_index = consultation.get_congestion_index("北京")```以上是一个简单的交通咨询摹拟系统的设计和实现示例。
数据结构课程设计:交通资讯系统
目录一、实验目的: (2)二、实验要求: (2)三、总体设计: (2)四、详细设计: (3)五、程序代码: (4)六、测试 (16)七、总结: (22)参考文献 (22)交通咨询系统一、实验目的:1、充分了解并掌握最短路径问题及其应用。
学习迪杰斯特拉算法和弗洛伊德算法。
2、根据有向图的存储结构解决实际问题。
3、了解程序模块化的过程。
4、给用户提供路径咨询。
实现了帮助用户了解全国各大城市间往来的最短路径问题。
5、可以提供用户查询各大城市的相关信息。
二、实验要求:设计一个交通咨询系统,能让旅客在任一个城市顶点到另一个城市顶点之间的最短路径(里程)或最低花费或最少时间等问题。
(城市名称用数字代替)。
本程序可以在TC2.0和VC6.0中运行。
三、总体设计:本程序页面清晰,功能明确,主要分为两个部分,即交通查询部分和管理员管理部分。
交通查询部分又分为城市信息、城市路径、最短路径查询3个模块,而其中最短路径查询系统又分为2个城市之间的最短路径和1个城市到其它各城市之间路径的查询。
而管理员管理的部分则包括交通查询里面的功能以及添加城市、添加城市间的路径、删除城市以及删除两个城市之间的路径等部分。
四、详细设计:详细设计全国交通信息咨询系统的存储结构:struct city_info /*城市信息结构*/{ char name[20];char info[100];}cities[SIZE_city];struct way_info /*路径信息结构*/{ int start_id;int end_id;int dist;}ways[SIZE_way];struct path_info /*路径查询结构*/{ int count;int path[SIZE_city];};typedef struct Graph{ char vexs[SIZE_city];/*顶点*/ int arcs[SIZE_city][SIZE_c ity];/*邻接矩阵*/ int vexnum;/*顶点数*/ int arcnum; /*弧数*/ }Graph;划分本程序采用自顶向下的编程模式,分为7个主模块,即考虑到7种算法的实现:1、显示全国各地城市相关信息的算法;void ShowCity();初始条件:void ReadCitiesFile();void ReadW aysFile();读取数据成功,操作结果:根据用户查询城市的名字,输出城市的特色;2、添加城市及城市相关信息的算法;void AddView();初始条件:构造了结构体数组views[VIEW_SIZE];操作结果:添加一个城市顶点到views数组中,并将数据输出到VIE WS文件中保存。
全国交通咨询系统设计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;。
全国交通咨询系统设计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;。
全国交通咨询系统设计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;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
附录数据结构课程设计------全国交通咨询模拟程序源代码#include<iostream>#include<iomanip>#include<stdlib.h>#include<sstream>using namespace std;#define INFINITY 100000//以该值表示两个城市之间无法到达#define MAX_VERTEX_NUM 30//最多可定义30个城市#define MAX 15//到某个城市最多的火车量typedef struct ArcCell//定义两城市之间路的结构{float adj;//存放该路的长度string info;//存放和该路有关的其他信息}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct train{//定义火车的结构体string start;//始发站string end;//终点站string number;//车次string type;//车型string statime;//发车时间string arrivetime;//到站时间string alltime;//全程时间float price;//车票价钱}train,Train[MAX];typedef struct{//定义一个飞机的结构体string start;//始发站string end;//终点站string number;//航班string statime;//起飞时间string arrivetime;//到达时间string alltime;//全程时间float price;//机票价钱}plane,Plane[MAX];typedef struct{//定义一个城市的结构体string name;//城市名字Train train1;//从该城市出发到其他城市的火车情况Train train2;//从其它城市到该城市的火车情况Plane plane1;//从该城市出发到其他城市的飞机情况Plane plane2;//从其它城市到该城市的飞机情况}city,City[MAX_VERTEX_NUM];typedef struct{//定义交通图的结构City citys;//存放交通图中图城市AdjMatrix arcs;//一个邻接矩阵int vexnum;//城市的个数int arcnum;//城市之间路的条数}MGraph,*MGRAPH;typedef struct{//定义一个队列的结构体string vex[MAX_VERTEX_NUM];//存放在某个路径中经过的所有城市的信息int front;//队头的下标int rear;//队尾的下标}queue,*Queue;/*=========定位函数=====================*/int LocateVex(MGraph &G,string v){int i=0;string s;for(i=0;i<G.vexnum;++i){s=G.citys[i].name;if(s==v){return i;break;}}return -1;}//查找图中某个城市的下标是多少,不成功返回-1MGraph CreateUDN()//创建全国地区图的结构{MGraph G;int i=0,j=0,k=0,l=0,h=0;G.vexnum=25,G.arcnum=30;//25个地区,30条交通路G.citys[0].name="乌鲁木齐", G.citys[1].name="兰州", G.citys[2].name="西宁", G.citys[3].name="呼和浩特";G.citys[4].name="北京", G.citys[5].name="天津", G.citys[6].name="沈阳", G.citys[7].name="大连";G.citys[8].name="长春", G.citys[9].name="哈尔滨", G.citys[10].name="徐州", G.citys[11].name="郑州";G.citys[12].name="西安", G.citys[13].name="成都", G.citys[14].name="武汉", G.citys[15].name="上海";G.citys[16].name="昆明", G.citys[17].name="贵阳", G.citys[18].name="株洲", G.citys[19].name="南昌";G.citys[20].name="福州", G.citys[21].name="南宁", G.citys[22].name="柳州", G.citys[23].name="广州";G.citys[24].name="深圳";G.citys[0].train1[0].start="乌鲁木齐", G.citys[0].train1[0].end="兰州", G.citys[0].train1[0].number="K544", G.citys[0].train1[0].type="空调快速";G.citys[0].train1[0].statime="09:36", G.citys[0].train1[0].arrivetime="09:27", G.citys[0].train1[0].alltime="23:51", G.citys[0].train1[0].price=215;G.citys[0].train1[1].start="乌鲁木齐", G.citys[0].train1[1].end="兰州", G.citys[0].train1[1].number="T296", G.citys[0].train1[1].type="空调特快";G.citys[0].train1[1].statime="15:00", G.citys[0].train1[1].arrivetime="11:47", G.citys[0].train1[1].alltime="20:47", G.citys[0].train1[1].price=215;G.citys[1].train1[0].start="兰州", G.citys[1].train1[0].end="乌鲁木齐", G.citys[1].train1[0].number="L651", G.citys[1].train1[0].type="普快";G.citys[1].train1[0].statime="03:44", G.citys[1].train1[0].arrivetime="11:29", G.citys[1].train1[0].alltime="31:45", G.citys[1].train1[0].price=105;G.citys[1].train1[1].start="兰州", G.citys[1].train1[1].end="乌鲁木齐", G.citys[1].train1[1].number="T197", G.citys[1].train1[1].type="空调特快";G.citys[1].train1[1].statime="10:48", G.citys[1].train1[1].arrivetime="07:25", G.citys[1].train1[1].alltime="20:37", G.citys[1].train1[1].price=215;G.citys[1].train1[2].start="兰州", G.citys[1].train1[2].end="西宁", G.citys[1].train1[2].number="K915", G.citys[1].train1[2].type="快速";G.citys[1].train1[2].statime="07:19", G.citys[1].train1[2].arrivetime="10:36", G.citys[1].train1[2].alltime="03:17", G.citys[1].train1[2].price=22;G.citys[1].train1[3].start="兰州", G.citys[1].train1[3].end="西宁", G.citys[1].train1[3].number="T207", G.citys[1].train1[3].type="空调特快";G.citys[1].train1[3].statime="07:12", G.citys[1].train1[3].arrivetime="09:29", G.citys[1].train1[3].alltime="02:17", G.citys[1].train1[3].price=33;G.citys[1].train1[4].start="兰州", G.citys[1].train1[4].end="呼和浩特", G.citys[1].train1[4].number="2636", G.citys[1].train1[4].type="普快";G.citys[1].train1[4].statime="09:37", G.citys[1].train1[4].arrivetime="06:19", G.citys[1].train1[4].alltime="20:42", G.citys[1].train1[4].price=70;G.citys[1].train1[5].start="兰州", G.citys[1].train1[5].end="呼和浩特", G.citys[1].train1[5].number="K44", G.citys[1].train1[5].type="空调快速";G.citys[1].train1[5].statime="16:16", G.citys[1].train1[5].arrivetime="09:10", G.citys[1].train1[5].alltime="16:54", G.citys[1].train1[5].price=143;G.citys[1].train1[6].start="兰州", G.citys[1].train1[6].end="西安", G.citys[1].train1[6].number="1210", G.citys[1].train1[6].type="普快";G.citys[1].train1[6].statime="00:11", G.citys[1].train1[6].arrivetime="10:15", G.citys[1].train1[6].alltime="10:04", G.citys[1].train1[6].price=46;G.citys[1].train1[7].start="兰州", G.citys[1].train1[7].end="西安", G.citys[1].train1[7].number="K592", G.citys[1].train1[7].type="空调快速";G.citys[1].train1[7].statime="00:20", G.citys[1].train1[7].arrivetime="09:15", G.citys[1].train1[7].alltime="08:55", G.citys[1].train1[7].price=94;G.citys[2].train1[0].start="西宁", G.citys[2].train1[0].end="兰州", G.citys[2].train1[0].number="1050",G.citys[2].train1[0].statime="09:24", G.citys[2].train1[0].arrivetime="12:47", G.citys[2].train1[0].alltime="03:23", G.citys[2].train1[0].price=17;G.citys[2].train1[1].start="西宁", G.citys[2].train1[1].end="兰州", G.citys[2].train1[1].number="T28", G.citys[2].train1[1].type="空调特快";G.citys[2].train1[1].statime="10:14", G.citys[2].train1[1].arrivetime="12:34", G.citys[2].train1[1].alltime="02:20", G.citys[2].train1[1].price=33;G.citys[3].train1[0].start="呼和浩特", G.citys[3].train1[0].end="兰州", G.citys[3].train1[0].number="2635", G.citys[3].train1[0].type="普快";G.citys[3].train1[0].statime="12:55", G.citys[3].train1[0].arrivetime="07:56", G.citys[3].train1[0].alltime="19:01", G.citys[3].train1[0].price=70;G.citys[3].train1[1].start="呼和浩特", G.citys[3].train1[1].end="兰州", G.citys[3].train1[1].number="K43", G.citys[3].train1[1].type="空调快速";G.citys[3].train1[1].statime="22:38", G.citys[3].train1[1].arrivetime="15:14", G.citys[3].train1[1].alltime="16:36", G.citys[3].train1[1].price=143;G.citys[3].train1[2].start="呼和浩特", G.citys[3].train1[2].end="北京", G.citys[3].train1[2].number="K178", G.citys[3].train1[2].type="空调快速";G.citys[3].train1[2].statime="01:30", G.citys[3].train1[2].arrivetime="11:48", G.citys[3].train1[2].alltime="10:18", G.citys[3].train1[2].price=92;G.citys[3].train1[3].start="呼和浩特", G.citys[3].train1[3].end="北京", G.citys[3].train1[3].number="1484", G.citys[3].train1[3].type="普快";G.citys[3].train1[3].statime="09:46", G.citys[3].train1[3].arrivetime="10:11", G.citys[3].train1[3].alltime="10:25", G.citys[3].train1[3].price=81;G.citys[4].train1[0].start="北京", G.citys[4].train1[0].end="呼和浩特", G.citys[4].train1[0].number="1711", G.citys[4].train1[0].type="空调普快";G.citys[4].train1[0].statime="02:23", G.citys[4].train1[0].arrivetime="13:28", G.citys[4].train1[0].alltime="11:05", G.citys[4].train1[0].price=81;G.citys[4].train1[1].start="北京", G.citys[4].train1[1].end="呼和浩特", G.citys[4].train1[1].number="T282", G.citys[4].train1[1].type="空调特快";G.citys[4].train1[1].statime="11:39", G.citys[4].train1[1].arrivetime="21:45", G.citys[4].train1[1].alltime="10:05", G.citys[4].train1[1].price=92;G.citys[4].train1[2].start="北京", G.citys[4].train1[2].end="天津", G.citys[4].train1[2].number="D51", G.citys[4].train1[2].type="动车组";G.citys[4].train1[2].statime="06:45", G.citys[4].train1[2].arrivetime="17:24", G.citys[4].train1[2].alltime="00:39", G.citys[4].train1[2].price=46;G.citys[4].train1[3].start="北京", G.citys[4].train1[3].end="天津", G.citys[4].train1[3].number="2064", G.citys[4].train1[3].type="普快";G.citys[4].train1[3].statime="04:32", G.citys[4].train1[3].arrivetime="06:12", G.citys[4].train1[3].alltime="01:40", G.citys[4].train1[3].price=11;G.citys[4].train1[4].start="北京", G.citys[4].train1[4].end="郑州", G.citys[4].train1[4].number="D133", G.citys[4].train1[4].type="动车组";G.citys[4].train1[4].statime="06:54", G.citys[4].train1[4].arrivetime="11:58", G.citys[4].train1[4].alltime="05:04",G.citys[4].train1[5].start="北京", G.citys[4].train1[5].end="郑州", G.citys[4].train1[5].number="1487", G.citys[4].train1[5].type="空调普快";G.citys[4].train1[5].statime="10:02", G.citys[4].train1[5].arrivetime="20:16", G.citys[4].train1[5].alltime="10:14", G.citys[4].train1[5].price=102;G.citys[5].train1[0].start="天津", G.citys[5].train1[0].end="北京", G.citys[5].train1[0].number="K108", G.citys[5].train1[0].type="空调快速";G.citys[5].train1[0].statime="03:16", G.citys[5].train1[0].arrivetime="05:01", G.citys[5].train1[0].alltime="01:45", G.citys[5].train1[0].price=24;G.citys[5].train1[1].start="天津", G.citys[5].train1[1].end="北京", G.citys[5].train1[1].number="C2002", G.citys[5].train1[1].type="城际高速";G.citys[5].train1[1].statime="06:25", G.citys[5].train1[1].arrivetime="06:55", G.citys[5].train1[1].alltime="00:30", G.citys[5].train1[1].price=58;G.citys[5].train1[2].start="天津", G.citys[5].train1[2].end="沈阳", G.citys[5].train1[2].number="K39", G.citys[5].train1[2].type="空调快速";G.citys[5].train1[2].statime="00:38", G.citys[5].train1[2].arrivetime="08:35", G.citys[5].train1[2].alltime="07:57", G.citys[5].train1[2].price=99;G.citys[5].train1[3].start="天津", G.citys[5].train1[3].end="沈阳", G.citys[5].train1[3].number="1056", G.citys[5].train1[3].type="空调普快";G.citys[5].train1[3].statime="02:44", G.citys[5].train1[3].arrivetime="11:01", G.citys[5].train1[3].alltime="08:17", G.citys[5].train1[3].price=83;G.citys[5].train1[4].start="天津", G.citys[5].train1[4].end="徐州", G.citys[5].train1[4].number="K55", G.citys[5].train1[4].type="空调快速";G.citys[5].train1[4].statime="01:08", G.citys[5].train1[4].arrivetime="16:46", G.citys[5].train1[4].alltime="08:08", G.citys[5].train1[4].price=94;G.citys[5].train1[5].start="天津", G.citys[5].train1[5].end="徐州", G.citys[5].train1[5].number="T33", G.citys[5].train1[5].type="空调特快";G.citys[5].train1[5].statime="16:10", G.citys[5].train1[5].arrivetime="09:16", G.citys[5].train1[5].alltime="07:16", G.citys[5].train1[5].price=94;G.citys[6].train1[0].start="沈阳", G.citys[6].train1[0].end="长春", G.citys[6].train1[0].number="2509", G.citys[6].train1[0].type="普快";G.citys[6].train1[0].statime="07:17", G.citys[6].train1[0].arrivetime="11:28", G.citys[6].train1[0].alltime="04:11", G.citys[6].train1[0].price=24;G.citys[6].train1[1].start="沈阳", G.citys[6].train1[1].end="长春", G.citys[6].train1[1].number="T271", G.citys[6].train1[1].type="空调特快";G.citys[6].train1[1].statime="01:38", G.citys[6].train1[1].arrivetime="04:26", G.citys[6].train1[1].alltime="02:48", G.citys[6].train1[1].price=44;G.citys[6].train1[2].start="沈阳", G.citys[6].train1[2].end="天津", G.citys[6].train1[2].number="K216", G.citys[6].train1[2].type="空调快速";G.citys[6].train1[2].statime="01:04", G.citys[6].train1[2].arrivetime="09:19", G.citys[6].train1[2].alltime="08:15", G.citys[6].train1[2].price=94;G.citys[6].train1[3].start="沈阳", G.citys[6].train1[3].end="天津", G.citys[6].train1[3].number="D176",G.citys[6].train1[3].type="动车组";G.citys[6].train1[3].statime="09:12", G.citys[6].train1[3].arrivetime="13:39", G.citys[6].train1[3].alltime="04:27", G.citys[6].train1[3].price=213;G.citys[6].train1[4].start="沈阳", G.citys[6].train1[4].end="大连", G.citys[6].train1[4].number="2052", G.citys[6].train1[4].type="空调普快";G.citys[6].train1[4].statime="00:12", G.citys[6].train1[4].arrivetime="05:23", G.citys[6].train1[4].alltime="05:11", G.citys[6].train1[4].price=49;G.citys[6].train1[5].start="沈阳", G.citys[6].train1[5].end="大连", G.citys[6].train1[5].number="T262", G.citys[6].train1[5].type="空调特快";G.citys[6].train1[5].statime="02:31", G.citys[6].train1[5].arrivetime="06:33", G.citys[6].train1[5].alltime="04:02", G.citys[6].train1[5].price=55;G.citys[7].train1[0].start="大连", G.citys[7].train1[0].end="沈阳", G.citys[7].train1[0].number="2623", G.citys[7].train1[0].type="空调普快";G.citys[7].train1[0].statime="09:30", G.citys[7].train1[0].arrivetime="14:27", G.citys[7].train1[0].alltime="04:57", G.citys[7].train1[0].price=55;G.citys[7].train1[1].start="大连", G.citys[7].train1[1].end="沈阳", G.citys[7].train1[1].number="T5305", G.citys[7].train1[1].type="空调特快";G.citys[7].train1[1].statime="13:00", G.citys[7].train1[1].arrivetime="16:46", G.citys[7].train1[1].alltime="03:46", G.citys[7].train1[1].price=55;G.citys[8].train1[0].start="长春", G.citys[8].train1[0].end="沈阳", G.citys[8].train1[0].number="T5302", G.citys[8].train1[0].type="空调特快";G.citys[8].train1[0].statime="06:12", G.citys[8].train1[0].arrivetime="09:17", G.citys[8].train1[0].alltime="03:05", G.citys[8].train1[0].price=47;G.citys[8].train1[1].start="长春", G.citys[8].train1[1].end="沈阳", G.citys[8].train1[1].number="D24", G.citys[8].train1[1].type="动车组";G.citys[8].train1[1].statime="07:13", G.citys[8].train1[1].arrivetime="09:20", G.citys[8].train1[1].alltime="02:07", G.citys[8].train1[1].price=93;G.citys[8].train1[2].start="长春", G.citys[8].train1[2].end="哈尔滨", G.citys[8].train1[2].number="K265", G.citys[8].train1[2].type="空调快速";G.citys[8].train1[2].statime="00:50", G.citys[8].train1[2].arrivetime="03:25", G.citys[8].train1[2].alltime="02:35", G.citys[8].train1[2].price=41;G.citys[8].train1[3].start="长春", G.citys[8].train1[3].end="哈尔滨", G.citys[8].train1[3].number="T236", G.citys[8].train1[3].type="空调特快";G.citys[8].train1[3].statime="05:25", G.citys[8].train1[3].arrivetime="07:40", G.citys[8].train1[3].alltime="02:15", G.citys[8].train1[3].price=41;G.citys[9].train1[0].start="哈尔滨", G.citys[9].train1[0].end="长春", G.citys[9].train1[0].number="2008", G.citys[9].train1[0].type="普快";G.citys[9].train1[0].statime="02:31", G.citys[9].train1[0].arrivetime="05:19", G.citys[9].train1[0].alltime="02:48", G.citys[9].train1[0].price=20;G.citys[9].train1[1].start="哈尔滨", G.citys[9].train1[1].end="长春", G.citys[9].train1[1].number="D178", G.citys[9].train1[1].type="动车组";G.citys[9].train1[1].statime="09:10", G.citys[9].train1[1].arrivetime="10:56", G.citys[9].train1[1].alltime="01:46", G.citys[9].train1[1].price=76;G.citys[10].train1[0].start="徐州", G.citys[10].train1[0].end="天津", G.citys[10].train1[0].number="1035", G.citys[10].train1[0].type="空调普快";G.citys[10].train1[0].statime="12:00", G.citys[10].train1[0].arrivetime="21:56", G.citys[10].train1[0].alltime="09:56", G.citys[10].train1[0].price=83;G.citys[10].train1[1].start="徐州", G.citys[10].train1[1].end="天津", G.citys[10].train1[1].number="D32", G.citys[10].train1[1].type="动车组";G.citys[10].train1[1].statime="15:09", G.citys[10].train1[1].arrivetime="19:51", G.citys[10].train1[1].alltime="04:42", G.citys[10].train1[1].price=206;G.citys[10].train1[2].start="徐州", G.citys[10].train1[2].end="郑州", G.citys[10].train1[2].number="K282", G.citys[10].train1[2].type="空调快速";G.citys[10].train1[2].statime="05:39", G.citys[10].train1[2].arrivetime="09:26", G.citys[10].train1[2].alltime="03:47", G.citys[10].train1[2].price=52;G.citys[10].train1[3].start="徐州", G.citys[10].train1[3].end="郑州", G.citys[10].train1[3].number="T52", G.citys[10].train1[3].type="空调特快";G.citys[10].train1[3].statime="03:07", G.citys[10].train1[3].arrivetime="06:36", G.citys[10].train1[3].alltime="03:29", G.citys[10].train1[3].price=52;G.citys[10].train1[4].start="徐州", G.citys[10].train1[4].end="上海", G.citys[10].train1[4].number="D5437", G.citys[10].train1[4].type="动车组";G.citys[10].train1[4].statime="13:02", G.citys[10].train1[4].arrivetime="17:59", G.citys[10].train1[4].alltime="04:57", G.citys[10].train1[4].price=201;G.citys[10].train1[5].start="徐州", G.citys[10].train1[5].end="上海", G.citys[10].train1[5].number="K8457", G.citys[10].train1[5].type="空调快速";G.citys[10].train1[5].statime="21:00", G.citys[10].train1[5].arrivetime="06:42", G.citys[10].train1[5].alltime="09:42", G.citys[10].train1[5].price=92;G.citys[11].train1[0].start="郑州", G.citys[11].train1[0].end="北京", G.citys[11].train1[0].number="T146", G.citys[11].train1[0].type="空调特快";G.citys[11].train1[0].statime="03:20", G.citys[11].train1[0].arrivetime="10:20", G.citys[11].train1[0].alltime="07:00", G.citys[11].train1[0].price=94;G.citys[11].train1[1].start="郑州", G.citys[11].train1[1].end="北京", G.citys[11].train1[1].number="T6", G.citys[11].train1[1].type="空调特快";G.citys[11].train1[1].statime="05:29", G.citys[11].train1[1].arrivetime="12:07", G.citys[11].train1[1].alltime="06:38", G.citys[11].train1[1].price=94;G.citys[11].train1[2].start="郑州", G.citys[11].train1[2].end="西安", G.citys[11].train1[2].number="1024", G.citys[11].train1[2].type="普快";G.citys[11].train1[2].statime="03:20", G.citys[11].train1[2].arrivetime="10:52", G.citys[11].train1[2].alltime="07:32", G.citys[11].train1[2].price=36;G.citys[11].train1[3].start="郑州", G.citys[11].train1[3].end="西安", G.citys[11].train1[3].number="T69", G.citys[11].train1[3].type="空调特快";G.citys[11].train1[3].statime="01:06", G.citys[11].train1[3].arrivetime="06:56", G.citys[11].train1[3].alltime="05:50", G.citys[11].train1[3].price=73;G.citys[11].train1[4].start="郑州", G.citys[11].train1[4].end="徐州", G.citys[11].train1[4].number="1551", G.citys[11].train1[4].type="普快";G.citys[11].train1[4].statime="06:24", G.citys[11].train1[4].arrivetime="10:40", G.citys[11].train1[4].alltime="04:16", G.citys[11].train1[4].price=26;G.citys[11].train1[5].start="郑州", G.citys[11].train1[5].end="徐州", G.citys[11].train1[5].number="D88", G.citys[11].train1[5].type="动车组";G.citys[11].train1[5].statime="08:23", G.citys[11].train1[5].arrivetime="10:30", G.citys[11].train1[5].alltime="02:07", G.citys[11].train1[5].price=108;G.citys[11].train1[6].start="郑州", G.citys[11].train1[6].end="武汉", G.citys[11].train1[6].number="D141", G.citys[11].train1[6].type="动车组";G.citys[11].train1[6].statime="06:49", G.citys[11].train1[6].arrivetime="10:49", G.citys[11].train1[6].alltime="03:56", G.citys[11].train1[6].price=160;G.citys[11].train1[7].start="郑州", G.citys[11].train1[7].end="武汉", G.citys[11].train1[7].number="T5", G.citys[11].train1[7].type="空调特快";G.citys[11].train1[7].statime="22:56", G.citys[11].train1[7].arrivetime="03:31", G.citys[11].train1[7].alltime="04:35", G.citys[11].train1[7].price=73;G.citys[12].train1[0].start="西安", G.citys[12].train1[0].end="兰州", G.citys[12].train1[0].number="T151", G.citys[12].train1[0].type="空调特快";G.citys[12].train1[0].statime="03:18", G.citys[12].train1[0].arrivetime="10:15", G.citys[12].train1[0].alltime="06:57", G.citys[12].train1[0].price=94;G.citys[12].train1[1].start="西安", G.citys[12].train1[1].end="兰州", G.citys[12].train1[1].number="1095", G.citys[12].train1[1].type="普快";G.citys[12].train1[1].statime="07:35", G.citys[12].train1[1].arrivetime="16:08", G.citys[12].train1[1].alltime="08:33", G.citys[12].train1[1].price=46;G.citys[12].train1[2].start="西安", G.citys[12].train1[2].end="郑州", G.citys[12].train1[2].number="K386", G.citys[12].train1[2].type="空调快速";G.citys[12].train1[2].statime="09:58", G.citys[12].train1[2].arrivetime="16:16", G.citys[12].train1[2].alltime="06:18", G.citys[12].train1[2].price=73;G.citys[12].train1[3].start="西安", G.citys[12].train1[3].end="郑州", G.citys[12].train1[3].number="T176", G.citys[12].train1[3].type="空调特快";G.citys[12].train1[3].statime="03:34", G.citys[12].train1[3].arrivetime="09:16", G.citys[12].train1[3].alltime="05:42", G.citys[12].train1[3].price=73;G.citys[12].train1[4].start="西安", G.citys[12].train1[4].end="成都", G.citys[12].train1[4].number="K5", G.citys[12].train1[4].type="空调快速";G.citys[12].train1[4].statime="13:20", G.citys[12].train1[4].arrivetime="05:25", G.citys[12].train1[4].alltime="16:05", G.citys[12].train1[4].price=113;G.citys[12].train1[5].start="西安", G.citys[12].train1[5].end="成都", G.citys[12].train1[5].number="T7", G.citys[12].train1[5].type="空调特快";G.citys[12].train1[5].statime="05:17", G.citys[12].train1[5].arrivetime="17:58", G.citys[12].train1[5].alltime="12:41", G.citys[12].train1[5].price=113;G.citys[13].train1[0].start="成都", G.citys[13].train1[0].end="西安", G.citys[13].train1[0].number="K678", G.citys[13].train1[0].type="空调快速";G.citys[13].train1[0].statime="20:12", G.citys[13].train1[0].arrivetime="11:58", G.citys[13].train1[0].alltime="15:46", G.citys[13].train1[0].price=113;G.citys[13].train1[1].start="成都", G.citys[13].train1[1].end="西安", G.citys[13].train1[1].number="1311", G.citys[13].train1[1].type="普快";G.citys[13].train1[1].statime="15:05", G.citys[13].train1[1].arrivetime="08:35", G.citys[13].train1[1].alltime="17:30", G.citys[13].train1[1].price=62;G.citys[13].train1[2].start="成都", G.citys[13].train1[2].end="贵阳", G.citys[13].train1[2].number="K9456", G.citys[13].train1[2].type="快速";G.citys[13].train1[2].statime="15:10", G.citys[13].train1[2].arrivetime="10:34", G.citys[13].train1[2].alltime="19:24", G.citys[13].train1[2].price=74;G.citys[13].train1[3].start="成都", G.citys[13].train1[3].end="贵阳", G.citys[13].train1[3].number="T8858", G.citys[13].train1[3].type="空调特快";G.citys[13].train1[3].statime="16:19", G.citys[13].train1[3].arrivetime="06:07", G.citys[13].train1[3].alltime="13:48", G.citys[13].train1[3].price=106;G.citys[13].train1[4].start="成都", G.citys[13].train1[4].end="昆明", G.citys[13].train1[4].number="K853", G.citys[13].train1[4].type="快速";G.citys[13].train1[4].statime="10:08", G.citys[13].train1[4].arrivetime="07:26", G.citys[13].train1[4].alltime="21:18", G.citys[13].train1[4].price=81;G.citys[13].train1[5].start="成都", G.citys[13].train1[5].end="昆明", G.citys[13].train1[5].number="K113", G.citys[13].train1[5].type="空调快速";G.citys[13].train1[5].statime="13:20", G.citys[13].train1[5].arrivetime="08:15", G.citys[13].train1[5].alltime="18:55", G.citys[13].train1[5].price=140;G.citys[14].train1[0].start="武汉", G.citys[14].train1[0].end="郑州", G.citys[14].train1[0].number="K370", G.citys[14].train1[0].type="空调快速";G.citys[14].train1[0].statime="08:36", G.citys[14].train1[0].arrivetime="15:19", G.citys[14].train1[0].alltime="06:43", G.citys[14].train1[0].price=73;G.citys[14].train1[1].start="武汉", G.citys[14].train1[1].end="郑州", G.citys[14].train1[1].number="1111", G.citys[14].train1[1].type="空调普快";G.citys[14].train1[1].statime="16:57", G.citys[14].train1[1].arrivetime="23:41", G.citys[14].train1[1].alltime="06:44", G.citys[14].train1[1].price=73;G.citys[14].train1[2].start="武汉", G.citys[14].train1[2].end="株洲", G.citys[14].train1[2].number="T6", G.citys[14].train1[2].type="空调特快";G.citys[14].train1[2].statime="00:39", G.citys[14].train1[2].arrivetime="12:07", G.citys[14].train1[2].alltime="11:28", G.citys[14].train1[2].price=154;G.citys[14].train1[3].start="武汉", G.citys[14].train1[3].end="株洲", G.citys[14].train1[3].number="D124", G.citys[14].train1[3].type="动车组";G.citys[14].train1[3].statime="07:10", G.citys[14].train1[3].arrivetime="16:11", G.citys[14].train1[3].alltime="09:01", G.citys[14].train1[3].price=373;G.citys[15].train1[0].start="上海", G.citys[15].train1[0].end="徐州", G.citys[15].train1[0].number="1462", G.citys[15].train1[0].type="普快";G.citys[15].train1[0].statime="11:24", G.citys[15].train1[0].arrivetime="23:21", G.citys[15].train1[0].alltime="11:57", G.citys[15].train1[0].price=45;。