/***********************************************************
*版权所有(C)2017
*
*文件名称:head.h,graph.h
*文件标识:无
*内容摘要:各类函数的头文件
*其它说明:无
*当前版本:V1.5
*作者:王硕
*完成日期:2017,12,22
***********************************************************/
#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED
#include
#include
using namespace std;
#include
#include
#include
#include
#include
#include
#include
/************************************
* 功能描述:关于链表和链队和文件的头文件
* 输入参数:无
* 输出参数:无
************************************/
typedef struct Yidingkehu
{
//单链表
char name[15];//已订票的客户姓名
int dingpiaoshu;//已订票数量
struct Yidingkehu *next1;//
} Link;
typedef struct Weidingkehu
{
//单链队
char name[15];//预订票的客户姓名
int yudingpiao;// 要订票数量
struct Weidingkehu *next2;//下一个链队结点指针
} Qptr;
typedef struct//链队头结点
{
Qptr *front;
Qptr *rear;
} LinkQuNode;
typedef struct Hangxian
{
//创建一个含有六个信息的结构体
char hangbanhao[15];//航班号-
char feijihao[15];//飞机号
int feixingriqi;//起飞时间
int chenkerenshu;//座位数
int yupiao;//余票
char zhongdianzhan[15];//降落城市
struct Hangxian *next;//指向下一个链结点的指针
struct Yidingkehu *yiding;//定义一个指向已订票客户的头结点指针,一个航班节点可以指向多个已订票客户节点
struct Weidingkehu *yudingqueue1;
struct Weidingkehu *yudingqueue2;
} Linklist;
void InitLinklist(Linklist *&L);//初始化单链表
void menu(Linklist *&L);//主菜单
void initqueue(LinkQuNode *&q);//初始化单链队
void hbhchaxun(Linklist *&L);//通过航班号查询
void mddchaxun(Linklist *&L);//通过目的地查询
void lurugongneng(Linklist *&L);//选择录入方法
void lurugongneng1(Linklist *&L);//初始化录入功能
void chaxungongneng(Linklist *&L);//查询功能
void dingpiaogongneng(Linklist *&L);//订票功能
void tuipiaogongneng(Linklist *&L);//退票功能
void Read(Linklist *&L);
void Write(Linklist *&L);
#endif // HEAD_H_INCLUDED
#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED
#include
#include
using namespace std;
#define MAXV 100 //最大顶点个数
#define INF 32767 //INF表示∞
/************************************
* 功能描述:关于图和最短路径的头文件
* 输入参数:无
* 输出参数:无
************************************/
typedef int InfoType;
//以下定义邻接矩阵类型
typedef struct
{
int no; //顶点编号
char name[30]; //名称
InfoType info;
//string cname; //顶点其他信息,在此存放带权图权值
} VertexType; //顶点类型
typedef struct //图的定义
{
int edges[MAXV][MAXV]; //邻接矩阵
int n,e; //顶点数,弧数
VertexType vexs[MAXV]; //存放顶点信息
} MGraph; //图的邻接矩阵类型
//以下定义邻接表类型
typedef struct ANode //弧的结点结构类型
{
int adjvex; //该弧的终点位置
struct ANode *nextarc; //指向下一条弧的指针
InfoType info; //该弧的相关信息,这里用于存放权值
} ArcNode;
typedef int Vertex;
typedef struct Vnode //邻接表头结点的类型
{
Vertex data; //顶点信息
int count; //存放顶点入度,只在拓扑排序中用
ArcNode *firstarc; //指向第一条弧
} VNode;
typedef VNode AdjList[MAXV]; //AdjList是邻接表类型
typedef struct
{
AdjList adjlist; //邻接表
int n,e; //图中顶点数n和边数e
} ALGraph; //图的邻接表类型
//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
// n - 矩阵的阶数
// g - 要构造出来的邻接矩阵数据结构
void ArrayToMat(int *Arr, int n, MGraph &g); //用普通数组构造图的邻接矩阵
void ArrayToList(int *Arr, int n, ALGraph *&); //用普通数组构造图的邻接表
void MatToList(MGraph g,ALGraph *&G);//将邻接矩阵g转换成邻接表G
void ListToMat(ALGraph *G,MGraph &g);//将邻接表G转换成邻接矩阵g
void DispMat(MGraph g);//输出邻接矩阵g
void DispAdj(ALGraph *G);//输出邻接表G
void Dijkstra(MGraph g,int v);
void Dispath(int dist[],int path[],int s[],int n,int v);
void Ppath(int path[],int i,int v);
#endif // GRAPH_H_INCLUDED
实现函数功能的cpp文件:
/***********************************************************
*版权所有(C)2017
*
*文件名称:head.h,graph.h
*文件标识:无
*内容摘要:实现函数功能的cpp文件
*其它说明:无
*当前版本:V1.5
*作者:王硕
*完成日期:2017,12,22
***********************************************************/
#include
using namespace std;
#include
#include
#include
#include "head.h"
/************************************
* 功能描述:菜单函数,提供选择界面
* 输入参数:无
* 输出参数:无
************************************/
void menu(Linklist *&L)
{
int n;
system("color f8");
do //打印主界面
{
printf(" ------------欢迎使用烟台航空客运订票系统------------\n");
printf(" *************\n");
printf(" ---------------1. 录入功能 ---------------\n");
printf(" ---------------2. 查询功能 ---------------\n");
printf(" ---------------3. 订票功能 ---------------\n");
printf(" ---------------4. 退票功能 ---------------\n");
printf(" ---------------5. 退出 ---------------\n");
printf(" *************\n");
printf("\t请选择:");
scanf("%d",&n);
printf("\n");
switch(n)
{
case 1:
lurugongneng(L);//录入功能
break;
case 2:
chaxungongneng(L);//查询功能
break;
case 3:
dingpiaogongneng(L);//订票功能
break;
case 4:
tuipiaogongneng(L);//退票功能
break;
default :
exit(0);//退出
}
}
while(n==1||n==2||n==3||n==4);
}
#include
#include
using namespace std;
#include
#include
#include
#include
#include
#include
#include "head.h"
/************************************
* 功能描述:从已有文件中录入航班信息
* 输入参数:无
* 输出参数:无
************************************/
void Read(Linklist *&L)
{
Linklist *p,*r;
r=L;
ifstream file("航班信息.txt",ios::in);
while(file)
{
LinkQuNode *q;
p=(Linklist *)malloc(sizeof(Linklist));
file>>p->hangbanhao>>p->feijihao>>p->feixingriqi>>p->chenkerenshu>>p->yupiao>>p->zhongdianzhan;
if(!file) break;
r->next=p;
r=p;
p->yiding=(Link *)malloc(sizeof(Link));
p->yiding->next1=NULL;
initqueue(q);
p->yudingqueue1=q->front;
p->yudingqueue2=q->rear;
}
r->next=NULL;
file.close();
}
/************************************
* 功能描述:将手动录入的航班信息写到文件里
* 输入参数:无
* 输出参数:无
************************************/
void Write(Linklist *&L)
{
Linklist *p;
p=L->next;
ofstream file("航班信息.txt",ios::out);
while(p!=NULL)
{
file<hangbanhao<<" "<feijihao<<" "<feixingriqi<<" "<chenkerenshu<<" "<yupiao<<" "<zhongdianzhan<<"\n";
p=p->next;
}
file.close();
}
/************************************
* 功能描述:录入航班信息函数,分为文件录入,手动录入,并且录入后自动保存到文件
* 输入参数:航班号,飞机号,终点站,飞行日期,座位数,余票数
* 输出参数:无
************************************/
void lurugongneng(Linklist *&L)
{
int n;
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t==>1. 通过文件录入 ==\n");
printf("\t==>2. 通过手动输入 ==\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t请选择:");
scanf("%d",&n);
printf("\n");
switch(n)
{
case 1:
Read(L);
break;
case 2:
lurugongneng1(L);
break;
default :
break;
}
}
void lurugongneng1(Linklist *&L)//初始化的单链表*********************************************************录入功能
{
Linklist *p,*r;
LinkQuNode *q;
p=(Linklist *)malloc(sizeof(Linklist));
printf("\t请依次输入下面几项内容:\n\n");//这里的输入采用一个个单独输入,避免了乱赋值的现象
printf("航班号\n");
gets(p->hangbanhao);//这里的二个gets主要是因为在回车键的输入,其中的第一个是来接收上次的回车
gets(p->hangbanhao);
printf("飞机号\n");
printf("终点站\n");
gets(p->feijihao);
gets(p->zhongdianzhan);
printf("飞行日期\n");
scanf("%d",&p->feixingriqi);
printf("座位数\n");
scanf("%d",&p->chenkerenshu);
printf("余票数\n");
scanf("%d",&p->yupiao);//录入内容
p->yiding=(Link *)malloc(sizeof(Link));
p->yiding->next1=NULL;
initqueue(q);
p->yudingqueue1=q->front;
p->yudingqueue2=q->rear;
if(L->next==NULL)
{
r=L;
r->next=p;
r=p;
}
else
{
r=L;
while(r->next!=NULL)
{
r=r->next;
}
r->next=p;
r=p;
}
r->next=NULL;//尾插法插入
Write(L);
}
#include
#include
#include
#include
#include
#include
#include "head.h"
/************************************
* 功能描述:查询航班信息函数,分为终点站查询,航班号查询
* 输入参数:1或2
* 输出参数:无
************************************/
void chaxungongneng(Linklist *&L)//******************************************************************查询功能
{
int n;
printf("\t 查 找 航 线 信 息 \n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t==>1. 通过目的地查询 ==\n");
printf("\t==>2. 通过航班号查询 ==\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t请选择:");
scanf("%d",&n);
printf("\n");
switch(n)
{
case 1:
mddchaxun(L);
break;
case 2:
hbhchaxun(L);
break;
default :
break;
}
}
/************************************
* 功能描述:查询航班信息函数,分为终点站查询,航班号查询
* 输入参数:终点站
* 输出参数:无
************************************/
void mddchaxun(Linklist *&L)//通过目的地查询
{
char c[15];
int m;
Linklist *p=L;
printf("\t请输入要查询的目的地:");
gets(c);
gets(c);//原因同上
do
{
p=p->next;
if(p)
{
m=strcmpi((*p).zhongdianzhan,c);//如果==的话则m=0;
if(m==0)
{
printf("\t航班信息:\n");
printf("\t航班号:%s\n",p->hangbanhao);
printf("\t飞机号:%s\n",p->feijihao);
printf("\t飞行时间:周%d\n",p->feixingriqi);
printf("\t余票量:%d\n",p->yupiao);
}
}
else
{
//如果不匹配的话就做
printf("\t对不起没有你要找的目的地:\n\n");
m=0;
}
}
while(m!=0);
}
/************************************
* 功能描述:查询航班信息函数,分为终点站查询,航班号查询
* 输入参数:航班号
* 输出参数:无
************************************/
void hbhchaxun(Linklist *&L)//通过航班号查询
{
char c[15];
int m;
Linklist *p=L;
printf("\t请输入要查询的航班号:");
gets(c);
gets(c);
printf("\n");
do
{
p=p->next;
if(p)
{
m=strcmpi((*p).hangbanhao,c);//如果==的话则m=0;这里的(*p).与p->的作用是一样的
if(m==0)
{
printf("\t航班信息:\n");
printf("\t航班号:%s\n",p->hangbanhao);
printf("\t飞机号:%s\n",p->feijihao);
printf("\t飞行时间:周%d\n",p->feixingriqi);
printf("\t余票量:%d\n\n",p->yupiao);
}
}
else
{
//如果不匹配的话就做
printf("\t对不起没有你要找的航班号:\n");
m=0;
}
}
while(m!=0);
}
#include
#include
#include
#include
#include
#include
#include
#include "head.h"
#include "graph.h"
/************************************
* 功能描述:订票功能函数,先为乘客展示航班线路图和最优路径,再提供购票服务
,若余票不足,可以为客户预订,并将其排到链队中。
* 输入参数:无
* 输出参数:无
************************************/
void dingpiaogongneng(Linklist *&L)//订票功能
{
MGraph g1;
int A[5][5]=
{
{0,2,INF,1,4},
{INF,0,3,INF,3},
{INF,INF,0,INF,INF},
{INF,INF,INF,0,INF},
{INF,INF,INF,INF,0}
};
ArrayToMat(A[0], 5, g1); //
printf("这里是烟台航空,下面展示飞行路线图:\n");
printf("0:烟台-----2h--------1:北京-------3h--------2:上海\n");
printf("0:烟台-----2h--------1:北京-------3h--------4:广东\n");
printf("0:烟台-----4h--------4:广东\n");
printf("0:烟台-----1h--------3:南京\n");
printf("输出抵达最快路径:\n");
Dijkstra(g1,0);
char c[15];
int m=1,piao,n;
gets(c);
printf("请输入终点站名:");
gets(c);
printf("\n");
Linklist *p;
p=L->next;
do //查找一下,是否有这个航班
{
if(!p)
{
printf("对不起,没有你要找的航班:\n\n");
return ;
}
m=strcmpi(p->zhongdianzhan,c);
if(m==0)
{
printf("航班信息:\n");
printf("航班号:%s\n",p->hangbanhao);
printf("飞机号:%s\n",p->feijihao);
printf("飞行时间:周%d\n",p->feixingriqi);
printf("余票量:%d\n",p->yupiao);
}
else
p=p->next;
}
while(m!=0); //当m=0,即匹配到了航班,退出。
if(m==0)//航班被找到
{
do
{
printf("\n请输入你要订的票数:");
scanf("%d",&piao);
if(piao<=p->yupiao) //可以订票
{
Link *h,*s;//要插入节点和尾节点 ,航班的节点就是它的头结点
h=(Link*)malloc(sizeof(Link));
printf("请输入你的名字:");
gets(h->name);
gets(h->name);
h->dingpiaoshu=piao;
p->yupiao=p->yupiao-piao;
printf("订票成功!!!\n");
if(p->yiding->next1==NULL)//尾插法插入
{
s=p->yiding;
s->next1=h;
s=h;
}
else
{
s=p->yiding;
while(s->next1!=NULL)
{
s=s->next1;
}
s->next1=h;
s=h;
}
s->next1=NULL;
m=2;
}
else
{
printf("余票量:%d\n",p->yupiao);
printf("对不起,余票 %d 张不足,不能完成订票\n\n",p->yupiao);
printf(" 是否要重新订票?\n");
printf("需要请输入1 否则请按2 预订请输入3 : ");
scanf("%d",&m);
printf("\n");
}
if(m==2) return ;
}
while(m==1); //此为do,while()循环,当m=1的时候,再订票一遍,m=2退出,m=3进入loop3;
}
if(p->yudingqueue1==NULL) printf("没有人预订票,是否要预订?\n");
else if(p->yudingqueue1!=NULL) printf("已有人预订票,是否要预订?\n");
printf("预订请输入1 否则输入2 : ");
scanf("%d",&n);
printf("\n");
if(n==1)
{
Qptr *z;//创建新节点
z=(Qptr *)malloc(sizeof(Qptr));
printf("请输入你的姓名");
gets(z->name);
gets(z->name);
printf("请输入订票数");
scanf("%d",&z->yudingpiao);
z->next2=NULL;
if(p->yudingqueue1==NULL)//若队链为空
{
p->yudingqueue1=p->yudingqueue2=z;
}
else //队链不为空
{
p->yudingqueue2->next2=z;
p->yudingqueue2=z;
}
printf(" 你预订成功!!!\n");
}
}
#include
#include
#include
#include
#include
#include
#include
#include "head.h"
/************************************
* 功能描述:退票功能函数,完成信息匹配即可退票,并且自动将预定(链队)客户插入到已定客户节点中
* 输入参数:无
* 输出参数:无
************************************/
void tuipiaogongneng(Linklist *&L)//***************************************************************退票功能
{
Linklist *p;
Yidingkehu *h,*h2,*h3;
char c[15],name1[15];
int m=1,piao,n;//
gets(c);
printf("请输入航班号:");
gets(c);
p=L;
do //使用do while来查找是否有此航班
{
if(!p) //如果到了表尾并且没有匹配
{
printf("\n对不起,没有你要找的航班:\n");
return ;
}
m=strcmpi(p->hangbanhao,c);//如果匹配的话,m=0
if(m==0)
{
printf("\t航班信息:\n");
printf("航班号:%s\n",p->hangbanhao);
printf("飞机号:%s\n",p->feijihao);
printf("飞行时间:周%d\n",p->feixingriqi);
printf("余票量:%d\n",p->yupiao);
}
else p=p->next;
}
while(m!=0);
if(m==0)
{
//如果找到了,就来给他退票
do
{
h=p->yiding;
printf("请输入你的姓名:");
gets(name1);//gets(name1);
printf("请输入你订的票数:");
scanf("%d",&piao);
printf("\n");
while((strcmpi(h->next1->name,name1)!=0&&h->next1->dingpiaoshu!=piao)&&h!=NULL)
{
h=h->next1;
}
if(strcmpi(h->next1->name,name1)==0&&h->next1->dingpiaoshu==piao)//如果名字和订的票数相等,则就给他取消订票
{
p->yupiao+=h->next1->dingpiaoshu;
h2=h->next1;
h->next1=h2->next1;
free(h2);
printf("你取消订票成功:\n\n");
}
else//如果没有找到,即系统中没有该人的信息,提示是否来重新查找
{
printf("对不起,该航班没有人订票或者是你没有订该航班的票\n");
printf("是否要重新查找并取消订票?\n");
printf("需要请输入1 否则请按2 ");
scanf("%d",&m);
printf("\n");
}
Qptr *q3;
if(p->yudingqueue1==NULL)
{
printf("没有人预订票:\n"); //没人预订就返回
return ;
}
if((p->yupiao)>=(p->yudingqueue1->yudingpiao)) //票数足够
{
h2=(Link*)malloc(sizeof(Link));//先将第一个预定的节点内容复制给h2
strcpy(h2->name,p->yudingqueue1->name);
h2->dingpiaoshu=p->yudingqueue1->yudingpiao;
n=p->yupiao-p->yudingqueue1->yudingpiao;
p->yupiao=n;
//接下来把这个节点出队
q3=p->yudingqueue1;//P3指向首节点原来指向的位置
if(p->yudingqueue1==p->yudingqueue2)
p->yudingqueue1=p->yudingqueue2=NULL;
else
p->yudingqueue1=p->yudingqueue1->next2;
free(q3);//释放空间
//printf("链队中删除成功\n");
if(p->yiding->next1==NULL)
{
h3=p->yiding;
h3->next1=h2;
h3=h2;
}
else
{
h3=p->yiding;
while(h3->next1!=NULL)
{
h3=h3->next1;
}
h3->next1=h2;
h3=h2;
}
h2->next1=NULL;//尾插法插入
printf("为预订的客户订票成功\n");
}
else printf("余票数不够,不能为预订客户订票!\n");
}
while(m==1);
}
}
#include
#include
#include "graph.h"
#include
#include
using namespace std;
//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
// n - 矩阵的阶数
// g - 要构造出来的邻接矩阵数据结构
void ArrayToMat(int *Arr, int n, MGraph &g)
{
int i,j,count=0; //count用于统计边数,即矩阵中非0元素个数
g.n=n;
for (i=0; i
#include
#include
#include
#include "head.h"
/************************************
* 功能描述:初始化单链表
* 输入参数:无
* 输出参数:无
************************************/
void InitLinklist(Linklist *&L)//单链表的初始化,创建头指针
{
L=(Linklist *)malloc(sizeof(Linklist));
L->next=NULL;
}
/************************************
* 功能描述:初始化单链队
* 输入参数:无
* 输出参数:无
************************************/
void initqueue(LinkQuNode *&q)//初始化单链队
{
q=(LinkQuNode *)malloc(sizeof(LinkQuNode));
q->front=q->rear=NULL;
}
main函数:
#include
using namespace std;
#include
#include
#include
#include
#include "head.h"
/***********************************
* 功能描述:主函数,初始化了航班信息的链表,调用菜单函数
* 输入参数:无
* 输出参数:无
************************************/
int main()
{
Linklist *L;
InitLinklist(L);
menu(L);
return 0;
}
1:初始界面
3:查询功能
4:订票功能
5:预定功能
6:退票功能
7:最短路径提示功能
8:退出系统