📄 交通咨询.txt
字号:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#define MAX_VERTEX_NUM 18
#define MAX_ARC_SIZE 100
#define MAX_ROUTE_NUM 5
#define NULL 0
#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 time0[2];
int time1[2];
int time2[2];
int c[MAX_VERTEX_NUM];
int d[MAX_VERTEX_NUM];
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);
int main()
/*
显示程序功能选择界面
*/
{ALGraph G;
int i;
printf("请选择程序功能:\n");
printf("1=管理员管理\n2=用户咨询\n3=显示交通系统\n4=退出\n");
printf("选择?");
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("1=管理员管理\n2=用户咨询\n3=显示交通系统\n4=退出\n");
printf("选择?");
scanf("%d",&i);
getchar();
}
return 1;
}
void Administer(ALGraph *G)
/*
显示管理员管理项目选择界面
*/
{ int i;
printf("\n请选择管理项目:\n");
printf("1=初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5=返回上一级菜单\n");
printf("选择?");
scanf("%d",&i);
getchar();
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("1=初始化交通系统\n2=城市编辑\n3=飞机航班编辑\n4=列车车次编辑\n5=返回上一级菜单\n");
printf("选择?");
scanf("%d",&i);
getchar();
}
}
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);
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);
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->info.last+1; // 将数组a[i] 中的内容都复制到弧q中
q->info.stata[t].number=a[k].co;
q->info.stata[t].expenditure=a[k].mo;
q->info.stata[t].begintime[0]=a[k].bt[0];
q->info.stata[t].begintime[1]=a[k].bt[1];
q->info.stata[t].arrivetime[0]=a[k].at[0];
q->info.stata[t].arrivetime[1]=a[k].at[1];
q->info.last=t;
m=1;
break;
}
q=q->nextarc;
}
if(m==0)
{p=(ArcNode*)malloc(sizeof(ArcNode)); //开辟一个弧结点
p->adjvex=j; //将数组a[i]中的内容都复制到新的弧结点中
p->info.stata[0].number=a[k].co;
p->info.stata[0].expenditure=a[k].mo;
p->info.stata[0].begintime[0]=a[k].bt[0];
p->info.stata[0].begintime[1]=a[k].bt[1];
p->info.stata[0].arrivetime[0]=a[k].at[0];
p->info.stata[0].arrivetime[1]=a[k].at[1];
p->info.last=0;
p->nextarc=G->vertices[i].planefirstarc;
G->vertices[i].planefirstarc=p; // 将弧结点连接到适当的位置中去
arc_num++;
}
k++;
}
G->planearcnum=arc_num;
if((fp=fopen("train.txt","rb"))==NULL)
{printf("\n无法打开文件!\n");
return;
}
k=0;
fscanf(fp,"%d",&count2); //打开列车信息文件"plane.txt"
while(k<count2)
{if(fread(&a[k],sizeof(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->info.last+1; //将数组a[i] 中的内容都复制到弧q中
q->info.stata[t].number=a[k].co;
q->info.stata[t].expenditure=a[k].mo;
q->info.stata[t].begintime[0]=a[k].bt[0];
q->info.stata[t].begintime[1]=a[k].bt[1];
q->info.stata[t].arrivetime[0]=a[k].at[0];
q->info.stata[t].arrivetime[1]=a[k].at[1];
q->info.last=t;
m=1;
break;
}
q=q->nextarc;
}
if(m==0)
{
p=(ArcNode*)malloc(sizeof(ArcNode)); //开辟一个弧结点
p->adjvex=j; //将数组a[i]中的内容都复制到新的弧结点中
p->info.stata[0].number=a[k].co;
p->info.stata[0].expenditure=a[k].mo;
p->info.stata[0].begintime[0]=a[k].bt[0];
p->info.stata[0].begintime[1]=a[k].bt[1];
p->info.stata[0].arrivetime[0]=a[k].at[0];
p->info.stata[0].arrivetime[1]=a[k].at[1];
p->info.last=0;
p->nextarc=G->vertices[i].trainfirstarc;
G->vertices[i].trainfirstarc=p; //将弧结点连接到适当的位置中去
arc_num++;
}
k++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -