/* *建立一个模拟的交通网络(用有向网来表示),编程实现从某个城市*出发到另一个城市所需的最短的时间及路径。
* *建立一个模拟的交通网络(用有向网来表示),编程实现从某个城市*出发到另一个城市所需的最短的时间及路径。
* */ #define MAX_VERTEX_NUM 18#define NULL 0#define MAX_ARC_SIZE 100#define MAX_ROUTE_NUM 5#include""#include""#include""#define False 0#define True 1#define INFINITY 10000 /*预定义*/typedef struct {int number;float expenditure;int begintime[2];int arrivetime[2];}Vehide;typedef struct {Vehide stata[MAX_ROUTE_NUM];int last;}infolist;typedef struct ArcNode {int adjvex;struct ArcNode *nextarc;infolist info;}ArcNode;typedef struct VNode {char cityname[10];ArcNode *planefirstarc,*trainfirstarc;}VNode,AdjList[MAX_VERTEX_NUM];typedef struct {AdjList vertices;int vexnum,planearcnum,trainarcnum;}ALGraph;typedef struct Node {int adjvex;int route;struct Node *next;}Node;typedef struct QNode {int adjvex;struct QNode *next;}QNode;typedef struct {QNode *front;QNode *rear;}LinkQueue;typedef struct TimeNode {int adjvex;int route;int begintime[2];int arrivetime[2];struct TimeNode *child[MAX_ROUTE_NUM]; }TimeNode,*TimeTree;struct arc {int co;char vt[10];char vh[10];int bt[2];int at[2];float mo;}a[MAX_ARC_SIZE]; /*数据结构定义*/char city[MAX_VERTEX_NUM][10];int TTime[2];int time[2];int time1[2];int time2[2];int c[MAX_VERTEX_NUM];int d[MAX_VERTEX_NUM]; /*变量定义*//*各种操作说明*/void Disp();void Administer(ALGraph *G);void cityedit(ALGraph *G);void CopyTimeTree(TimeTree p,TimeTree q);void createcityfile();void CreateGraph(ALGraph *G);void createplanefile();void CreateTimeTree(TimeTree p,int i,int j,LinkQueue *Q,infolist (*arcs)[MAX_VERTEX_NUM]);void createtrainfile();int DeleteplaneArc(ALGraph *G);void DeleteQueue(LinkQueue *Q,int *x);int DeletetrainArc(ALGraph *G);void DeleteVertex(ALGraph *G);void DemandDispose(int n,ALGraph G);void DestoryTimeTree(TimeTree p);void EnterplaneArc(ALGraph *G);void EnterQueue(LinkQueue *Q,int x);void EntertrainArc(ALGraph *G);void EnterVertex(ALGraph *G);void ExpenditureDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int v0,int v1,float *M,int *final);void flightedit(ALGraph *G);void initgraph(ALGraph *G);void InitQueue(LinkQueue *Q);int IsEmpty(LinkQueue *Q);int LocateVertex(ALGraph *G,char *v);void MinExpenditure(infolist arcs,float *expenditure,int *route);void MinTime(infolist arcs,int *time,int *route);void PrintGraph(ALGraph *G);int save(ALGraph *G);void TimeDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,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 |\n");gotoxy(20,12);printf("| |\n");gotoxy(20,13);printf("| 一叶方舟|\n");gotoxy(20,14);printf("| |\n");gotoxy(20,15);printf("--------------------------------\n");gotoxy(40,20);printf("^_^ 欢迎使用^_^");sleep(3);clrscr();}int main() /*主函数,程序入口*//* 显示程序功能选择界面*/{ALGraph G;int i;textbackground(7);textcolor(5);clrscr();Disp();printf("请选择程序功能:\n");printf("*************************************\n"); printf("** 1=管理员管理**\n");printf("** 2=用户咨询**\n");printf("** 3=显示交通系统**\n");printf("** 4=退出**\n");printf("*************************************\n"); printf("请选择?");scanf("%d",&i);getchar();while(i!=4){clrscr();switch(i){case 1:Administer(&G);break;case 2:UserDemand(G);break;case 3:PrintGraph(&G);break;}printf("\n请选择程序功能:\n");printf("*************************************\n");printf("** 1=管理员管理**\n");printf("** 2=用户咨询**\n");printf("** 3=显示交通系统**\n");printf("** 4=退出**\n");printf("*************************************\n");printf("选择?");scanf("%d",&i);getchar();}clrscr();gotoxy(20,10);printf("--------------------------------\n");gotoxy(20,11);printf("| 指导老师:夏汉民老师|\n");gotoxy(20,12);printf("| |\n");gotoxy(20,13);printf("| 制作:李济舟|\n");gotoxy(20,14);printf("| |\n");gotoxy(20,15);printf("--------------------------------\n");gotoxy(40,20);printf("谢谢使用");sleep(1);gotoxy(40,20);printf("正在退出");for(i=0;i<3;i++){ printf(".");sleep(i);}return 0;}void Administer(ALGraph *G) /* 显示管理员管理项目选择界面*/int i,j=0;char password[5];be:clrscr();gotoxy(20,10);printf("-------------------------------------\n");gotoxy(20,11);printf("| 管理员管理项目|\n");gotoxy(20,13);printf("| 1.初始化交通系统|\n");gotoxy(20,15);printf("| 2.城市编辑|\n");gotoxy(20,17);printf("| 3.飞机航班编辑|\n");gotoxy(20,19);printf("| 4.列车车次编辑|\n");gotoxy(20,20);printf("-------------------------------------\n");gotoxy(40,25);printf("请输入登陆密码(admin):");for(i=0;i<5;i++){password[i]=getch();printf("*");}if(password[0]!='a'||password[1]!='d'||password[2]!='m'||password[3]!='i'||password[4]!='n') {gotoxy(50,25);printf("输入错误,请重新输入!");j++;if(j==3)system(exit);getch();goto be;}printf("\n请选择管理项目:\n");printf("1=初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5=返回上一级菜单\n");printf("选择?");scanf("%d",&i);while(i!=5)switch(i){case 1:initgraph(G); /*初始化交通系统*/ break;case 2:cityedit(G); /*城市编辑*/ break;case 3:flightedit(G); /*飞机航班编辑*/ break;case 4:trainedit(G); /*列车车次编辑*/ break;}printf("\n请选择管理项目:\n");printf("*************************************\n");printf("** 1=初始化交通系统**\n"); printf("** 2=城市编辑**\n");printf("** 3=飞机航班编辑**\n");printf("** 4=列车车次编辑**\n");printf("** 5=返回上一级菜单**\n");printf("*************************************\n");printf("1=初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5=返回上一级菜单\n");printf("选择?");scanf("%d",&i);}}void initgraph(ALGraph *G) /*初始化交通系统*//* 初始化交通系统方式选择界面*/{int i;printf("\n请选择初始化方式:\n");printf("1=键盘\n2=文档\n");printf("选择?");scanf("%d",&i);getchar();switch(i){case 1:createcityfile();createplanefile();createtrainfile();CreateGraph(G);break;case 2:CreateGraph(G);break;}}void createcityfile() /* 创建城市名称文档*/{int i=0;int j;char flag='y';FILE *fp;printf("\n请输入城市名称的信息:\n");while(flag=='y'||flag=='Y'){printf("城市名称:");gets(city[i]);i++;printf("继续输入?(Y/N)");scanf("%c",&flag);getchar();}printf("\n");if((fp=fopen("","wb"))==NULL){printf("无法打开文件!\n");return;}for(j=0;j<i;j++)fprintf(fp,"%10s",city[j]);fclose(fp);}void createplanefile() /* 创建飞机航班文档*/{int code,bt[2],at[2]; /*code航班编号,bt出发时间,at到达时间*/ float money;int i;int count;char vt[10],vh[10],flag; /*vt起始城市,vh目标城市*/FILE *fp;flag='y';count=0;while(flag=='Y'||flag=='y') /*flag为标志位,初值为1*/{printf("请输入飞机航班的信息:\n");/*提示"输入航班信息"*/printf("飞机航班编号:"); /*输入航班code*/scanf("%d",&code);getchar();printf("起始城市:"); /*输入航班的出发城市vt*/gets(vt);getchar();printf("目的城市:"); /*输入航班的到达城市vh*/gets(vh);printf("航班费用:"); /*输入机票价格money*/scanf("%f",&money);getchar();printf("起飞时间:"); /*输入航班的出发时间bt*/scanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60){printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&bt[0],&bt[1]);getchar();}printf("到达时间:"); /*输入航班的到达时间at*/scanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60){printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&at[0],&at[1]);getchar();}a[count].co=code; /*a 为程序头部定义的结构体*/strcpy(a[count].vt,vt);strcpy(a[count].vh,vh);a[count].bt[0]=bt[0];a[count].bt[1]=bt[1];a[count].at[0]=at[0];a[count].at[1]=at[1];a[count].mo=money;count++; /*计数值count+1*/printf("继续输入?(Y/N)"); /*提示"是否要继续输入航班信息:"*/ scanf("%c",&flag);getchar();printf("\n");}if((fp=fopen("","wb"))==NULL) /*航班文件不能以读写形式打开*/ printf("\n无法打开文件!\n"); /*提示"无法打开文件"*/fprintf(fp,"%d",count); /*将计数值count写入航班车文件*/for(i=0;i<count;i++)if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1) /*无法将a[i]写入航班文件*/ printf("\n文件写入错误!\n"); /*提示"文件无法写入"*/fclose(fp); /*关闭航班文件*/}void createtrainfile() /* 创建列车车次文档*/{int code,bt[2],at[2];float money;int i;int count;char vt[10],vh[10],flag;FILE *fp;flag='y';count=0;while(flag=='y'||flag=='Y'){printf("请输入列车车次的信息:\n");printf("列车车次编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();printf("目的城市:");gets(vh);printf("车次费用:");scanf("%f",&money);getchar();printf("发车时间:");scanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60){printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&bt[0],&bt[1]);getchar();}printf("到达时间:");scanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60){printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&at[0],&at[1]);getchar();}a[count].co=code;strcpy(a[count].vt,vt);strcpy(a[count].vh,vh);a[count].bt[0]=bt[0];a[count].bt[1]=bt[1];a[count].at[0]=at[0];a[count].at[1]=at[1];a[count].mo=money;count++;printf("继续输入?(Y/N)");scanf("%c",&flag);getchar();printf("\n");}if((fp=fopen("","wb"))==NULL)printf("\n无法打开文件!\n");fprintf(fp,"%d",count); for(i=0;i<count;i++)if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)printf("\n文件写入错误!\n");fclose(fp);}int LocateVertex(ALGraph *G,char *v) /* 城市名在交通系统中定位操作,找出城市名在图中对应结点位置*/{int j,k;j=-1;for(k=0;k<G->vexnum;k++)if(strcmp(G->vertices[k].cityname,v)==0) /*第k个结点中的城市名与传过来的城市名相同*/{j=k; /*记录位置*/break;}return(j);}void CreateGraph(ALGraph *G) /* 用city,plan,train三个文档创建城市交通系统*/ {int i,j,k;int arc_num;int count1,count2;int m,t;ArcNode *p,*q;FILE *fp;i=0;if((fp=fopen("","rb"))==NULL) /*打开城市文件,文件指针返回值为空*/{printf("\n无法打开文件!\n");return;}while(!feof(fp)) /*文件不为空*/{fscanf(fp,"%10s",city[i]);i++;}fclose(fp); /*关闭文件*/j=0;while(j<i){strcpy(G->vertices[j].cityname,city[j]);/*将city[i] 中的内容复制到图的结构体的结点数组中;*/G->vertices[j].planefirstarc=NULL; /* 图的结构体其他项赋初值;*/G->vertices[j].trainfirstarc=NULL;j++;}G->vexnum=i;if((fp=fopen("","rb"))==NULL)printf("\n无法打开文件!\n");k=0;fscanf(fp,"%d",&count1); /*打开航班信息文件""*/while(k<count1){if(fread(&a[k],sizeof(struct arc),1,fp)!=1)printf("\n文件读入错误!\n");k++;}fclose(fp); /*关闭文件*/k=0; /*a的计数变量k=0*/arc_num=0; /*弧的计数变量arc_num=0*/while(k<count1){i=LocateVertex(G,a[k].vt);/*调用函数LocateVertex(G,a[k].vt)得到起始结点的位置i*/j=LocateVertex(G,a[k].vh);/*调用函数LocateVertex(G,a[k].vh)得到起始结点的位置j*/q=G->vertices[i].planefirstarc;m=0;while(q!=NULL){if(q->adjvex==j) /*弧q中的邻接顶点与j相等*/{t=q->+1; /* 将数组a[i] 中的内容都复制到弧q中*/q->[t].number=a[k].co;q->[t].expenditure=a[k].mo;q->[t].begintime[0]=a[k].bt[0];q->[t].begintime[1]=a[k].bt[1];q->[t].arrivetime[0]=a[k].at[0];q->[t].arrivetime[1]=a[k].at[1];q->=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode)); /*开辟一个弧结点*/p->adjvex=j;/*将数组a[i]中的内容都复制到新的弧结点中*/p->[0].number=a[k].co;p->[0].expenditure=a[k].mo;p->[0].begintime[0]=a[k].bt[0];p->[0].begintime[1]=a[k].bt[1];p->[0].arrivetime[0]=a[k].at[0];p->[0].arrivetime[1]=a[k].at[1];p->=0;p->nextarc=G->vertices[i].planefirstarc;G->vertices[i].planefirstarc=p; /* 将弧结点连接到适当的位置中去*/ arc_num++;}k++;}G->planearcnum=arc_num;if((fp=fopen("","rb"))==NULL){printf("\n无法打开文件!\n");return;}k=0;fscanf(fp,"%d",&count2); /*打开列车信息文件""*/while(k<count2){if(fread(&a[k],sizeof(struct arc),1,fp)!=1)printf("\n文件读入错误!\n");k++;}fclose(fp); /*关闭文件*/k=0; /*a的计数变量k=0;*/arc_num=0; /* 弧的计数变量arc_num=0;*/while(k<count2){i=LocateVertex(G,a[k].vt);/* 调用函数LocateVertex(G,a[k].vt)得到起始结点的位置i*/ j=LocateVertex(G,a[k].vh);/* 调用函数LocateVertex(G,a[k].vh)得到起始结点的位置j*/ q=G->vertices[i].trainfirstarc;m=0;while(q!=NULL){if(q->adjvex==j) /*弧q中的邻接顶点与j相等*/{t=q->+1; /*将数组a[i] 中的内容都复制到弧q中*/q->[t].number=a[k].co;q->[t].expenditure=a[k].mo;q->[t].begintime[0]=a[k].bt[0];q->[t].begintime[1]=a[k].bt[1];q->[t].arrivetime[0]=a[k].at[0];q->[t].arrivetime[1]=a[k].at[1];q->=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode)); /*开辟一个弧结点*/p->adjvex=j; /*将数组a[i]中的内容都复制到新的弧结点中*/p->[0].number=a[k].co;p->[0].expenditure=a[k].mo;p->[0].begintime[0]=a[k].bt[0];p->[0].begintime[1]=a[k].bt[1];p->[0].arrivetime[0]=a[k].at[0];p->[0].arrivetime[1]=a[k].at[1];p->=0;p->nextarc=G->vertices[i].trainfirstarc;G->vertices[i].trainfirstarc=p; /*将弧结点连接到适当的位置中去*/ arc_num++;}k++;}G->trainarcnum=arc_num;}int save(ALGraph *G) /* 保存城市交通系统到相应的文档*/{int i,j,k,t;ArcNode *q;FILE *fp;j=0;while(j<G->vexnum){strcpy(city[j],G->vertices[j].cityname);j++;}i=0;if((fp=fopen("","wb"))==NULL)printf("\n错误,无法打开文件!\n");while(i<G->vexnum){fprintf(fp,"%10s",city[i]);i++;}fclose(fp);k=0;for(i=0;i<G->vexnum;i++){q=G->vertices[i].planefirstarc;while(q!=NULL){for(t=0;t<=q->;t++){strcpy(a[k].vt,G->vertices[i].cityname);strcpy(a[k].vh,G->vertices[q->adjvex].cityname); a[k].co=q->[t].number;a[k].mo=q->[t].expenditure;a[k].bt[0]=q->[t].begintime[0];a[k].bt[1]=q->[t].begintime[1];a[k].at[0]=q->[t].arrivetime[0];a[k].at[1]=q->[t].arrivetime[1];k++;}q=q->nextarc;}}if((fp=fopen("","wb"))==NULL){printf("\n无法打开文件!\n");return 0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)printf("\n文件写入错误!\n");i++;}fclose(fp);k=0;for(i=0;i<G->vexnum;i++){q=G->vertices[i].trainfirstarc;while(q!=NULL){for(t=0;t<=q->;t++){strcpy(a[k].vt,G->vertices[i].cityname);strcpy(a[k].vh,G->vertices[q->adjvex].cityname); a[k].co=q->[t].number;a[k].mo=q->[t].expenditure;a[k].bt[0]=q->[t].begintime[0];a[k].bt[1]=q->[t].begintime[1];a[k].at[0]=q->[t].arrivetime[0];a[k].at[1]=q->[t].arrivetime[1];k++;}q=q->nextarc;}}if((fp=fopen("","wb"))==NULL){printf("\n无法打开文件!\n");return 0;}i=0;fprintf(fp,"%d",k);while(i<k){if(fwrite(&a[i],sizeof(struct arc),1,fp)!=1)printf("\n文件写入错误!\n");i++;}fclose(fp);return 1;}void cityedit(ALGraph *G) /* 显示城市编辑项目选择界面*/ {int i;printf("\n请选择城市编辑项目:\n");printf("1=增加城市\n2=删除城市\n");printf("选择?");scanf("%d",&i);getchar();if(i==1)EnterVertex(G);if(i==2)DeleteVertex(G);}void EnterVertex(ALGraph *G) /* 增加城市*/{char v[10],c;int i;printf("\n请输入新增城市的名称:");gets(v);i=LocateVertex(G,v);if(i>=0&&i<G->vexnum){printf("\n错误!此城市已存在\n");return;}else{printf("\n确认?(Y/N)");c=getchar();getchar();if(c=='Y'||c=='y'){i=G->vexnum;strcpy(G->vertices[i].cityname,v);G->vertices[i].planefirstarc=NULL;G->vertices[i].trainfirstarc=NULL;G->vexnum=i+1;save(G);}else return;}}void DeleteVertex(ALGraph *G)/* G是程序头部定义的结构体*//* 删除城市*/{int i,j,k,n;char v[10],c;ArcNode *p,*q,*m;printf("\n请输入删除的城市:"); /*提示"输入删除城市名"*/gets(v);printf("\n确认?(Y/N)"); /*提示"是否确定要删除(Y/N)"*/c=getchar();getchar();if(c=='Y'||c=='y'){n=0; /*0是记数标志,控制循环次数*/while(n<G->vexnum&&strcmp(G->vertices[n].cityname,v)!=0)/*n<图G表头接点总个数&&图G的存储城市名与v不同,G表头结点总个数比实际大1*/n++;/*记数值n+1*/if(n==G->vexnum) /*n==图G表头结点总个数*/printf("\n错误!无法找到此城市!\n"); /*提示"无法找到此城市"*/else{i=LocateVertex(G,v); /*利用G函数找到此城市名所处在G中位置*/p=G->vertices[i].planefirstarc;while(p!=NULL){q=p;p=p->nextarc;free(q); /*删除从此结点出发的所有航班弧*/}p=G->vertices[i].trainfirstarc;while(p!=NULL){q=p;p=p->nextarc;free(q); /*删除从此结点出发的所有列车弧*/}for(j=i;j<G->vexnum-1;j++){strcpy(G->vertices[j].cityname,G->vertices[j+1].cityname);/*将G第j个结点的信息依前移1位*/G->vertices[j].planefirstarc=G->vertices[j+1].planefirstarc;G->vertices[j].trainfirstarc=G->vertices[j+1].trainfirstarc;}G->vertices[j].planefirstarc=NULL; /*将G第j个结点的信息置空*/G->vertices[j].trainfirstarc=NULL;for(k=0;k<G->vexnum-1;k++) /*以下是删除所有指向此结点的航班弧*/ {p=G->vertices[k].planefirstarc;while(p!=NULL){if(p->adjvex>i){p->adjvex=p->adjvex-1;q=p;p=p->nextarc; /*p指向下一条飞机弧*/}Elseif(p->adjvex==i) /*该弧指向的顶点位置(p->adjvex )== i*/{if(p==G->vertices[k].planefirstarc) /*p指向图G中k结点的第一条飞机弧*/ {m=p;G->vertices[k].planefirstarc=p->nextarc;/*将图G中k结点的第二条飞机弧改为第一弧*/p=p->nextarc; /*p指向下一条飞机弧*/free(m); /*释放(m)*/}Else{q->nextarc=p->nextarc; /*将p的下一条弧赋给q的下一条弧*/m=p;p=p->nextarc; /*p指向下一条飞机弧*/free(q); /*释放(q)*/}}Else{q=p;p=p->nextarc; /*p指向下一条飞机弧*/}}}for(k=0;k<G->vexnum-1;k++) /*以下是删除所有指向此结点的列车弧*/ {p=G->vertices[k].trainfirstarc; /*p指向图G中k结点的第一条列车弧*/ while(p!=NULL){if(p->adjvex>i) /*该弧指向的顶点位置(p->adjvex)>i */{p->adjvex=p->adjvex-1; /*将该弧指向顶点位置-1*/q=p;p=p->nextarc; /*p指向下一条列车弧*/}Elseif(p->adjvex==i) /*该弧指向的顶点位置(p->adjvex)==i*/{if(p==G->vertices[k].trainfirstarc)/*p指向图G中k结点的第一条列车*/ {m=p;G->vertices[k].trainfirstarc=p->nextarc;/*将图G中k结点的第二条列车弧改为第一弧*/p=p->nextarc;free(m);}Else{q->nextarc=p->nextarc;m=p;p=p->nextarc;free(q);}}else{q=p;p=p->nextarc;}}}}G->vexnum--;save(G);}else return;}void flightedit(ALGraph *G) /* 飞机航班编辑项目选择界面*/ {int i; /* char q; */printf("\n请选择飞机航班编辑项目:\n");printf("1=新增航班\n2=删除航班\n");printf("选择?");scanf("%d",&i);getchar();if(i==1)EnterplaneArc(G);if(i==2)DeleteplaneArc(G);}void trainedit(ALGraph *G) /* 列车车次编辑项目选择界面*/ {int i; /* char q; */printf("\n请选择列车车次编辑项目:\n");printf("1=新增车次\n2=删除车次\n");printf("选择?");scanf("%d",&i);getchar();if(i==1)EntertrainArc(G);if(i==2)DeletetrainArc(G);}void EnterplaneArc(ALGraph *G) /* 增加飞机航班*/ {int i,j,bt[2],at[2];int code;float money;int m,t;char vt[10],vh[10],c;ArcNode *p,*q;printf("\n请输入新增飞机航班的信息:\n");printf("飞机航班编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();printf("目的城市:");gets(vh);printf("航班费用:");scanf("%f",&money);getchar();printf("起飞时间:");scanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60){printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&bt[0],&bt[1]);getchar();}printf("到达时间:");scanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60){printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&at[0],&at[1]);getchar();}printf("\n确认?(Y/N)");c=getchar();getchar();if(c=='Y'||c=='y'){i=LocateVertex(G,vt);j=LocateVertex(G,vh);if(i==-1){printf("\n错误!无法找到起始城市\n"); return;}if(j==-1){printf("\n错误!无法找到到达城市\n"); return;}q=G->vertices[i].planefirstarc;m=0;while(q!=NULL){if(q->adjvex==j){t=q->+1;q->[t].number=code;q->[t].expenditure=money;q->[t].begintime[0]=bt[0];q->[t].begintime[1]=bt[1];q->[t].arrivetime[0]=at[0];q->[t].arrivetime[1]=at[1];q->=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode)); p->adjvex=j;p->[0].number=code;p->[0].expenditure=money;p->[0].begintime[0]=bt[0];p->[0].begintime[1]=bt[1];p->[0].arrivetime[0]=at[0];p->[0].arrivetime[1]=at[1];p->=0;p->nextarc=G->vertices[i].planefirstarc; G->vertices[i].planefirstarc=p;G->planearcnum++;save(G);}else return;}void EntertrainArc(ALGraph *G) /* 增加列车车次*/ {int i,j,bt[2],at[2];int code;float money;int m,t;char vt[10],vh[10],c;ArcNode *p,*q;printf("\n请输入新增列车车次的信息:\n");printf("列车车次编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();printf("目的城市:");gets(vh);printf("车次费用:");scanf("%f",&money);getchar();printf("发车时间:");scanf("%d:%d",&bt[0],&bt[1]);getchar();while(bt[0]<0||bt[0]>=24||bt[1]<0||bt[1]>=60){printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&bt[0],&bt[1]);getchar();}printf("到达时间:");scanf("%d:%d",&at[0],&at[1]);getchar();while(at[0]<0||at[0]>=24||at[1]<0||at[1]>=60){printf("\n时间输入有误,请重新输入\n");scanf("%d:%d",&at[0],&at[1]);getchar();printf("\n确认?(Y/N)");c=getchar();getchar();if(c=='Y'||c=='y'){i=LocateVertex(G,vt);j=LocateVertex(G,vh);if(i==-1){printf("\n错误!无法找到起始城市\n"); return;}if(j==-1){printf("\n错误!无法找到到达城市\n"); return;}q=G->vertices[i].trainfirstarc;m=0;while(q!=NULL){if(q->adjvex==j){t=q->+1;q->[t].number=code;q->[t].expenditure=money;q->[t].begintime[0]=bt[0];q->[t].begintime[1]=bt[1];q->[t].arrivetime[0]=at[0];q->[t].arrivetime[1]=at[1];q->=t;m=1;break;}q=q->nextarc;}if(m==0){p=(ArcNode*)malloc(sizeof(ArcNode)); p->adjvex=j;p->[0].number=code;p->[0].expenditure=money;p->[0].begintime[0]=bt[0];p->[0].begintime[1]=bt[1];p->[0].arrivetime[0]=at[0];p->[0].arrivetime[1]=at[1];p->=0;p->nextarc=G->vertices[i].trainfirstarc;G->vertices[i].trainfirstarc=p;G->trainarcnum++;}save(G);}else return;}int DeleteplaneArc(ALGraph *G) /* 删除飞机航班*/ {int i,j;int code;char vt[10],vh[10],c;int n;int k;ArcNode *p,*q;printf("\n请输入删除飞机航班的信息:\n");printf("飞机航班的编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();printf("目的城市:");gets(vh);printf("\n确认?(Y/N)");c=getchar();getchar();if(c=='Y'||c=='y'){i=LocateVertex(G,vt);j=LocateVertex(G,vh);if(i==-1){printf("\n错误!无法找到起始城市\n");return 0;}if(j==-1){printf("\n错误!无法找到目的城市\n");return 0;p=G->vertices[i].planefirstarc;q=p;while(p!=NULL){if(p->adjvex==j){n=-1;for(k=0;k<=p->;k++){if(p->[k].number==code){n=k;break;}}if(n!=-1)if(p->==0){if(q==p)G->vertices[i].planefirstarc=p->nextarc;elseq->nextarc=p->nextarc;free(p);}else{for(k=n;k<p->;k++){p->[k].number=p->[k+1].number; p->[k].expenditure=p->[k+1].expenditure; p->[k].begintime[0]=p->[k+1].begintime[0]; p->[k].begintime[1]=p->[k+1].begintime[1]; p->[k].arrivetime[0]=p->[k+1].arrivetime[0];p->[k].arrivetime[1]=p->[k+1].arrivetime[1]; } p->=p->;}elseprintf("\n在此两城市之间无法找到No.%d飞机航班\n",code);save(G);return 0;}q=p;p=p->nextarc;}if(p==NULL)printf("\n在此两城市之间无飞机航班存在\n");}return 1;return 1;}int DeletetrainArc(ALGraph *G) /* 删除列车车次*/ {int i,j;int code;char vt[10],vh[10],c;int n;int k;ArcNode *p,*q;printf("\n请输入删除列车车次的信息:\n");printf("列车车次的编号:");scanf("%d",&code);getchar();printf("起始城市:");gets(vt);getchar();printf("目的城市:");gets(vh);printf("\n确认?(Y/N)");c=getchar();getchar();if(c=='Y'||c=='y'){i=LocateVertex(G,vt);j=LocateVertex(G,vh);if(i==-1){printf("\n错误!无法找到起始城市\n");return 0;}if(j==-1){printf("\n错误!无法找到目的城市\n");return 0;}p=G->vertices[i].trainfirstarc;q=p;while(p!=NULL){if(p->adjvex==j)。