📄 完成.cpp
字号:
printf("\n请输入起始城市的名称:");
scanf("%s",name);
for(i=0;i<MAXNODE;i++)
{
if(strcmp(GP.Adjlist[i].cityname,name)==0&&GP.Flag[i]==1)
break;
else if(i==MAXNODE-1){printf("\n该城市不存在,请添加!");break;}
}
printf("\n请输入终点城市的名称:");
scanf("%s",name);
for(j=0;j<MAXNODE;j++)
{
if(strcmp(GP.Adjlist[j].cityname,name)==0&&GP.Flag[j]==1)
break;
else if(j==MAXNODE-1){printf("\n该城市不存在,请添加!");break;}
}
printf("\n请输入航班号:");
scanf("%s",number);
q.infor.ivex=i;
q.AdjVertex=j;
strcpy(q.infor.Number,number);
printf("\n请输入票价:");
scanf("%d",&q.infor.Money);
printf("\n请输入起飞时间:");
printf("\n几点:");
scanf("%d",&hour);
printf("几分: ");
scanf("%d",&minute);
q.infor.StratTime=TimeChange(hour,minute);
printf("\n请输入到站时间:");
printf("\n几点: ");
scanf("%d",&hour);
printf("几分: ");
scanf("%d",&minute);
q.infor.EndTime=TimeChange(hour,minute);
q.infor.Time=TimeSub(q.infor.EndTime,q.infor.StratTime);
printf("\n行车时间: %d分钟",q.infor.Time);
InsertEdge(GP,q);
printf("\n添加成功!");
break;
}
if(n==2)
{
printf("\n请输入起始城市的名称:");
scanf("%s",name);
for(i=0;i<MAXNODE;i++)
{
if(strcmp(GP.Adjlist[i].cityname,name)==0&&GP.Flag[i]==1)
break;
else if(i==MAXNODE-1){printf("\n该城市不存在,请添加!");break;}
}
printf("\n请输入终点城市的名称:");
scanf("%s",name);
for(j=0;j<MAXNODE;j++)
{
if(strcmp(GP.Adjlist[j].cityname,name)==0&&GP.Flag[j]==1)
break;
else if(j==MAXNODE-1){printf("\n该城市不存在,请添加!");break;}
}
printf("\n请输入车次:");
if(LocateEdage(GP,i,j,number))
{
q.infor.ivex=i;
q.AdjVertex=j;
strcpy(q.infor.Number, number);
DeleteEdge(GP,q);
printf("删除成功!\n");
break;
}
}
else if(n==0)
{
printf("\n");
break;
}
else
printf("输入有误,请重新输入!");
}//while ends
}//Edit_Plane ends
//=============================================================================
//=============================<信息查询>==================================
void GetInfor_Train(GraphType G) //火车时刻表查询
{
arctype *p;
int i;
printf("\n 火车时刻表 \n");
printf("车次 出发城市 到达城市 价格 发车时间 到达时间 行驶时间\n");
for(i=0;i<MAXNODE;i++)
{
if(G.Flag[i]==1)
{
p=G.Adjlist[i].FirstArc;
while(p)
{
printf("%s\t",p->infor.Number);
printf("%s\t",G.Adjlist[p->infor.ivex].cityname);
printf("%s\t",G.Adjlist[p->AdjVertex].cityname);
printf("%d\t",p->infor.Money);
PrintTime(p->infor.StratTime);
PrintTime(p->infor.EndTime);
PrintTime(p->infor.Time);
printf("\n");
p=p->NextArc;
}
}
}
printf("\n");
}
void GetInfor_Plane(GraphType G) //航班时刻表查询
{
arctype *p;
int i;
printf("\n 飞机航班表 \n");
printf("航班号 始发城市 到达城市 价格 始发时间 到达时间 飞行时间\n");
for(i=0;i<MAXNODE;i++)
{
if(G.Flag[i]==1)
{
p=G.Adjlist[i].FirstArc;
while(p)
{
printf("%s\t",p->infor.Number);
printf("%s\t",G.Adjlist[p->infor.ivex].cityname);
printf("%s\t",G.Adjlist[p->AdjVertex].cityname);
printf("%d\t",p->infor.Money);
PrintTime(p->infor.StratTime);
PrintTime(p->infor.EndTime);
PrintTime(p->infor.Time);
printf("\n");
p=p->NextArc;
}
}
}
printf("\n");
}
void GetInfor_City(GraphType G) //城市信息查询
{
int i;
printf("\n 城市信息 \n");
for(i=0;i<MAXNODE;i++)
{
if(G.Flag[i]==1)
{
printf("%s\t",G.Adjlist[i].cityname);
}
}
printf("\n\n");
}
void GetInfor(GraphType >,GraphType &GP)
{
int n;
while(1)
{
printf("\n\t\t 1.查询通达城市\n");
printf("\t\t 2.查询列车时刻表\n");
printf("\t\t 3.查询航班时刻表\n");
printf("\t\t 0.退出\n");
printf("\t 请选择:");
scanf("%d",&n);
if(n==1)
{
GetInfor_City(GT);
break;
}
else if(n==2)
{
GetInfor_Train(GT);
break;
}
else if(n==3)
{
GetInfor_Plane(GP);
break;
}
else if(n==0)
break;
else
printf("\n输入有误,请重新输入\n");
}
}
void print_Money(GraphType GT, PathType p) //最少钱输出
{
int i;
int sum=0;
printf("\n最省钱路线:\n\n");
for(i=0;i<p.len;i++)
{
printf("no%d. ",i+1);
printf("%s ",p.edges[i].p.Number);
printf("\n\t");
printf("始发:");
printf("\t[%d]:%4s ",p.edges[i].p.ivex,GT.Adjlist[p.edges[i].p.ivex].cityname);
PrintTime(p.edges[i].p.StratTime);
printf("\n\t");
printf("到达:");
printf("\t[%d]:%4s ",p.edges[i].vy,GT.Adjlist[p.edges[i].vy].cityname);
PrintTime(p.edges[i].p.EndTime);
printf("%6d元 ",p.edges[i].p.Money);
sum+=p.edges[i].p.Money;
printf("\n\n");
}
printf("总共费用:%d元\n\n",sum);
}
void print_Time(GraphType GT, PathType p, int now)
{
int i,sum_Time=0,hour=0,minute=0;
printf("\n最快到达路线:\n\n");
for(i=0;i<p.len;i++) //最短时间输出
{
printf("no%d. ",i+1);
printf("%s ",p.edges[i].p.Number);
printf("\n\t");
printf("始发:");
printf("\t[%d]:%4s ",p.edges[i].p.ivex,GT.Adjlist[p.edges[i].p.ivex].cityname);
PrintTime(p.edges[i].p.StratTime);
printf("\n\t");
printf("到达:");
printf("\t[%d]:%4s ",p.edges[i].vy,GT.Adjlist[p.edges[i].vy].cityname);
PrintTime(p.edges[i].p.EndTime);
printf("%6d元 ",p.edges[i].p.Money);
if(p.edges[i].p.StratTime<now&&p.edges[i].p.EndTime>=now)
sum_Time+=(1440+TimeSub(p.edges[i].p.EndTime,now));
else
sum_Time+=TimeSub(p.edges[i].p.EndTime,now);
now=p.edges[i].p.EndTime;
printf("\n\n");
}
hour=sum_Time/60;
minute=sum_Time%60;
printf("共需%d小时%d分\n\n",hour,minute);
}
//========================================================================
/***************************<PathType 基本操作>********************************/
void InitPath (PathType &pa)
{
//初始化pa为一条空路径(pa.len=0)
pa.len=0;
}
void copyPath (PathType &p1,PathType &p2)
{
//复制路径p1=p2
int i;
for(i=0;i<p2.len;i++)
{
p1.edges[i].vx=p2.edges[i].vx;
p1.edges[i].vy=p2.edges[i].vy;
p1.edges[i].p =p2.edges[i].p;
}
p1.len=p2.len;
}
void InsertPath (PathType &pa, int v, int w, EdgeType t)
{
//在路径pa中插入一条边(v, w)
pa.edges[pa.len].vx=v;
pa.edges[pa.len].vy=w;
pa.edges[pa.len].p=t;
pa.len++;
}
void SetPath(PathType &pa, int v, int w, EdgeType t)
{
//设置第一条边使用
pa.edges[0].vx=v;
pa.edges[0].vy=w;
pa.edges[0].p=t;
pa.len=1;
}
/*******************************************************************************/
//=======================<Dijkstra算法求最省钱路线>===============
void GetMoneyLeastPath (GraphType G,int i,int j, PathType &Path)
{
int k;
int dist[MAXNODE];
int whetherfind[MAXNODE]={0};
PathType path[MAXNODE];
arctype *p,*q;
EdgeType t;
int flg;
int find_i,v,w;
for(k=0;k<MAXNODE;k++) //初始化
{
dist[k]=MAXCOST;
InitPath(path[k]);
}
p=G.Adjlist[i].FirstArc;
while(p) //初始化dist数组,检测依附于起始点的每一条边
{
q=p->NextArc;
if(p->infor.Money<dist[p->AdjVertex])
{
dist[p->AdjVertex]=p->infor.Money;
t=p->infor;
SetPath(path[p->AdjVertex],i,p->AdjVertex,t);
}
p=q;
}
flg= 0;
while(!flg)
{
//在所有未求得最短路径的顶点求使得dist[i]取最小的i
for(k=0;k<MAXNODE;k++)
{
if(whetherfind[k]==0 && dist[k]<MAXCOST)
find_i=k;
}
whetherfind[find_i]=1;
if(find_i==j)
flg=1;
else
{
v=find_i;
p=G.Adjlist[v].FirstArc;
while(p)
{
q=p->NextArc;
w=p->AdjVertex;
if(whetherfind[w]==0 &&((dist[v]+p->infor.Money)<dist[w]))
{
dist[w]=dist[v]+p->infor.Money;
copyPath(path[w],path[v]);
InsertPath(path[w],v,w,p->infor);
}
p=q;
} //while(p)
} //else
}// while(!found)
copyPath(Path,path[j]);
}
void GetTimeShortestPath (GraphType G, int i, int j, int n ,PathType &Path)
{
int k;
int dist[MAXNODE];
int whetherfind[MAXNODE]={0};
int now[MAXNODE];
PathType path[MAXNODE];
arctype *p,*q;
EdgeType t;
int flg;
int find_i,v,w,time;
for(k=0;k<MAXNODE;k++) //初始化
{
dist[k]=MAXCOST;
InitPath(path[k]);
now[k]=0;
}
now[i]=n;
p=G.Adjlist[i].FirstArc;
while(p) //初始化dist数组,检测依附于起始点的每一条边
{
q=p->NextArc;
if(p->infor.StratTime<now[i]&&p->infor.EndTime>=now[i])
{
time= 1440-TimeSub(p->infor.EndTime,now[i]);
}
else
time= TimeSub(p->infor.EndTime,now[i]);
if(time<dist[p->AdjVertex])
{
dist[p->AdjVertex]=time;
t=p->infor;
SetPath(path[p->AdjVertex],i,p->AdjVertex,t);
now[p->AdjVertex]=p->infor.EndTime;
}
p=q;
}
flg= 0;
while(!flg)
{
//在所有未求得最短路径的顶点求使得dist[i]取最小的i
for(k=0;k<MAXNODE;k++)
{
if(whetherfind[k]==0 && dist[k]<MAXCOST)
find_i=k;
}
whetherfind[find_i]=1;
if(find_i==j)
flg=1;
else
{
v=find_i;
p=G.Adjlist[v].FirstArc;
while(p)
{
q=p->NextArc;
w=p->AdjVertex;
if(whetherfind[w]==0 &&(dist[v]+TimeSub(p->infor.EndTime,now[v])<dist[w]))
{
dist[w]=dist[v]+TimeSub(p->infor.EndTime,now[v]);
copyPath(path[w],path[v]);
InsertPath(path[w],v,w,p->infor);
}
p=q;
} //while(p)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -