main.cpp
/***********************************************************
*版权所有(C)2017
*
*文件名称:main.cpp
*文件标识:无
*内容摘要:主函数文件
*其它说明:无
*当前版本:V1.5
*作者:王万兴
*完成日期:2017,12,22
***********************************************************/
#include <iostream>
#include "win.h"
#include "graph.h"
#include "clinklist.h"
#include "message.h"
using namespace std;
int main()//主函数,初始化链表和图,进入交互界面函数
{
CLinkList *s1,*s2,*s3;
MGraph g;
seat(s1);
seat(s2);
seat(s3);
airport(g);
display(s1,s2,s3,g);
return 0;
}
各类头文件
graph.h
/***********************************************************
*版权所有(C)2017
*
*文件名称:graph.h
*文件标识:无
*内容摘要:图算法库头文件
*其它说明:无
*当前版本:V1.5
*作者:王万兴
*完成日期:2017,12,22
***********************************************************/
#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED
#include <iostream>
#include "stdio.h"
#define MAXV 100 //最大顶点个数
#define INF 32767 //INF表示∞
typedef int InfoType;
//以下定义邻接矩阵类型
typedef struct
{
std::string no,city; //顶点编号
InfoType info; //顶点其他信息,在此存放带权图权值
} airplane; //顶点类型
typedef struct //图的定义
{
int edges[MAXV][MAXV]; //邻接矩阵
int n,e; //顶点数,弧数
airplane plane[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 Ppath(int path[],int i,int v);
void Dispath(int dist[],int path[],int s[],int n,int v);
void Floyd(MGraph g,int b);
#endif // GRAPH_H_INCLUDED
win.h
/***********************************************************
*版权所有(C)2017
*
*文件名称:win.h
*文件标识:无
*内容摘要:win窗口头文件
*其它说明:无
*当前版本:V1.5
*作者:王万兴
*完成日期:2017,12,22
***********************************************************/
#ifndef WIN_H_INCLUDED
#define WIN_H_INCLUDED
#include "clinklist.h"
#include "graph.h"
void display(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g);
void check(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g,int b);
void display2(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g,int id);
void display3(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g);
#endif // WIN_H_INCLUDED
message.h
/***********************************************************
*版权所有(C)2017
*
*文件名称:message.h
*文件标识:无
*内容摘要:message头文件
*其它说明:无
*当前版本:V1.5
*作者:王万兴
*完成日期:2017,12,22
***********************************************************/
#ifndef MESSAGE_H_INCLUDED
#define MESSAGE_H_INCLUDED
#include "clinklist.h"
#include "graph.h"
void seat(CLinkList *&seat);
void airport(MGraph &g);
void buy_tickets(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g);
void check(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g,int b);
void change_tick(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g);
void tuipiao(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g);
void chaxun(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g);
#endif // MESSAGE_H_INCLUDED
clinklist.h
/***********************************************************
*版权所有(C)2017
*
*文件名称:clinklist.h
*文件标识:无
*内容摘要:链表算法库头文件
*其它说明:无
*当前版本:V1.5
*作者:王万兴
*完成日期:2017,12,22
***********************************************************/
#ifndef CLINKLIST_H_INCLUDED
#define CLINKLIST_H_INCLUDED
#include <string>
//循环单链表基本运算函数
typedef struct LNode //定义单链表结点类型
{
int seat;
std::string person;
int ID[10];
struct LNode *next;
} CLinkList;
void CreateListF(CLinkList *&L,int a,std::string b,int c);//头插法建立循环单链表
void CreateListR(CLinkList *&L,int a,std::string b,int c);//尾插法建立循环单链表
void InitList(CLinkList *&L); //初始化链表
void DestroyList(CLinkList *&L); //销毁链表
bool ListEmpty(CLinkList *L); //判断链表是否为空
int ListLength(CLinkList *L); //求链表长度
void DispList(CLinkList *L); //输出链表
bool GetElem(CLinkList *L,int i,int &e,std::string &f,int &g); //取链表元素
int LocateElem(CLinkList *L,int &e); //查找元素
bool ListInsert(CLinkList *&L,int i,int &e,std::string &f,int &g,int l); //插入节点
bool ListDelete(CLinkList *&L,int i,int &e,std::string &f,int &g); //删除节点
void delet(CLinkList *&L,int &g); //删除节点
#endif // CLINKLIST_H_INCLUDED
各类函数文件
win.cpp
/***********************************************************
*版权所有(C)2017
*
*文件名称:win.cpp
*文件标识:无
*内容摘要:窗口函数文件
*其它说明:无
*当前版本:V1.5
*作者:王万兴
*完成日期:2017,12,22
***********************************************************/
#include <iostream>
#include "win.h"
#include "message.h"
#include <stdio.h>
#include <iomanip>
#include <fstream>
#include <string>
#include <string.h>
#include <conio.h>
#include <malloc.h>
using namespace std;
/************************************
* 功能描述:功能选择输入判断
* 输入参数:选择a
* 输出参数:无
* 备注信息:无
*************************************/
template<class T>//模板
T fun(T x)
{
if(x!=2)
throw x;
else
return x;
}
/************************************
* 功能描述:主界面1
* 输入参数:三个链表头指针L1,L2,L3,图g
* 输出参数:
* 备注信息:界面,提供功能选项
*************************************/
void display(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g)
{
system("cls");
cout<<endl;
cout<<" ** ** ********* ** ** *** "<<endl;
cout<<" ** ** ********* ** ** ** ** "<<endl;
cout<<" ** ** ** ** ** ** ** "<<endl;
cout<<" ** ** ** ** ** ** ** "<<endl;
cout<<" ********* ********* ** ** ** ** "<<endl;
cout<<" ********* ********* ** ** ** ** "<<endl;
cout<<" ** ** ** ** ** ** ** "<<endl;
cout<<" ** ** ** ** ** ** ** "<<endl;
cout<<" ** ** ********* ********* ********* ** ** "<<endl;
cout<<" ** ** ********* ********* ********* *** "<<endl;
cout<<endl;
cout<<" **************************************"<<endl;
cout<<" * *"<<endl;
cout<<" * 欢迎进入航班信息查询及购票系统 *"<<endl;
cout<<" * *"<<endl;
cout<<" **************************************"<<endl;
cout<<endl<<endl;
cout<<" 1 查询航班"<<endl<<endl;
cout<<" 2 查询已购"<<endl<<endl;
cout<<" 3 购票"<<endl<<endl;
cout<<" 4 改签"<<endl<<endl;
cout<<" 5 退票"<<endl<<endl;
cout<<" 6 退出"<<endl<<endl;
int a=0;
cout<<" 请输入数字:";
cin>>a;
while(a<1||a>5)
{
try
{
fun(a);
}
catch(...)
{
cout<<" 输入错误,请重新输入:";
}
cin>>a;
}
switch(a)
{
case 1:
display3(L1,L2,L3,g);
break;
case 2:chaxun(L1,L2,L3,g);
break;
case 3:buy_tickets(L1,L2,L3,g);
break;
case 4: change_tick(L1,L2,L3,g);
break;
case 5:tuipiao(L1,L2,L3,g);
break;
case 6:
exit(0);
}
}
/************************************
* 功能描述:购票界面
* 输入参数:三个链表头指针L1,L2,L3,图g,目的地id
* 输出参数:无
* 备注信息:购票界面,转购票函数,
*************************************/
void display2(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g,int id)
{
cout<<" **************************************"<<endl;
cout<<" * *"<<endl;
cout<<" * 欢迎进入购票系统 *"<<endl;
cout<<" * *"<<endl;
cout<<" **************************************"<<endl;
cout<<endl<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cout<<" 请选择目的地"<<endl;
cout<<" 1上海 2杭州 3海南 4武汉"<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cin>>id;
while(!cin)
{
cout<<" 输入错误,请重新输入:"<<endl;
cin.sync();
cin.clear();
cin>>id;
}
if(id<1 || id>4)
{
cout<<" 目的地无法到达,请重新输入"<<endl;
cin>>id;
}
else
{
switch(id)
{
case 1:
case 2:
break;
case 3:
case 4:
cout<<" 无法直达,需换乘"<<endl;
check(L1,L2,L3,g,id);
break;
}
}
}
/************************************
* 功能描述:查询界面
* 输入参数:三个链表头指针L1,L2,L3,图g
* 输出参数:无
* 备注信息:转查询函数
*************************************/
void display3(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g)
{
int id;
cout<<" **************************************"<<endl;
cout<<" * *"<<endl;
cout<<" * 欢迎进入查询系统 *"<<endl;
cout<<" * *"<<endl;
cout<<" **************************************"<<endl;
cout<<endl<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cout<<" 请选择目的地"<<endl;
cout<<" 1上海 2杭州 3海南 4武汉"<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cin>>id;
while(!cin)
{
cout<<" 输入错误,请重新输入:"<<endl;
cin.sync();
cin.clear();
cin>>id;
}
if(id<1 || id>4)
{
cout<<" 目的地无法到达,请重新输入"<<endl;
cin>>id;
}
else
{
switch(id)
{
case 1:
case 2:
buy_tickets(L1,L2,L3,g);
break;
case 3:
case 4:
cout<<" 无法直达,需换乘"<<endl;
check(L1,L2,L3,g,id);
break;
}
}
}
graph.cpp
/***********************************************************
*版权所有(C)2017
*
*文件名称:graph.cpp
*文件标识:无
*内容摘要:图算法库,建立图用
*其它说明:无
*当前版本:V1.5
*作者:王万兴
*完成日期:2017,12,22
***********************************************************/
#include <stdio.h>
#include <malloc.h>
#include "graph.h"
#include <iomanip>
#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
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<g.n; i++)
{
for (j=0; j<g.n; j++)
{
g.edges[i][j]=Arr[i*n+j]; //将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j],计算存储位置的功夫在此应用
if(g.edges[i][j]!=0 && g.edges[i][j]!=INF)
count++;
}
}
g.e=count;
}
void ArrayToList(int *Arr, int n, ALGraph *&G)
{
int i,j,count=0; //count用于统计边数,即矩阵中非0元素个数
ArcNode *p;
G=(ALGraph *)malloc(sizeof(ALGraph));
G->n=n;
for (i=0; i<n; i++) //给邻接表中所有头节点的指针域置初值
G->adjlist[i].firstarc=NULL;
for (i=0; i<n; i++) //检查邻接矩阵中每个元素
for (j=n-1; j>=0; j--)
if (Arr[i*n+j]!=0) //存在一条边,将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j]
{
p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个节点*p
p->adjvex=j;
p->info=Arr[i*n+j];
p->nextarc=G->adjlist[i].firstarc; //采用头插法插入*p
G->adjlist[i].firstarc=p;
}
G->e=count;
}
void MatToList(MGraph g, ALGraph *&G)
//将邻接矩阵g转换成邻接表G
{
int i,j;
ArcNode *p;
G=(ALGraph *)malloc(sizeof(ALGraph));
for (i=0; i<g.n; i++) //给邻接表中所有头节点的指针域置初值
G->adjlist[i].firstarc=NULL;
for (i=0; i<g.n; i++) //检查邻接矩阵中每个元素
for (j=g.n-1; j>=0; j--)
if (g.edges[i][j]!=0) //存在一条边
{
p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个节点*p
p->adjvex=j;
p->info=g.edges[i][j];
p->nextarc=G->adjlist[i].firstarc; //采用头插法插入*p
G->adjlist[i].firstarc=p;
}
G->n=g.n;
G->e=g.e;
}
void ListToMat(ALGraph *G,MGraph &g)
//将邻接表G转换成邻接矩阵g
{
int i,j;
ArcNode *p;
g.n=G->n; //根据一楼同学“举报”改的。g.n未赋值,下面的初始化不起作用
g.e=G->e;
for (i=0; i<g.n; i++) //先初始化邻接矩阵
for (j=0; j<g.n; j++)
g.edges[i][j]=0;
for (i=0; i<G->n; i++) //根据邻接表,为邻接矩阵赋值
{
p=G->adjlist[i].firstarc;
while (p!=NULL)
{
g.edges[i][p->adjvex]=p->info;
p=p->nextarc;
}
}
}
void Ppath(int path[][MAXV],int i,int j) //前向递归查找路径上的顶点
{
int k;
k=path[i][j];
if (k==-1) return; //找到了起点则返回
Ppath(path,i,k); //找顶点i的前一个顶点k
printf("%d,",k);
Ppath(path,k,j); //找顶点k的前一个顶点j
}
void Dispath(int A[][MAXV],int path[][MAXV],int n)
{
int i,j;
for (i=0; i<n; i++)
for (j=0; j<n ; j++)
{
if (A[i][j]==INF)
{
if (i!=j)
printf("从%d到%d没有路径\n",i,j);
}
else
{
printf(" 从%d到%d=>路径长度:%d 路径:",i,j,A[i][j]);
printf("%d,",i); //输出路径上的起点
Ppath(path,i,j); //输出路径上的中间点
printf("%d\n",j); //输出路径上的终点
}
}
}
void Floyd(MGraph g,int b)
{
int A[MAXV][MAXV],path[MAXV][MAXV];
int i,j,k;
for (i=0; i<g.n; i++)
for (j=0; j<g.n; j++)
{
A[i][j]=g.edges[i][j];
path[i][j]=-1;
}
for (k=0; k<g.n; k++)
{
for (i=0; i<g.n; i++)
for (j=0; j<g.n; j++)
if (A[i][j]>A[i][k]+A[k][j])
{
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k;
}
}
int apath[MAXV],d;
if(A[0][b]<INF&&b!=0)
{
cout<<"\n*从烟台"<<" 到 "<<g.plane[b].city<<" 的最短路径为:";
k=path[0][b];
d=0;
apath[d]=b;
while(k!=-1&&k!=0)
{
d++;
apath[d]=k;
k=path[0][k];
}
d++;
apath[d]=0;
//cout<<1;
//cout<<2;
for(int s=d-1;s>=0;s--)
{
cout<<" --> "<<g.plane[apath[s]].city;
// cout<<','<<apath[s];
}
cout<<" ,最短时间为:"<<A[0][b]<<"小时"<<endl;
}
else if(0==b)
cout<<"\n*目的地输入不合法!\n";
else
cout<<"\n*不能到达该目的地\n";
}
void DispAdj(ALGraph *G)
//输出邻接表G
{
int i;
ArcNode *p;
for (i=0; i<G->n; i++)
{
p=G->adjlist[i].firstarc;
printf("%3d: ",i);
while (p!=NULL)
{
printf("-->%d/%d ",p->adjvex,p->info);
p=p->nextarc;
}
printf("\n");
}
}
clinklist.h
/***********************************************************
*版权所有(C)2017
*
*文件名称:message.cpp
*文件标识:无
*内容摘要:,链表算法库,建立链表用
*其它说明:无
*当前版本:V1.5
*作者:王万兴
*完成日期:2017,12,22
***********************************************************/
//循环单链表基本运算函数
#include <stdio.h>
#include <malloc.h>
#include <iostream>
#include "clinklist.h"
using namespace std;
void CreateListF(CLinkList *&L,int a,std::string b,int c)//头插法建立循环单链表
{
CLinkList *s;
L=(CLinkList *)malloc(sizeof(CLinkList)); //创建头结点
L->next=NULL;
//for (i=0; i<n; i++)
{
s=(CLinkList *)malloc(sizeof(CLinkList));//创建新结点
s->seat=a;
s->person=b;
s->ID[0]=c;
s->next=L->next; //将*s插在原开始结点之前,头结点之后
L->next=s;
}
s=L->next;
while (s->next!=NULL) //查找尾结点,由s指向它
s=s->next;
s->next=L; //尾结点next域指向头结点
}
void CreateListR(CLinkList *&L,int a,std::string b,int c)//尾插法建立循环单链表
{
CLinkList *s,*r;
L=(CLinkList *)malloc(sizeof(CLinkList)); //创建头结点
L->next=NULL;
r=L; //r始终指向终端结点,开始时指向头结点
//for (i=0; i<n; i++)
{
s=(CLinkList *)malloc(sizeof(CLinkList));//创建新结点
s->seat=a;
s->person=b;
s->ID[0]=c;
r->next=s; //将*s插入*r之后
r=s;
}
r->next=L; //尾结点next域指向头结点
}
void InitList(CLinkList *&L) //初始化链表
{
L=(CLinkList *)malloc(sizeof(CLinkList)); //创建头结点
L->next=L;
}
void DestroyList(CLinkList *&L) //销毁链表
{
CLinkList *p=L,*q=p->next;
while (q!=L)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
bool ListEmpty(CLinkList *L) //判断链表是否为空
{
return(L->next==L);
}
int ListLength(CLinkList *L) //求链表长度
{
CLinkList *p=L;
int i=0;
while (p->next!=L)
{
i++;
p=p->next;
}
return(i);
}
void DispList(CLinkList *L) //输出链表
{
CLinkList *p=L->next;
while (p!=L)
{
printf("%d ",p->seat);
//printf("%s ",p->person);
cout<<p->person;
printf(" %d ",p->ID[0]);
p=p->next;
}
printf("\n");
}
bool GetElem(CLinkList *L,int i,int &e,std::string &f,int &g) //取链表元素
{
int j=0;
CLinkList *p;
if (L->next!=L) //单链表不为空表时
{
if (i==1)
{
e=L->next->seat;
f=L->next->person;
g=L->next->ID[0];
return true;
}
else //i不为1时
{
p=L->next;
while (j<i-1 && p!=L)
{
j++;
p=p->next;
}
if (p==L)
return false;
else
{
e=L->next->seat;
f=L->next->person;
g=L->next->ID[0];
return true;
}
}
}
else //单链表为空表时
return false;
}
int LocateElem(CLinkList *L,int &e) //查找元素
{
CLinkList *p=L->next;
int n=1;
while (p!=L && p->ID[0]!=e)
{
p=p->next;
n++;
}
if (p==L)
return(0);
else
return(n);
}
bool ListInsert(CLinkList *&L,int i,int &e,std::string &f,int &g,int l) //插入节点
{
int j=0;
CLinkList *p=L,*s;
if (p->next==L || i==1) //原单链表为空表或i==1时
{
s=(CLinkList *)malloc(sizeof(CLinkList)); //创建新结点*s
s->seat=l;
s->person=f;
s->ID[0]=g;
s->next=p->next; //将*s插入到*p之后
p->next=s;
return true;
}
else
{
p=L->next;
while (j<i-2 && p!=L)
{
j++;
p=p->next;
}
if (p==L) //未找到第i-1个结点
return false;
else //找到第i-1个结点*p
{
s=(CLinkList *)malloc(sizeof(CLinkList)); //创建新结点*s
s->seat=l;
s->person=f;
s->ID[0]=g;
s->next=p->next; //将*s插入到*p之后
p->next=s;
return true;
}
}
}
bool ListDelete(CLinkList *&L,int i,int &e,std::string &f,int &g) //删除节点
{
int j=0;
CLinkList *p=L,*q;
if (p->next!=L) //原单链表不为空表时
{
if (i==1) //i==1时
{
q=L->next; //删除第1个结点
L->seat=e;
L->person=f;
L->ID[0]=g;
L->next=q->next;
free(q);
return true;
}
else //i不为1时
{
p=L->next;
while (j<i-2 && p!=L)
{
j++;
p=p->next;
}
if (p==L) //未找到第i-1个结点
return false;
else //找到第i-1个结点*p
{
q=p->next; //q指向要删除的结点
e=q->seat;
f=q->person;
g=q->ID[0];
p->next=q->next; //从单链表中删除*q结点
free(q); //释放*q结点
return true;
}
}
}
else
return 0;
}
void delet(CLinkList *&L,int &g)//退票功能
{
CLinkList *p=L->next,*q=L;
while (p!=L && p->ID[0]!=g)
{
q=p;
p=p->next;
}
q->next=p->next; //从单链表中删除p结点
free(p);
}
check.h
/***********************************************************
*版权所有(C)2017
*
*文件名称:check.cpp
*文件标识:无
*内容摘要:查询路径
*其它说明:无
*当前版本:V1.5
*作者:王万兴
*完成日期:2017,12,22
***********************************************************/
#include <iostream>
#include "win.h"
#include "graph.h"
#include <stdio.h>
#include <iomanip>
#include <fstream>
#include <string>
#include <string.h>
#include <conio.h>
#include "message.h"
#include "windows.h"
using namespace std;
/************************************
* 功能描述:查询路径
* 输入参数:三个链表头指针L1,L2,L3,图g,目的地b
* 输出参数:无
* 备注信息:查询最短路径和时间,转入购票
*************************************/
void check(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g,int b)
{
cout<<" 正在寻找最快换乘方案..."<<endl;
Sleep(2000);
cout<<" 已找到最快换乘方案!"<<endl;
Floyd(g,b);
cout<<" 是否购票?(y/n)"<<endl<<" ";
char a;
while(1)
{
cin>>a;
if (a=='y'||a=='Y')
buy_tickets(L1,L2,L3,g);
else if (a=='n'||a=='N')
display(L1,L2,L3,g);
else
cout<<" 请重新输入"<<endl<<" ";
continue;
}
}
/***********************************************************
*版权所有(C)2017
*
*文件名称:message.cpp
*文件标识:无
*内容摘要:存储结构初始化,订票,改签,退票,查询
*其它说明:无
*当前版本:V1.5
*作者:王万兴
*完成日期:2017,12,22
***********************************************************/
#include "clinklist.h"
#include "win.h"
#include "graph.h"
#include "stdio.h"
#include "message.h"
#include <malloc.h>
#include <iomanip>
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
using namespace std;
/************************************
* 功能描述:链表初始化
* 输入参数:链表头指针
* 输出参数:无
* 备注信息:尾插法创建链表
*************************************/
void seat(CLinkList *&seat)
{
int a=0,c=0;
string b;
InitList(seat);
CreateListR(seat,a,b,c);
//ElemType a2;
// string a1;
//ifstream infile("plane.txt",ios::binary);
// while(infile.good())
//{
// infile>>a1>>a2;
//addElem(seat,a1,a2);
//}
}
/************************************
* 功能描述:图初始化
* 输入参数:图g
* 输出参数:无
* 备注信息:关系矩阵
*************************************/
void airport(MGraph &g)
{
int i;
int a[5][5]={
{0,2,3,INF,INF},
{INF,0,2,5,INF},
{INF,INF,0,3,1},
{INF,INF,INF,0,2},
{INF,INF,INF,INF,0}
};
ArrayToMat(a[0], 5, g);
ifstream infile("plane.txt",ios::binary);
while(infile.good())
{
infile>>g.plane[i].city;
i++;
}
infile.close();
}
/************************************
* 功能描述:购票
* 输入参数:三个链表头指针L1,L2,L3,图g
* 输出参数:无
* 备注信息:输入对错判断,乘客信息录入链表,转入查询
*************************************/
void buy_tickets(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g)
{
int id,l1,l2,l3;
cout<<" **************************************"<<endl;
cout<<" * *"<<endl;
cout<<" * 欢迎进入购票系统 *"<<endl;
cout<<" * *"<<endl;
cout<<" **************************************"<<endl;
cout<<endl<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cout<<" 请选择目的地"<<endl;
cout<<" 1上海 2杭州 3海南 4武汉"<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cin>>id;
while(!cin)
{
cout<<" 输入错误,请重新输入:"<<endl;
cin.sync();
cin.clear();
cin>>id;
}
while(1)
{
if(id<1 || id>4)
{
cout<<" 目的地无法到达,请重新输入"<<endl;
cin>>id;
}
else
{
switch(id)
{
case 1:
case 2:
break;
case 3:
case 4:
cout<<" 无法直达,需换乘"<<endl;
check(L1,L2,L3,g,id);
break;
}
break;
}
}
int k;
int z;
string y;
cout<<" 请填写以下信息 "<<endl;
cout<<" 姓名 身份证号 "<<endl<<" ";
cin>>y>>z;
if(id==1)
{
CLinkList *p=L1;
while (p->next!=L1)
{
p=p->next;
}
if(p->seat==3)
{
cout<<" 本次航班座位已售完,请改乘其他航班"<<endl;
buy_tickets(L1,L2,L3,g);
}
else
{
l1=ListLength(L1);
ListInsert(L1,l1,id,y,z,l1);
p->seat=p->seat+1;
}
}
else if(id==2)
{
CLinkList *q=L2;
while (q->next!=L2)
{
q=q->next;
}
if(q->seat==3)
{
cout<<" 本次航班座位已售完,请改乘其他航班"<<endl;
buy_tickets(L1,L2,L3,g);
}
else
{
l2=ListLength(L2);
ListInsert(L2,l2,id,y,z,l2);
q->seat=q->seat+1;
}
}
else if(id==3)
{
CLinkList *s=L3;
while (s->next!=L3)
{
s=s->next;
}
if(s->seat==3)
{
cout<<" 本次航班座位已售完,请改乘其他航班"<<endl;
buy_tickets(L1,L2,L3,g);
}
else
{
l3=ListLength(L3);
ListInsert(L3,l3,id,y,z,l3);
s->seat=s->seat+1;
}
}
//system("cls");//清屏
string hb,cd;
if (id==1)
{hb="c1231";cd="烟台—上海";}
else if (id==2)
{hb="a1453";cd="烟台—杭州";}
else if (id==3)
{hb="b1356";cd="杭州—海南";}
cout<<" \n";
cout<<" \n";
cout<<" \n";
cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n";
cout<<"┃ ┃\n";
cout<<"┃ XX航空公司 ┃\n";
cout<<"┃ 航班 姓名 身份证号 目的地 ┃\n";
cout<<"┃ ┃\n";
cout<<"┃ "<<hb<<" "<<y<<" "<<z<<" "<<cd<<" ┃\n";
cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n";
cout<<" \n";
cout<<" 继续购票请按1 返回主菜单请按0 \n";
cin>>k;
if(k==1)
{
buy_tickets(L1,L2,L3,g);//继续买票
}
else if (k==0)
{
display(L1,L2,L3,g);
}
//B[id].type=1;
}
/************************************
* 功能描述:链表内查询
* 输入参数:链表头指针L,乘客ID e
* 输出参数:返回1或0
* 备注信息:
*************************************/
int chaxun2(CLinkList *&L,int &e)
{
CLinkList *p=L->next;
int n=1;
while (p!=L && p->ID[0]!=e)
{
p=p->next;
n++;
}
if(p->ID[0]==e)
{
cout<<" "<<p->person<<" "<<e;
return 1;
}
else
return 0;
}
/************************************
* 功能描述:改签
* 输入参数:三个链表头指针L1,L2,L3,图g
* 输出参数:无
* 备注信息:包含退票和转入购票功能
*************************************/
void change_tick(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g)
{
int id,a,b,c,d;
string y;
//CLinkList *L;
//InitList(L);
cout<<" 请填写以下信息 "<<endl;
cout<<" 姓名 身份证号 "<<endl<<" ";
//scanf("%d %s %d",&x,y,&z);
cin>>y>>id;
while(!cin)
{
cout<<" 输入错误,请重新输入:"<<endl;
cin.sync();
cin.clear();
cin>>y>>id;
}
b=chaxun2(L1,id);
c=chaxun2(L2,id);
d=chaxun2(L3,id);
if((b+c+d)==0)
{
cout<<" 未查询到关于您的订票信息"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);
display(L1,L2,L3,g);
}
cout<<" 选择要换退的航班号:"<<endl;
cout<<" 1.c1231 2.a1453 3.b1356"<<endl;
cin>>a;
if(a<1 || a>3)
{
cout<<"航班不存在,请重新输入"<<endl;
cin>>a;
}
while(!cin)
{
cout<<"输入错误,请重新输入:"<<endl;
cin.sync();
cin.clear();
cin>>id;
}
switch(a)
{
case 1:
{
delet(L1,id);//删除
}
break;
case 2:
{
delet(L2,id);//删除
}
break;
case 3:
{
delet(L3,id);//删除
}
break;
}
buy_tickets(L1,L2,L3,g);
}
/***********************************
* 功能描述:查询购票
* 输入参数:三个链表头指针L1,L2,L3,图g
* 输出参数:无
* 备注信息:根据乘客ID查询是否购票
*************************************/
void chaxun(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g)
{
int id,b=0,c=0,d=0;//b=0作为while循环的条件
cout<<" 请输入您的身份证号"<<endl<<" ";
cin>>id;
while(!cin)
{
cout<<" 输入错误,请重新输入:"<<endl;
cin.sync();
cin.clear();
cin>>id;
}
cout<<" 姓名 身份证号 航班"<<endl<<" ";
b=chaxun2(L1,id);
if(b==1)
{
cout<<" c1231"<<endl;
}
c=chaxun2(L2,id);
if(c==1)
{
cout<<" a1453"<<endl;
}
d=chaxun2(L3,id);
if(d==1)
{
cout<<" b1356"<<endl;
}
if((b+c+d)==0)
{
cout<<" 未查询到关于您的订票信息"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
display(L1,L2,L3,g);
}
else
{
cout<<" 查询完成 "<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
display(L1,L2,L3,g);
}
}
/************************************
* 功能描述:退票
* 输入参数:三个链表头指针L1,L2,L3,图g
* 输出参数:无
* 备注信息:删除节点,判断输入
*************************************/
void tuipiao(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g)
{
int id,a,b;
string name;
cout<<" 请输入您的身份证号、退订的航班号和姓名"<<endl;
cin>>id>>a>>name;
if(a<1 || a>3)
{
cout<<" 航号不存在,请重新输入"<<endl;
cin>>a;
}
while(!cin)
{
cout<<" 输入错误,请重新输入:"<<endl;
cin.sync();
cin.clear();
cin>>id;
}
switch(a)
{
case 1:
{
b=chaxun2(L1,id);
if(b==0)
{
cout<<" 未查询到关于您的订票信息"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
display(L1,L2,L3,g);
}
else
{
delet(L1,id);//删除
cout<<" 已成功将您的订票删除"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
display(L1,L2,L3,g);
}
break;
}
case 2:
{
b=chaxun2(L2,id);
if(b==0)
{
cout<<" 未查询到关于您的订票信息"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
display(L1,L2,L3,g);
}
else
{
delet(L2,id);//删除
cout<<" 已成功将您的订票删除"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);
display(L1,L2,L3,g);
}
break;
}
case 3:
{
b=chaxun2(L3,id);
if(b==0)
{
cout<<" 未查询到关于您的订票信息"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);
display(L1,L2,L3,g);
}
else
{
delet(L3,id);//删除
cout<<" 已成功将您的订票删除"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);
display(L1,L2,L3,g);
}
break;
}
}
}