航空客运订票系统
本次课程设计做的航空客运订票系统,主要用到了,线性表、链表、图的存储结构,本次课程设计仍然使用多文件组织工程,点击此处参考(编码工具:code::blocks 12.04)
工程文件视角图如下:
实现源代码如下:
1.mainFram.h
//*Copyright (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :mainFram.h*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:定义界面实现的部分宏定义、要实现算法的函数的声明*
//*输入描述:无*
//*程序输出:无*
#ifndef MAINFRAM_H_INCLUDED
#define MAINFRAM_H_INCLUDED
#define flight_max 5//最大航班数
struct passanager //乘客信息结构体
{
char name[10];//名字
char id[20];//身份证号
float money; //资产
int ifstu; //是否学生认证
char airnum[10]; //航班号
int sex; //性别,男1女0
char phone[15]; //预留手机号
};
typedef struct passanager pass;
struct airplane//航班信息
{
char num[10]; //航班号
float price; //票价
float discount; //折扣
char start[10]; //起始地
char arrive[10]; //目的地
int count; //余票数
int min,sec; //时间
};
typedef struct airplane air;
int setdiscount(air *a); //设定折扣函数,只需要传递air指针即可,包含这些函数的模块只能对航班操作
void disairline(air *a);//显示航班信息,顺序结构,顾客用
bool stu_confrim(pass *p); //学生认证函数,传递pass指针,只需对乘客操作
#endif // MAINFRAM_H_INCLUDED
2.mainFram.cpp
//*Copyright (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :mainFrame.h*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:界面实现函数以及各模块功能的实现函数代码*
//*输入描述:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
//*程序输出:各模块实现功能*
#include "mainFram.h"
#include "linklist.h"
#include
#include
#include
#include
#include
#include
#include
#include "graph.h"
using namespace std;
/***********************************************************
* 功能描述:主函数
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数:无
* 返回值 :无
* 其他说明:入口函数
************************************************************/
void mainFram(DLinkList *L,pass *p,air *a,ALGraph *&G)
{
system("cls");//清屏
system("color 9f");//改变界面颜色,管理颜色为红色背景,普通服务为蓝色背景
cout<>n;
switch(n)
{
case 1:
mainFram_pa(L,p,a,G);//调用用户服务认证界面
break;
case 2:
if(rootlog(L,p,a,G)) //由函数返回的布尔值继续进行
{
getch();
mainFram_ma(L,p,a,G); //登录成功之后,进入管理主界面
}
else
{
cout<<"密码或用户名不对!登陆失败"<>pa1.id;
i1=LocateElem(L,1,pa1);
if(i1!=0)
{
cout<<"已确认身份合法,请输入您的姓名完成身份鉴定。"<>name1;
int j=0;
DLinkList *c=L;
while (jnext;
}
strcpy(pa1.name,c->data.name);
if(!strcmp(name1,pa1.name))
{
pass *wo;
wo=&c->data;
cout<<"鉴定成功,您的信息如下:"<>me;
switch(me)
{
case 0:
break;
case 1:
system("cls");
if(!purtic(p,a))//根据返回的布尔值进行下列程序
{
cout<<"购买失败,给自己节省点时间吧,看看别的航班,请不要购买没有余票的航班!"<ifstu=1;
cout<<"认证成功,您在购买机票的时候将享受半价优惠。\n";
getch();
mainFram_pa_su(L,p,a,G);
}
else
{
cout<<"您所在的大学不存在或者未与我方合作,认证失败!\n";
getch();
mainFram_pa_su(L,p,a,G);
}
break;
}
}
/***********************************************************
* 功能描述:学生认证函数
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 认证界面
* 返回值 :认证结果
* 其他说明:使用文件输入流
************************************************************/
bool stu_confrim(pass *p)//学生认证函数
{
ifstream infile;
infile.open("G://大学.txt"); //此处文件保存学校信息,只有在文件中的学校才能获得认证资格
if(!infile) cout<<"error"<>input;
while(infile.getline(school,sizeof(school))) //以循环的方式
{
if(!strcasecmp(school,input))
return true;
}
return false;
}
bool purtic(pass *p,air *a)//购票函数
{
system("cls");
int i;
cout<num<<" "<<(a+i-1)->start<<"-->"<<(a+i-1)->arrive<<" 票数剩余:"<<(a+i-1)->count<price<>i;
if(i==0)
{
return true;
}
if((a+i-1)->count!=0)
{
float in;//purchase sucess
if((strcmp(p->airnum,"无"))!=0)//判断该用户是否已经购买机票
{
cout<<"您已经买过票了,给别人个机会吧,有钱也不要任性啊!"<ifstu==1)//判断是否是在校学生
{
cout<<"您是在校学生,享有半价优惠。"<money-(a+i-1)->price*0.5;
if(in<0)//确保不赊账
{
cout<<"大哥,没钱就别出来混了,快去充点钱吧,要不连家都回不去了。\n";
return false;
}
in=p->money;
cout<<"购买成功,账单明细:";
p->money=p->money-(a+i-1)->price*0.5;
strcpy(p->airnum,(a+i-1)->num);
printf("\n您购票前账户余额:%0.2f\n您花费的金额为:%0.2f\n您当前余额为:%0.2f\n",in,(a+i-1)->price,p->money);
cout<<"Press any key to continue..."<count--;
getch();
return true;
}
in=p->money-(a+i-1)->price;
if(in<0)
{
cout<<"大哥,没钱就别出来混了,快去充点钱吧,要不连家都回不去了。\n";
return false;
}
in=p->money;
cout<<"购买成功,账单明细:";
p->money=(p->money-(a+i-1)->price);
strcpy(p->airnum,(a+i-1)->num);
printf("\n您购票前账户余额:%0.2f\n您花费的金额为:%0.2f\n您当前余额为:%0.2f\n",in,(a+i-1)->price,p->money);
cout<<"Press any key to continue..."<count--;
getch();
return true;
}
else
return false;
}
/*g管理界面系统*/
/***********************************************************
* 功能描述:管理系统主界面
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 主界面
* 返回值 :无
* 其他说明:管理员入口函数
************************************************************/
void mainFram_ma(DLinkList *&L,pass *p,air *a,ALGraph *&G)//管理界面
{
system("cls");//清屏
system("color 4f");//改变界面颜色
cout<>m;
switch(m)
{
case 1:
chapass(L,p,a,G); //更改用户信息
break;
case 2:
float pr;
pr=setdiscount(a);//设置折扣
if(pr!=0)
{
cout<<"打折之后的票价为:"<num,(a+i)->price,(a+i)->discount,(a+i)->start,(a+i)->arrive,(a+i)->min,(a+i)->sec,(a+i)->count);
}
printf("\nPress any key to continue...");
}
/* 用户信息管理界面 */
/***********************************************************
* 功能描述:用户信息更改实现界面
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 选择功能
* 返回值 :无
* 其他说明:更改信息,实现增删改查
************************************************************/
void chapass(DLinkList *L,pass *p,air *a,ALGraph *&G)//更改顾客信息
{
system("cls");//清屏
cout<>m;
switch(m)
{
case 1:
system("cls");//清屏
DispList(L);
getch();
chapass(L,p,a,G);
break;
case 2:
system("cls");
int i;
cout<<"请输入您要插入的位置:"<>i;
pass e;
if(ListInsert(L,i,e))
cout<<"信息添加成功,请按任意键返回。。。"<>mode; //此处的mode变量为模式,将模式的值传递给LocateElem函数,进行相应的操作
if(mode==1)
{
cout<<"请输入您要删除用户的身份证号:"<>e1.id;
i1=LocateElem(L,mode,e1); //查找一个节点
if(i1!=0)
{
if(ListDelete(L,i1,e1)) //删除一个节点
{
cout<<"删除该用户信息成功!按任意键退回。。。"<>e1.phone;
i1=LocateElem(L,mode,e1); //查找一个节点
if(i1!=0)
{
if(ListDelete(L,i1,e1)) //删除一个节点
{
cout<<"删除该用户信息成功!按任意键退回。。。"<>e3.id;
i3=LocateElem(L,1,e3);
if(i3!=0)
{
cout<<"查找成功,可以进行修改操作,请谨慎进行!"<>mode2;
cout<>e2.id;
i2=LocateElem(L,mode2,e2);
if(i2!=0)
{
cout<<"查找成功!以下是身份证为"<>e2.phone;
i2=LocateElem(L,mode2,e2);
if(i2!=0)
{
cout<<"查找成功!以下是手机号为"<>hang;
for(i=0;inum),hang))
{
cout<<"请输入您要设置的优惠:"<>dis;
(a+i)->discount=dis;
cout<<"设置成功。"<price=(a+i)->price*(a+i)->discount;
getch();
return (a+i)->price;
}
}
cout<<"没有该航班。"<>me5;
switch(me5)
{
case 0:
break;
case 1:
chairline(a,L,G);
getch();
break;
case 2:
DispAdj(G);
getch();
break;
default:
cout<<"您的指令有误,请重新输入。"<>me4;
switch(me4)
{
case 0:
break;
case 1:
system("cls");
if(chline(a,L,G))
cout<<"修改成功!按任意键继续!"<>hangn;
int i;
ArcNode *p; //创建节点
for (i=0; in; i++) //用循环进行遍历
{
p=G->adjlist[i].firstarc;
while (p!=NULL)
{
if(!strcmp(G->adjlist[i].data.num,hangn))
{
char nnum[10];
cout<<"请输入新的航班号:"<>nnum;
strcpy(G->adjlist[i].data.num,nnum);
strcpy(a[i].num,nnum);
cout<<"修改成功!";
return true;
}
p=p->nextarc;
}
}
return false;
}
/*变更航班票数函数*/
/***********************************************************
* 功能描述:放票收票函数
* 输入参数:air型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 实现界面
* 返回值 :实现结果
* 其他说明:
************************************************************/
bool chticcount(air *a,struct DNode *L,ALGraph *&G)
{
system("cls");
cout<>hangn;
int i;
ArcNode *p;
for (i=0; in; i++)
{
p=G->adjlist[i].firstarc;//给p初始值
while (p!=NULL)
{
if(!strcmp(G->adjlist[i].data.num,hangn))
{
int ncount;
cout<<"请选择模式:1.放票 2.收票"<adjlist[i].data.count<>sel;
if(sel==1)
{
cout<<"请输入放票数量:"<>sel;
ncount=G->adjlist[i].data.count+sel; //条件判断值
if(ncount>60)
{
cout<<"大哥,飞机不是货车,哪有那么多票啊!"<adjlist[i].data.count=ncount;//同步图结构的值与线性表中的一致!!!!重要
a[i].count=ncount;
cout<<"放票成功!"<>sel;
ncount=G->adjlist[i].data.count-sel;
if(ncount<0)
{
cout<<"大哥,票都收没了,别收了!"<adjlist[i].data.count=ncount;
a[i].count=ncount;
cout<<"收票成功!"<nextarc;
}
}
return false;
}
/*管理员登录函数*/
/***********************************************************
* 功能描述:管理员登录
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 认证界面
* 返回值 :无
* 其他说明:管理员入口函数
************************************************************/
bool rootlog(struct DNode *L,pass *p,air *a,ALGraph *&G)
{
system("cls");
char username[10]="root";
char password[10]="123456";
char username1[10];
char password1[10];
cout<>username1;
cout<>password1;
if((!strcmp(username1,username))&& (!strcmp(password1,password))) //匹配固定密码
{
cout<<"登录成功!"<
3.linklist.h
//*Copyright (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :linklist.h*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:定义双链表数据结构的代码、宏定义、要实现算法的函数的声明*
//*输入描述:无*
//*程序输出:无*
#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED
#include "mainFram.h"
#include "graph.h"
typedef struct passanager NewType;
typedef struct DNode //定义双链表结点类型
{
NewType data;
struct DNode *prior; //指向前驱结点
struct DNode *next; //指向后继结点
} DLinkList;
void CreateListF(DLinkList *&L,NewType a[],int n);//头插法建双链表
void CreateListR(DLinkList *&L,NewType a[],int n);//尾插法建双链表
void InitList(DLinkList *&L); //初始化双链表
void DestroyList(DLinkList *&L); //销毁双链表
bool ListEmpty(DLinkList *L); //判断链表是否为空
int ListLength(DLinkList *L); //求链表的长度
void DispList(DLinkList *L); //输出链表
bool GetElem(DLinkList *L,int i,NewType &e); //获取节点的值,并按要求输出输出
int LocateElem(DLinkList *L,int mode,NewType e); //查找一个节点
bool ListInsert(DLinkList *&L,int i,NewType e) ;//插入一个节点
bool ListDelete(DLinkList *&L,int i,NewType &e); //删除一个节点
#endif // LINKLIST_H_INCLUDED
4.linklist.cpp
//*Copyright (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :linklist.cpp*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:双链表数据结构的函数实现代码*
//*输入描述:Dlinklist型指针以及air、pass型指针*
//*程序输出:无*
#include
#include
#include
#include
#include "linklist.h"
#include
using namespace std;
/***********************************************************
* 功能描述:头插法创建双链表
* 输入参数:Dlinklist 型引用指针,NewType 型数组首地址,插入数量
* 输出参数: 创建结果
* 返回值 :无
* 其他说明:无
************************************************************/
void CreateListF(DLinkList *&L,NewType a[],int n)
//头插法建双链表
{
DLinkList *s;
int i;
L=(DLinkList *)malloc(sizeof(DLinkList)); //创建头结点
L->prior=L->next=NULL;
for (i=0; idata=a[i];
s->next=L->next; //将*s插在原开始结点之前,头结点之后
if (L->next!=NULL) L->next->prior=s;
L->next=s;
s->prior=L;
}
}
/***********************************************************
* 功能描述:尾插法创建双链表
* 输入参数:Dlinklist 型引用指针,NewType 型数组首地址,插入数量
* 输出参数: 创建结果
* 返回值 :无
* 其他说明:无
************************************************************/
void CreateListR(DLinkList *&L,NewType a[],int n)
//尾插法建双链表
{
DLinkList *s,*r;
int i;
L=(DLinkList *)malloc(sizeof(DLinkList)); //创建头结点
L->prior=L->next=NULL;
r=L; //r始终指向终端结点,开始时指向头结点
for (i=0; idata=a[i];
r->next=s;
s->prior=r; //将*s插入*r之后
r=s;
}
r->next=NULL; //终端结点next域置为NULL
}
/***********************************************************
* 功能描述:插入链表
* 输入参数:Dlinklist 型引用指针
* 输出参数:Dlinklist 型指针引用
* 返回值 :无
* 其他说明:无
************************************************************/
void InitList(DLinkList *&L)
{
L=(DLinkList *)malloc(sizeof(DLinkList)); //创建头结点
L->prior=L->next=NULL;
}
/***********************************************************
* 功能描述:销毁链表
* 输入参数:Dlinklist 型引用指针
* 输出参数:Dlinklist 型指针引用
* 返回值 :无
* 其他说明:无
************************************************************/
void DestroyList(DLinkList *&L)
{
DLinkList *p=L,*q=p->next;
while (q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
/***********************************************************
* 功能描述:判断链表是否为空
* 输入参数:Dlinklist 型指针
* 输出参数:
* 返回值 :bool型变量表示结果
* 其他说明:无
************************************************************/
bool ListEmpty(DLinkList *L)
{
return(L->next==NULL);
}
/***********************************************************
* 功能描述:求链表长度
* 输入参数:Dlinklist 型指针
* 输出参数:长度
* 返回值 :int整形长度信息
* 其他说明:无
************************************************************/
int ListLength(DLinkList *L)
{
DLinkList *p=L;
int i=0;
while (p->next!=NULL)
{
i++;
p=p->next;
}
return(i);
}
/***********************************************************
* 功能描述:按格式显示链表内容
* 输入参数:Dlinklist 型指针
* 输出参数:显示列表
* 返回值 :无
* 其他说明:无
************************************************************/
void DispList(DLinkList *L)
{
DLinkList *p=L->next;
cout<<"|姓名\t| | 身份证号 | |性别| | 电话号码 | |航班号\t| |学生认证| |用户资产|";//按格式输出
while (p!=NULL)
{
printf("\n");
printf("%-10s",p->data.name);
printf(" %-20s",p->data.id);
if(p->data.sex==1)
cout<<" 男\t";
else
cout<<" 女\t";
printf("%-11s",p->data.phone);
printf(" %-12s",p->data.airnum);
if(p->data.ifstu==1)
cout<<" 是";
else
cout<<" 否";
printf(" %0.2f",p->data.money);//p->data.display(); //一定要回头改,将全局变量问题解决之后
p=p->next;
}
printf("\n信息显示完毕,请按任意键继续。。。\n");
getch();
}
/***********************************************************
* 功能描述:获取节点值
* 输入参数:Dlinklist 型指针,位置,NewType型引用结构体
* 输出参数:无
* 返回值 :bool型结果
* 其他说明:无
************************************************************/
bool GetElem(DLinkList *L,int i,NewType &e)
{
int j=0;
DLinkList *p=L;
while (jnext;
}
if (p==NULL)
return false;
else
{
e=p->data;
return true;
}
}
/***********************************************************
* 功能描述:获取用户位置
* 输入参数:Dlinklist 型引用指针,模式,NewType 型
* 输出参数:Dlinklist 型指针引用
* 返回值 :int型位置
* 其他说明:无
************************************************************/
int LocateElem(DLinkList *L,int mode,NewType e)
{
int n=1;
DLinkList *p=L->next;
if(mode==1)
{
while (p!=NULL && (strcmp(p->data.id,e.id)))
{
n++;
p=p->next;
}
if (p==NULL)
return(0);
else
return(n);
}
else if(mode==2)
{
while (p!=NULL && (strcmp(p->data.phone,e.phone)))
{
n++;
p=p->next;
}
if (p==NULL)
return(0);
else
return(n);
}
else
{
cout<<"您输入的模式有误,不能完成您的要求。。。"<>e.name;
cout<<"请输入该用户的身份证号:"<>e.id;
cout<<"请输入该用户的缴存金额:"<>e.money;
cout<<"请输入该用户的性别(男为1,女为0):"<>e.sex;
cout<<"请输入该用户的预留手机号:"<>e.phone;
strcpy(e.airnum,"无");
e.ifstu=0;
int j=0;
DLinkList *p=L,*s;
while (jnext;
}
if (p==NULL) //未找到第i-1个结点
return false;
else //找到第i-1个结点*p
{
s=(DLinkList *)malloc(sizeof(DLinkList)); //创建新结点*s
s->data=e;
s->next=p->next; //将*s插入到*p之后
if (p->next!=NULL) p->next->prior=s;
s->prior=p;
p->next=s;
return true;
}
}
/***********************************************************
* 功能描述:删除用户实现
* 输入参数:Dlinklist 型引用指针 int型位置 NewType临时
* 输出参数:删除后的链表
* 返回值 :bool型结果
* 其他说明:无
************************************************************/
bool ListDelete(DLinkList *&L,int i,NewType &e)
{
int j=0;
DLinkList *p=L,*q;
while (jnext;
}
if (p==NULL) //未找到第i-1个结点
return false;
else //找到第i-1个结点*p
{
q=p->next; //q指向要删除的结点
if (q==NULL)
return false; //不存在第i个结点
e=q->data;
p->next=q->next; //从单链表中删除*q结点
if (p->next!=NULL) p->next->prior=p;
free(q); //释放*q结点
return true;
}
}
5.graph.h
//*Copyright (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :graph.h*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:定义图数据结构的代码、宏定义、要实现算法的函数的声明*
//*输入描述:无*
//*程序输出:无*
#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED
#define MAXV 5 //最大顶点个数
#define INF 32767 //INF表示∞
#include "mainFram.h"
#include "linklist.h"
//0烟1德2聊3菏
//0-1 0-2 1-3 2-3 3-0
typedef char InfoType;
//以下定义邻接矩阵类型
typedef struct
{
int no; //顶点编号
InfoType info[10]; //顶点其他信息,在此存放带权图权值
} VertexType; //顶点类型
typedef struct //图的定义
{
int edges[MAXV][MAXV]; //邻接矩阵
int n,e; //顶点数,弧数
VertexType vexs[MAXV]; //存放顶点信息
} MGraph; //图的邻接矩阵类型
//以下定义邻接表类型
typedef struct ANode //弧的结点结构类型
{
int adjvex; //该弧的终点位置
struct ANode *nextarc; //指向下一条弧的指针
int info; //该弧的相关信息,这里用于存放权值
} ArcNode;
typedef struct airplane 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 ArrayToList(int *Arr, int n, ALGraph *&,air *&a); //用普通数组构造图的邻接表
void MatToList(MGraph g,ALGraph *&G);//将邻接矩阵g转换成邻接表G
void DispAdj(ALGraph *G);//输出邻接表G
/*航班信息管理函数声明*/
//此处函数传值为airline结构体类型指针,将存放航班信息的头指针传递过来,进而可以实现遍历操作,增删改查
//传值还有DNode型指针,由于使用别名会造成其他头文件无法识别,故此处用前向声明,解决此矛盾,此为顾客链表的头结点
//图结构ALGraph型指针,传递此参数便于对图结构存储的信息进行操作,要注意与airline的数据统一
void maairline(air *a,struct DNode *L,ALGraph *&G);//航班管理界面,界面函数无需返回值
void chairline(air *a,struct DNode *L,ALGraph *&G);//更改航班信息界面
bool chline(air *a,struct DNode *L,ALGraph *&G);//更改航班号实现,返回布尔值判断是否修改成功
bool chticcount(air *a,struct DNode *L,ALGraph *&G);//放票收票实现,返回布尔值判断是否修改成功
/*主界面函数声明*/
//此处函数传值多一个passanager型指针,将乘客的头结点传入可以,对乘客进行修改及其他操作
void mainFram(struct DNode *L,pass *p,air *a,ALGraph *&G); //系统主界面
void mainFram_ma(struct DNode *&L,pass *p,air *a,ALGraph *&G);//管理员管理主界面
void chapass(struct DNode *L,pass *p,air *a,ALGraph *&G); //用户信息管理界面
void mainFram_pa(struct DNode *L,pass *p,air *a,ALGraph *&G);//顾客服务主界面认证
void mainFram_pa_su(struct DNode *L,pass *p,air *a,ALGraph *&G);//顾客服务主界面
bool rootlog(struct DNode *L,pass *p,air *a,ALGraph *&G);//管理员登录函数,此处声明为布尔型,返回登录成功与否的状态
bool purtic(pass *p,air *a); //购票实现,返回布尔型值判断是否购票成功
#endif // GRAPH_H_INCLUDED
6.graph.cpp
//*Copyright (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :graph.cpp*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:定义栈数据结构的代码、宏定义、要实现算法的函数的声明*
//*输入描述:ALgraph型指针*
//*程序输出:各种实现*
#include
#include
#include "graph.h"
#include
using namespace std;
//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
// n - 矩阵的阶数
// g - 要构造出来的邻接矩阵数据结构
/***********************************************************
* 功能描述:数组转邻接表
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 认证界面
* 返回值 :无
* 其他说明:入口函数
************************************************************/
void ArrayToList(int *Arr, int n, ALGraph *&G, air *&a)
{
int i,j,count=0; //count用于统计边数,即矩阵中非0元素个数
ArcNode *p;
G=(ALGraph *)malloc(sizeof(ALGraph));
G->n=n;
for (i=0; iadjlist[i].firstarc=NULL;
for (i=0; i=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->adjlist[i].data=a[i];
}
G->e=count;
}
/***********************************************************
* 功能描述:
* 输入参数:Dlinklist 型引用指针
* 输出参数:Dlinklist 型指针引用
* 返回值 :无
* 其他说明:图算法库
************************************************************/
void DispAdj(ALGraph *G)
//输出邻接表G
{
cout<n; i++)
{
p=G->adjlist[i].firstarc;
printf("%5s: ",G->adjlist[i].data.start);//首先输出起始地点
while (p!=NULL)
{
printf("-->终止地:%s/里程:%dkm/余票:%d/票价:%0.2f ",G->adjlist[i].data.arrive,p->info,G->adjlist[i].data.count,G->adjlist[i].data.price);//按格式输出
p=p->nextarc;//实现循环
}
printf("\n");
}
}
7.main.cpp
//*Copyright (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :main.cpp*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:主函数,用于初始化某些存储结构,并对各个源文件进行传值*
//*输入描述:各类初始数据*
//*程序输出:无*
#include
#include
#include
#include
#include "mainFram.h"
#include "linklist.h"
#include "graph.h"
using namespace std;
/***********************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返回值 :int
* 其他说明:给所有功能实现主界面函数传值,并初始化一些数据
************************************************************/
int main()
{
ALGraph *G;//图结构传值使用该指针,ALGraph型
int gr[4][4]= //此数组存储航班路线信息,弧权值为里程
{
{0,200,300,0},
{0,0,0,50},
{0,0,0,100},
{700,0,0,0}
};
air *conver;//传递航班信息
air a[flight_max]=
{
{"SD001",200,0,"烟台","德州",22,10},//航班信息SD001烟台-->德州,SD002德州-->菏泽,SD003德州-->烟台
{"SD002",200,0,"烟台","聊城",17,55},
{"SD003",200,0,"聊城","菏泽",01,16},
{"SD004",200,0,"德州","菏泽",06,30},
{"SD005",200,0,"菏泽","烟台",02,22},
};//初始化赋值
conver=a;
ArrayToList(gr[0],4,G,conver); //将数组转换为邻接表形式,存储航班路线信息,其顶点信息为航班信息
pass p[5]=
{
{"tch","37256464467464655",300,0,"无",1,"17888888888"},
{"zx","372458199823236636",1000,1,"无",1,"17899999999"},
{"hcj","375864645531154566",600,1,"无",0,"17854545454"},
{"zqb","376545555578951323",500,0,"无",0,"17877777777"},
{"zkw","371165456486453125",1500,1,"无",0,"17892229222"}
};//初始化乘客链表
DLinkList *l;
InitList(l);
CreateListR(l,p,5); //创建双链表
while(1)
mainFram(l,p,a,G);
return 0;
}
运行结果截图如下: