📄 完成.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define MAXNODE 20 //顶点的最大数
#define MAXCOST 9999
//========================<数据结构定义>================================
typedef struct
{
int ivex; //起始点号
char Number[10]; // 车次号
int Money; //费用
int StratTime; //起始时间(秒)
int EndTime; //终止时间(秒)
int Time; //中途时间(秒)
}EdgeType; //Edge类型
typedef struct arc //链表中的结点
{
int AdjVertex; //弧头结点在数组中的序号
EdgeType infor;
struct arc *NextArc;
}arctype;
typedef struct //一维数组中的结点
{
char cityname[10];
arctype *FirstArc;
}vertextype;
typedef struct
{
vertextype Adjlist[MAXNODE]; //邻接表
int vexNum, edgeNum; //图中顶点数和边数
int Flag[MAXNODE]; //0表示已经不存在,1表示存在
}GraphType; //图类型
typedef struct {
int vx,vy;
EdgeType p;
}Edge;
typedef struct {
Edge edges[MAXNODE]; //路径中边的序列 : edges[i]表示从起点到i的最短路径
int len; //路径中边的数目
}PathType; //存放最短路径的数据结构
//=====================================================================
//====================<Time 操作>======================================================
int TimeChange(int hour,int minute) //输入的时间转换
{
int change;
if(minute>60)
{
hour=hour+minute/60;
minute=minute%60;
}
if(hour>24)
{
hour=hour%24;
}
change= hour*60+minute;
return change;
}
void PrintTime(int m) //时间输出(包括起始时间,历经时间)
{
int hour,minute;
if(m>1440)
{
m=m%1440;
}
hour=m/60;
minute=m%60;
printf("%4d时%2d分",hour,minute);
}
int TimeSub(int a, int b)
{
int c;
if(a-b<0)
{
c=a+1440-b;
}
else if(a-b>1440)
{
c=(a-b)%1440;
}
else
c=a-b;
return c;
}
//=======================================================================
//========================<建图,编辑>================================
void CreateGraph(GraphType &G)
{
//初始化空表
int i;
G.vexNum=0;
G.edgeNum=0;
for(i=0;i<MAXNODE;i++)
G.Flag[i]=0;
}
bool LocateEdage(GraphType G,int i,int j,char *number)
{
scanf("%s",number);
arctype *p;
p=G.Adjlist[i].FirstArc;
while(p)
{
if(p->AdjVertex==j&&strcmp(p->infor.Number,number)==0)
break;
p=p->NextArc;
}
if(p)
return true;
else
return false;
}
void InsertVex(GraphType &G,char *str) //增加城市结点函数
{
int i;
for(i=0;i<MAXNODE;i++)
{
if(G.Flag[i]!=1)
break;
}
strcpy(G.Adjlist[i].cityname,str);
G.Adjlist[i].FirstArc=NULL;
G.Flag[i]=1;
G.vexNum++;
}
void DeleteVex (GraphType &G, int ivex) //删除结点(城市)函数
{
int i;
arctype *pt,*p;
//把所有的ivex出度的路径删除
pt=G.Adjlist[ivex].FirstArc;
while(pt)
{
p=pt->NextArc;
free(pt);
pt=p;
G.edgeNum--;
}
pt=G.Adjlist[ivex].FirstArc=NULL;
//把点ivex标记为不使用
G.Flag[ivex]=0;
G.vexNum--;
//把所有的ivex入度的路径删除
for(i=0;i<MAXNODE ;i++)
{
if(G.Flag[i]==1)
{
p=G.Adjlist[i].FirstArc;
pt=p;
while(p)
{
if(p->AdjVertex=ivex)
{
if(p==G.Adjlist[i].FirstArc)
{
G.Adjlist[i].FirstArc=p->NextArc;
pt=G.Adjlist[i].FirstArc;
}
else
pt->NextArc=p->NextArc;
free(p);
p=pt;
G.edgeNum--;
}
pt=p; //pt要跟着p进行遍历!
p=p->NextArc;
} //while ends
}//if ends
}
}
void InsertEdge (GraphType &G ,arctype q)//增加时刻或航班线路函数
{
arctype *p=(arctype *)malloc(sizeof(arctype));
p->AdjVertex=q.infor.ivex;
strcpy(p->infor.Number,q.infor.Number);
p->infor.StratTime=q.infor.StratTime; //信息的复制
p->infor.EndTime=q.infor.EndTime;
p->infor.Time=q.infor.Time;
p->infor.Money=q.infor.Money;
p->NextArc=G.Adjlist[q.infor.ivex].FirstArc;
G.Adjlist[q.infor.ivex].FirstArc=p; //插入结点
G.edgeNum++;
}
void DeleteEdge(GraphType &G,arctype q ) //删除航班线路函数
{
arctype *p,*pt;
p=G.Adjlist[q.infor.ivex].FirstArc;
pt=p;
while(p)
{
if(p->AdjVertex==q.AdjVertex&&strcmp(p->infor.Number,q.infor.Number)==0)
{
break;
}
pt=p;
p=p->NextArc;
}
if(p==G.Adjlist[q.infor.ivex].FirstArc)
G.Adjlist[q.infor.ivex].FirstArc=p->NextArc;
else
pt->NextArc=p->NextArc;
free(p);
G.edgeNum--;
}
void Edit_City(GraphType >,GraphType &GP) // 城市信息编辑函数
{
int n,i;
char name[10];
while(1)
{
printf("\n");
printf("\t 1.添加城市");
printf("\t 2.删除城市");
printf("\t 0.退出");
printf("\t 请选择:");
scanf("%d",&n);
if(n==1)
{
printf("\n请输入添加城市的名称:");
scanf("%s",name);
InsertVex(GT,name); //增加结点函数
InsertVex(GP,name);
printf("\n添加成功!");
break;
}
else if(n==2)
{
printf("\n请输入删除城市的名称:");
scanf("%s",name);
for(i=0;i<MAXNODE;i++)
{
if(strcmp(GT.Adjlist[i].cityname,name)==0&>.Flag[i]==1)
{
DeleteVex(GT,i); //删除结点函数
DeleteVex(GP,i);
printf("删除成功!\n");
}
}
break;
}
else if(n==0)
{
printf("\n");
break;
}
else
printf("输入有误,请重新输入!");
}
}
void Edit_Train(GraphType >,GraphType GP) //火车时刻表编辑(添加,删除)
{
int n,i,j;
int hour,minute;
char name[10];
char number[10];
arctype q;
while(1)
{
printf("\n");
printf("\t 1.添加列车");
printf("\t 2.删除列车");
printf("\t 0.退出");
printf("\t 请选择:");
scanf("%d",&n);
if(n==1)
{
printf("\n请输入起始城市的名称:");
scanf("%s",name);
for(i=0;i<MAXNODE;i++)
{
if(strcmp(GT.Adjlist[i].cityname,name)==0&>.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(GT.Adjlist[j].cityname,name)==0&>.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(GT,q); // 增加q这条线路
printf("\n添加成功!");
break;
}
if(n==2)
{
printf("\n请输入起始城市的名称:");
scanf("%s",name);
for(i=0;i<MAXNODE;i++)
{
if(strcmp(GT.Adjlist[i].cityname,name)==0&>.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(GT.Adjlist[j].cityname,name)==0&>.Flag[j]==1)
break;
else if(j==MAXNODE-1){printf("\n该城市不存在,请添加!");break;}
}
printf("\n请输入车次:");
if(LocateEdage(GT,i,j,number))
{
q.infor.ivex=i;
q.AdjVertex=j;
strcpy(q.infor.Number, number);
DeleteEdge(GT,q); //删除q这条线路
printf("删除成功!\n");
break;
}
}
else if(n==0)
{
printf("\n");
break;
}
else
printf("输入有误,请重新输入!");
}//while ends
}//Edit_Train ends
void Edit_Plane(GraphType GT,GraphType &GP) //飞机航班表编辑(添加,删除)
{
int n,i,j;
int hour,minute;
char name[10];
char number[10];
arctype q;
while(1)
{
printf("\n");
printf("\t 1.添加航班");
printf("\t 2.删除航班");
printf("\t 0.退出");
printf("\t 请选择:");
scanf("%d",&n);
if(n==1)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -