📄
字号:
#define MAX_VERTEX_NUM 18
#define NULL 0
#define MAX_ARC_SIZE 100
#define MAX_ROUTE_NUM 5
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#define False 0
#define True 1
#define INFINITY 10000
typedef struct
{int number;
float expenditure;
int begintime[2];
int arrivetime[2];
}Vehide;
typedef struct
{Vehide stata[MAX_ROUTE_NUM];
int last;
}infolist;
typedef struct ArcNode
{int adjvex;
struct ArcNode *nextarc;
infolist info;
}ArcNode;//邻接表表接点
typedef struct VNode
{char cityname[10];
ArcNode *planefirstarc,*trainfirstarc;
}VNode,AdjList[MAX_VERTEX_NUM];//邻接表头接点
typedef struct
{AdjList vertices;
int vexnum,planearcnum,trainarcnum;
}ALGraph;//邻接表表示的图的信息
typedef struct Node
{int adjvex;
int route;
struct Node *next;
}Node;
typedef struct QNode
{int adjvex;
struct QNode *next;
}QNode;
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];
main()
//显示程序功能选择界面
{ALGraph G;
int i;
printf("\t\t\t\t全国铁路交通咨询系统\n\n");
printf("您可进行如下操作:\n");
printf("\t\t1=管理员管理\t 2=用户咨询\t3=显示交通系统\t 4=退出\n");
printf("\n\n注意:每次开启后请先初始化系统(路径:管理员管理-->初始化交通系统)\n");
printf("\n请选择:");
scanf("%d",&i);
getchar();
while(i!=4)
{switch(i)
{case 1:Administer(&G);break;
case 2:UserDemand(G);break;
case 3:PrintGraph(&G);break;
}
printf("\n您可进行如下操作:\n");
printf("\t\t1=管理员管理\t 2=用户咨询\t3=显示交通系统\t 4=退出\n");
printf("请选择:");
scanf("%d",&i);
getchar();
}
}
Administer(ALGraph *G)
//显示管理员管理项目选择界面
{int i;
printf("\n请选择管理项目:\n");
printf("\t\t1=初始化交通系统\t2=城市编辑\t3=返回上一级菜单\n");
printf("请选择:");
scanf("%d",&i);
getchar();
while(i!=3)
{switch(i)
{case 1:initgraph(G);
break;
case 2:cityedit(G);
break;
}
printf("\n请选择管理项目:\n");
printf("\t\t1=初始化交通系统\t2=城市编辑\t3=返回上一级菜单\n");
printf("请选择:");
scanf("%d",&i);
getchar();
}
}
initgraph(ALGraph *G)
//初始化交通系统方式选择界面
{int i;
printf("\n请选择初始化方式:\n");
printf("\t\t1=键盘\t\t2=文档\n");
printf("请选择:");
scanf("%d",&i);
getchar();
switch(i)
{case 1:createcityfile();
createtrainfile();
CreateGraph(G);
break;
case 2:CreateGraph(G);
break;
}
}
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);
}
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);
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)
{j=k;
break;
}
return(j);
}
CreateGraph(ALGraph *G)
//用city,train两个文档创建城市交通系统
{int i,j,k;
int arc_num;
int count2;//count1;
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]);
G->vertices[j].planefirstarc=NULL;
G->vertices[j].trainfirstarc=NULL;
j++;
}
G->vexnum=i;
if((fp=fopen("train.txt","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;
arc_num=0;
while(k<count2)
{i=LocateVertex(G,a[k].vt);
j=LocateVertex(G,a[k].vh);
q=G->vertices[i].trainfirstarc;
m=0;
while(q!=NULL)
{if(q->adjvex==j)
{t=q->info.last+1;
q->info.stata[t].number=a[k].co;
q->info.stata[t].expenditure=a[k].mo;
q->info.stata[t].begintime[0]=a[k].bt[0];
q->info.stata[t].begintime[1]=a[k].bt[1];
q->info.stata[t].arrivetime[0]=a[k].at[0];
q->info.stata[t].arrivetime[1]=a[k].at[1];
q->info.last=t;
m=1;
break;
}
q=q->nextarc;
}
if(m==0)
{p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->info.stata[0].number=a[k].co;
p->info.stata[0].expenditure=a[k].mo;
p->info.stata[0].begintime[0]=a[k].bt[0];
p->info.stata[0].begintime[1]=a[k].bt[1];
p->info.stata[0].arrivetime[0]=a[k].at[0];
p->info.stata[0].arrivetime[1]=a[k].at[1];
p->info.last=0;
p->nextarc=G->vertices[i].trainfirstarc;
G->vertices[i].trainfirstarc=p;
arc_num++;
}
k++;
}
G->trainarcnum=arc_num;
}
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->info.last;t++)
{strcpy(a[k].vt,G->vertices[i].cityname);
strcpy(a[k].vh,G->vertices[q->adjvex].cityname);
a[k].co=q->info.stata[t].number;
a[k].mo=q->info.stata[t].expenditure;
a[k].bt[0]=q->info.stata[t].begintime[0];
a[k].bt[1]=q->info.stata[t].begintime[1];
a[k].at[0]=q->info.stata[t].arrivetime[0];
a[k].at[1]=q->info.stata[t].arrivetime[1];
k++;
}
q=q->nextarc;
}
}
if((fp=fopen("train.txt","wb"))==NULL)
{printf("\n无法打开文件!\n");
return;
}
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);
}
cityedit(ALGraph *G)
//显示城市编辑项目选择界面
{int i;
char q;
printf("\n请选择城市编辑项目:\n");
printf("\t\t1=增加城市\t\t2=删除城市\n");
printf("请选择:");
scanf("%d",&i);
getchar();
if(i==1)
EnterVertex(G);
if(i==2)
DeleteVertex(G);
}
EnterVertex(ALGraph *G)
//增加城市
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -