📄 交通咨询.txt
字号:
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->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("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->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 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指向下一条飞机弧
}
else if(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指向下一条列车弧
}
else if(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);
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->info.last+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->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=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->info.last=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);
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->info.last+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->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=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->info.last=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);
printf("目的城市:");
gets(vh);
printf("\n确认?(Y/N)");
c=getchar();
getchar();
if(c=='Y'||c=='y')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -