-
2021-05-20 03:19:30
你仔细想想,怎样让两个异地同时输入提交而不出现同号,怎样知道班机已经定满,就差不多了。下面的你就参考下吧#include
#include
#include
#include
#include
#include
#include //overflow
#define ok 1 typedef struct Yidingkehu{//单链表
char name[15];//已订票的客户姓名
int dingpiaoshu;//已订票数量
struct Yidingkehu *next1;//
}Yidingkehu,*Link;typedef struct Weidingkehu{//单链队
char name[15];//预订票的客户姓名
int yudingpiao;// 要订票数量
struct Weidingkehu *next2;//下一个链队结点指针
}Weidingkehu,*Qptr;
typedef struct {
Qptr front;//单链队头结点
Qptr rear;//单链队尾结点
}linkQueue; typedef struct Hangxian{//创建一个含有六个信息的结构体
char hangbanhao[15];//航班号-
char feijihao[15];//飞机号
int feixingriqi;//起飞时间
int chenkerenshu;//座位数
int yupiao;//余票
char zhongdianzhai[15];//降落城市
struct Hangxian *next;//指向下一个链结点的指针
struct Yidingkehu *yiding;//定义一个指向已订票客户的头结点指针
struct Weidingkehu *yudingqueue;
}Hangxian,*Linklist;struct Hangxian *L=NULL;//
struct Yidingkehu *H;//为已订票客户链队来申请空间
linkQueue Q;//linkQueue类型的来申请空间Linklist InitLinklist();//01
int InsertLinklist(Linklist &head1);//02void hbhchaxun();//通过航班号查询
void mddchaxun();//通过目的地查询void lurugongneng();//初始化录入功能
void chaxungongnen();//查询功能
void dingpiaogongnen();//订票功能
void tuipiaogongnen();//退票功能void main()
{
H=(struct Yidingkehu*)malloc(sizeof(Yidingkehu));
Q。
front=Q。rear=(Qptr)malloc(sizeof(Weidingkehu));
InitLinklist();
int n;
do{ //打印主界面
printf(" 欢迎使用航空客运订票系统
");
printf("
");
printf("==>1。
录入功能 ==
");
printf("==>2。 查询功能 ==
");
printf("==>3。 订票功能 ==
");
printf("==>4。
退票功能 ==
");
printf("==>5。 退出 ==
");
printf("
");
printf("请选择:");
scanf("%d",&n);printf("
");
switch(n)
{
case 1: lurugongneng();//录入功能
break;
case 2: chaxungongnen();//查询功能
break;
case 3: dingpiaogongnen();//订票功能
break;
case 4:tuipiaogongnen();//退票功能
break;
default :exit(0);//退出
}
}while(n==1||n==2||n==3||n==4);
}void lurugongneng()//初始化的单链表*********************************************************录入功能
{
int j=1,m;
do{
if(!InsertLinklist((Linklist) L)) //向其中加入航班信息
{
printf("内存已满
"); exit(OVERFLOW);
}//向链表中加一结点
printf("是否要输入下一个航线记录?
");
printf("是请输入1
");
printf("否请输入2
");
scanf("%d",&m); //在这里依靠人来决定是否输入下一条航线记
}while(m==1);
}Linklist InitLinklist(){//01
L=(Linklist)malloc(sizeof(Hangxian));
if(!L) exit(OVERFLOW);
L->next=NULL;//建立一个带有头结点的单链表
return (L);
}int InsertLinklist(Linklist &L)//02向航线链表添加新的结点
{
Linklist p;
//int m,n;
p=(Linklist)malloc(sizeof(Hangxian));//为一个新的结点分配空间
if(!p) exit(OVERFLOW);
printf("请依次输入下面几项内容:
");//这里的输入采用一个个单独输入,避免了乱赋值的现象
printf("航班号
");
gets(p->hangbanhao);//这里的二个gets主要是因为在回车键的输入,其中的第一个是来接收上次的回车
gets(p->hangbanhao);
printf("飞机号
");
gets(p->feijihao);
printf("终点站
");
gets(p->zhongdianzhai);
printf("飞行日期
");
scanf("%d",&p->feixingriqi);
printf("乘客总数
");
scanf("%d",&p->chenkerenshu);
printf("余票数
");
scanf("%d",&p->yupiao);
p->yiding=(struct Yidingkehu*)malloc(sizeof(Yidingkehu));//为它申请空间
p->yudingqueue=Q。
front=Q。rear=(Qptr)malloc(sizeof(Weidingkehu));//为它申请空间
p->next=L->next;//
L->next=p;//这二句是链表中的头插法插入一个结点
return (ok);
}void chaxungongnen()//******************************************************************查询功能
{
int n;
printf(" 查 找 航 线 信 息
");
printf("
");
printf("==>1。
通过目的地查询 ==
");
printf("==>2。 通过航班号查询 ==
");
printf("
");
printf("请选择:");
scanf("%d",&n);
printf("
");//格式化
switch(n)
{
case 1:mddchaxun();
break;
case 2:hbhchaxun();
break;
default :break;
}
}void mddchaxun()//通过目的地查询
{
char c[15];
int m;
Linklist p=L;
printf("请输入要查询的目的地:");
gets(c);
gets(c);//原因同上
do{
p=p->next;
if(p)
{
m=strcmpi((*p)。
zhongdianzhai,c);//如果==的话则m=0;
if(m==0)
{
printf("航班信息:
");
printf("航班号:%s
",p->hangbanhao);
printf("飞机号:%s
",p->feijihao);
printf("飞行时间:周%d
",p->feixingriqi);
printf("余票量:%d
",p->yupiao);
}
}
else
{//如果不匹配的话就做
printf("对不起没有你要找的目的地:
"); m=0;
}
}while(m!=0);
}void hbhchaxun()//通过目的地查询
{
char c[15];
int m;
Linklist p=L;
printf("请输入要查询的航班号:");
gets(c); gets(c);printf("
");
do{
p=p->next;
if(p)
{
m=strcmpi((*p)。
hangbanhao,c);//如果==的话则m=0;这里的(*p)。与p->的作用是一样的
if(m==0)
{
printf("航班信息:
");
printf("航班号:%s
",p->hangbanhao);
printf("飞机号:%s
",p->feijihao);
printf("飞行时间:周%d
",p->feixingriqi);
printf("余票量:%d
",p->yupiao);
}
}
else
{//如果不匹配的话就做
printf("对不起没有你要找的航班号:
"); m=0;
}
}while(m!=0);
}void dingpiaogongnen()//***************************************************************订票功能
{
Linklist p=L;//Linklist类型的L来指向链表头
Yidingkehu *h=H,*h1;//Yidingkehu 定义客户的结点,方便插入与删除
linkQueue q=Q;//linkQueue类型的来 ,方便插入与删除
char c[15];
int m=1,piao,ydpiao=0,yd=0,n;//
gets(c);
printf("请输入终点站名:"); gets(c); printf("
");
p=L->next;
if(p) {
do{//查找一下,是否有这个航班
if(!p)
{
printf("对不起,没有你要找的航班:
");
goto loop1;
}
m=strcmpi(p->zhongdianzhai,c);
if(m==0)
{
printf("航班信息:
");
printf("航班号:%s
",p->hangbanhao);
printf("飞机号:%s
",p->feijihao);
printf("飞行时间:周%d
",p->feixingriqi);
printf("余票量:%d
",p->yupiao);}
else p=p->next;
}while(m!=0);
if(m==0)
{
do{
printf("
请输入你要订的票数:"); scanf("%d",&piao);
if(piaoyupiao)
{
h=p->yiding;
if(h)
{
h1=h;
h=h->next1;
h=(struct Yidingkehu*)malloc(sizeof(Yidingkehu));
printf("请输入你的名字:");
gets(h->name);gets(h->name);
h->dingpiaoshu=piao;
h->next1=h1->next1;
h1->next1=h;
p->yupiao=p->yupiao-piao;
printf("订票成功:
"); m=2;
}
}
else
{ printf("余票量:%d
",p->yupiao);
printf("对不起,余票 %d 张不足,不能完成订票
",p->yupiao);
printf(" 是否要重新订票?
");
printf("需要请输入1 否则请按2 预订请输入3 : ");
scanf("%d",&m);
printf("
");
if(m==3) goto loop3;
}
}while(m==1);
}
}
else if(!p) {
loop3: struct Weidingkehu *q3;
printf("对不起,该航班的票已售完
");
q。
front=p->yudingqueue;
if(q。front==q。rear) printf("没有人预订票,是否要预订?
");
else if(q。front!=q。rear) printf("已有人预订票,是否要预订?
");
printf("预订请输入1 否则输入2 : ");
scanf("%d",&n);
printf("
");
if(n==1)
{
q3=(Qptr)malloc(sizeof(Weidingkehu));
printf("请输入你的姓名"); gets(q3->name); gets(q3->name);//q3不能指向name???
printf("请输入订票数"); scanf("%d",&q3->yudingpiao);
q3->next2=NULL;
q。
rear->next2=q3;
q。rear=q3;
printf(" 你已经预订了 !
");
}
}
loop1:;
}void tuipiaogongnen()//***************************************************************退票功能
{
Linklist p=L;
Yidingkehu *h=H,*h1,*h2;
linkQueue q=Q;
char c[15],name1[15];
int m=1,piao,n;//
gets(c);
printf("请输入航班号:"); gets(c);
p=L;//->next;
if(p)
{
do{ //使用do while来查找是否有此航班
if(!p)
{//如果是到了表尾且没有匹配,goto至再输入航班号
printf("
对不起,没有你要找的航班:
");
goto loop1;
}
m=strcmpi(p->hangbanhao,c);//如果匹配的话,m=0
if(m==0)
{
printf("航班信息:
");
printf("航班号:%s
",p->hangbanhao);
printf("飞机号:%s
",p->feijihao);
printf("飞行时间:周%d
",p->feixingriqi);
printf("余票量:%d
",p->yupiao);}
else p=p->next;
}while(m!=0);
if(m==0)
{//如果找到了,就来给他退票
do{
h=p->yiding;
if(h)
{
printf("请输入你的姓名:");
gets(name1);//gets(name1);
printf("请输入你订的票数:");
scanf("%d",&piao);
printf("
");
h1=h;
h=h->next1;
if(strcmpi(h->name,name1)==0&&h->dingpiaoshu==piao)//如果名字和订的票数相等,则就给他取消订票
{
p->yupiao =h->dingpiaoshu;
h2=h;
h1->next1=h->next1;
free(h2);
printf("你取消订票成功:
");
struct Weidingkehu *q3;
q。
front=p->yudingqueue;
if(q。front==q。rear) {printf("没有人预订票:
"); goto loop1;}
if((p->yupiao)>=(q。
front->next2->yudingpiao))
{
h2=(struct Yidingkehu*)malloc(sizeof(Yidingkehu));
strcpy(h2->name,q。
front->next2->name);
h2->dingpiaoshu=q。front->next2->yudingpiao;
n=p->yupiao-q。front->next2->yudingpiao;
p->yupiao=n;
q3=Q。
front->next2;//
q。front->next2=q3->next2;//这二语句来删除结点
if(q。rear==q3) q。rear=q。
front;
free(q3);//释放空间
printf("链队中删除成功
");
h2->next1=h->next1;
h->next1=h2;//为之插入进已订票客户链表中
printf("为预订的客户订票成功
");
}
else printf("余票数不够,不能为预订客户订票!
");
}
else
{ //如果没有找到,即系统中没有该人的信息,提示是否来重新查找
printf("对不起,该航班没有人订票或者是你没有订该航班的票
");
printf("是否要重新查找并取消订票?
");
printf("需要请输入1 否则请按2 ");
scanf("%d",&m);
printf("
");
}
}
}while(m==1);
}
}
loop1: ;
}。
全部
更多相关内容 -
C语言程序设计 航空客运订票系统
2021-06-03 18:19:32C语言程序设计 航空客运订票系统源代码 -
航空客运订票系统
2018-01-03 19:38:38航空客运订票系统: 航空客运订票的业务活动包括:查询航线、客票预定和办理退票等。 要求:(1)每条航线所涉及的信息有:终点站名、航班号、飞机号、 飞行日期(星期几)、乘员定额、余票量、已经订票的客户名单(包括... -
航空客运订票系统JAVA课程设计
2016-12-29 17:24:20航空客运订票系统 特点:超详细的JAVA代码注释,代码保护性,无论输入什么都不会崩溃; 【问题描述】航空客运订票的业务活动包括:查询航线、添加航班,客票预订和办理退票等七大功能,已实现操作文件。试设计一个... -
C语言:航空客运订票系统的设计(含完整注释)_飞机订票系统设计C语言
2021-01-08 12:12:32航空客运订票系统的业务主要包括:查询航线,客票预订,办理退票等。试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。 (1)每条航线所涉及的信息有:终点站名,航班号,飞机号,飞行周日(星期几),... -
航空客运订票系统.cpp
2020-04-22 16:49:38选做内容:当订票要求不满足时,系统向用户推荐同一目的地的其他航线。 附加功能: 1).用户查询根据航班号和姓名查询订单情况。 2).订票时,可输入航班号或者目的地进行查询。 3).根据用户的不同需求提供不同的舱位... -
数据结构航空客运订票系统代码
2015-11-02 23:01:42该代码为数据结构中航空客运订票系统代码,代码完整且带详细注释 -
数据结构课程设计报告航空客运订票系统.doc
2021-10-20 21:25:44数据结构课程设计报告航空客运订票系统.doc 航空订票系统的业务活动包括:查询航线、客票预定和办理退票等。试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。 -
C++课程设计:航空客运订票系统工程文件
2019-04-07 22:09:51C++课程设计:航空客运订票系统工程文件 基于C++程序设计基础,实现了多级用户管理。乘客用户可以查询航班,根据旅客提出的终点站名输出信息;根据提供的航班号进行购票,可选择购票数,若有余票,则为用户办理订票... -
广工数据结构课程设计实验-航空客运订票系统(代码+实验报告+运行程序)
2016-09-07 18:05:36试设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。 [基本要求] (1) 每条航线所涉及的信息有:终点站名、航班号、飞机号、飞行周日(星期几)、乘员定额、余票量、已订票的客户名单(包括姓名、订票量、... -
航空客运订票系统 航空客运订票系统
2011-02-23 13:20:07航空客运订票系统 课程设计 源代码 文档 -
数据结构课程设计——客运订票系统
2021-12-20 22:59:09数据结构课程设计——客运订票系统 -
c语言实现航空客运订票系统
2011-07-04 14:03:28包含查询航线,删除和添加航线信息,订票,退票,登记等功能,是数据结构课设题目 -
数据结构课程设计航空客运订票系统
2017-01-01 23:37:28数据结构课程设计航空客运订票系统 -
航空客运订票系统航空客运订票系统航空客运订票系统
2009-12-06 14:23:06航空客运订票系统航空客运订票系统航空客运订票系统航空客运订票系统航空客运订票系统航空客运订票系统航空客运订票系统 -
C++数据结构 航空客运订票系统
2020-07-26 20:25:18航空客运订票系统 问题描述:业务主要包括查询航线和客票预订的信息、客票预订和办理 退票等。 基本要求: 系统必须能存储以下数据信息: 航班信息:飞机抵达城市、航班号、飞机号、起降时间、票价、总 座位...航空客运订票系统
问题描述:业务主要包括查询航线和客票预订的信息、客票预订和办理
退票等。
基本要求:- 系统必须能存储以下数据信息:
航班信息:飞机抵达城市、航班号、飞机号、起降时间、票价、总
座位数和剩余座位数、已订票的客户名单。
客户信息:客户姓名、证件号、座位号。 - 系统能实现的功能:
承办订票业务:根据客户提出的要求查询该航班信息,若满足要求,
则为客户办理订票手续,输出座位号。
退票业务:根据客户提供的航班号和订票数量办理退票手续。
查询功能:查询航线信息(根据飞机的降落地点输出航班号、飞机
好、起降时间、票价和剩余座位数)和客户预订信息(根据客户证件
号输出航班号、飞机号和座位号) - 采用链式存储结构
#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
etails/78864499
#include “mainFram.h”
#include “linklist.h”
#include <malloc.h>
#include
#include
#include <conio.h>
#include <string.h>
#include
#include <stdlib.h>
#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<<endl<<endl;
cout<<" ** * ** ****** * **** **** * * ******"<<endl;
cout<<" ** *** ** * * * * * * * * * * “<<endl;
cout<<” ** ** ** ** ***** * * * * * * * * ***** “<<endl;
cout<<” ** ** ** ** * * * * * * * * * * “<<endl;
cout<<” *** *** * * * * * * * * * * “<<endl;
cout<<” * * ****** ****** **** **** * * * ******"<<endl;
cout<<endl<<endl<<endl;
cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Synthetic System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;
cout<<endl;
cout<<" ┏━━━━━━━━━━━━━┓\n";
cout<<" ┃ 航空客运订票综合系统 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃1.用户服务系统 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃2.管理员管理系统 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃3.关于我们 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃0.退出 ┃\n";
cout<<" ┗━━━━━━━━━━━━━┛\n";
cout<<“请输入数字实现功能:”<<endl;
int n;
cin>>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<<“密码或用户名不对!登陆失败”<<endl;
getch();
}
break;
case 3:
system(“cls”);//清屏
cout<<endl<<endl<<endl;
cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Synthetic System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;//我的信息
cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ 航空客运订票综合系统 ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;
cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆版本号:V1.0 联系邮箱:153199613@qq.com☆☆☆☆☆☆☆☆☆☆☆"<<endl;
cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ 烟台大学计算机与控制工程学院 ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;
getch();break;
default:
break;
}
}
/*********************************************************** -
功能描述:用户服务系统主界面
-
输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
-
输出参数: 认证界面
-
返回值 :无
-
其他说明:入口函数
************************************************************/
void mainFram_pa(DLinkList *L,pass *p,air *a,ALGraph *&G)
{
int i1;//此变量用于存储LocateElem返回的值,判断认证顾客在链表中的位置
pass pa1;//用于传递参数
char name1[10];
system(“cls”);
cout<<“请输入您的身份证号来验证身份:”<<endl;
cin>>pa1.id;
i1=LocateElem(L,1,pa1);
if(i1!=0)
{
cout<<“已确认身份合法,请输入您的姓名完成身份鉴定。”<<endl<<“请输入您的用户名:”<<endl;
cin>>name1;
int j=0;
DLinkList *c=L;
while (j<i1)
{
j++;
c=c->next;
}
strcpy(pa1.name,c->data.name);
if(!strcmp(name1,pa1.name))
{
pass *wo;
wo=&c->data;
cout<<“鉴定成功,您的信息如下:”<<endl;
mainFram_pa_su(L,wo,a,G);//compare success
}
else
{
cout<<“鉴定故障,原因可能是您输入的用户名与您的身份证号不匹配。\nPress any key to continue…”<<endl;
getch();
mainFram(L,p,a,G);
}
}
else
{
cout<<“该身份证号不存在,您的信息没有在数据库中,如有需要请联系管理员及时添加。”<<endl;
cout<<“Press any key to continue…”<<endl;
getch();
mainFram(L,p,a,G);
}
}
/***********************************************************-
功能描述:用户服务系统主界面1
-
输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
-
输出参数: 用户服务主界面
-
返回值 :无
-
其他说明:用户服务入口窗口
************************************************************/
void mainFram_pa_su(DLinkList *L,pass *p, air *a,ALGraph *&G)//认证之后的p指针是认证时的顾客,这样进行操作时,就会有目的进行修改
{
system(“cls”);//清屏
system(“color 9f”);//改变界面颜色
cout<<endl<<endl;
cout<<" ** * ** ****** * **** **** * * ******"<<endl;
cout<<" ** *** ** * * * * * * * * * * “<<endl;
cout<<” ** ** ** ** ***** * * * * * * * * ***** “<<endl;
cout<<” ** ** ** ** * * * * * * * * * * “<<endl;
cout<<” *** *** * * * * * * * * * * “<<endl;
cout<<” * * ****** ****** **** **** * * * ******"<<endl;
cout<<endl<<endl<<endl;
cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Servervice System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;
cout<<endl;
cout<<" ┏━━━━━━━━━━━━━┓\n";
cout<<" ┃ 欢迎使用航空客运订票系统 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃1.购买机票 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃2.查询航班信息 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃3.学生认证 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃0.退出 ┃\n";
cout<<" ┗━━━━━━━━━━━━━┛\n";
cout<<“请输入数字实现功能:”<<endl;
int me;
cin>>me;
switch(me)
{
case 0:
break;
case 1:
system(“cls”);
if(!purtic(p,a))//根据返回的布尔值进行下列程序
{
cout<<“购买失败,给自己节省点时间吧,看看别的航班,请不要购买没有余票的航班!”<<endl;
getch();
purtic(p,a);
}
mainFram_pa_su(L,p,a,G);
break;
case 2:
system(“cls”);
cout<<endl<<endl;
cout<<"\t\t"<<“航班信息表”<<endl;
disairline(a);
getch();
mainFram_pa_su(L,p,a,G);
break;
case 3:
if(stu_confrim§)//此处进行学生认证
{
p->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”<<endl; //文件读入数据操作
char school[20];
char input[20];
cout<<“请输入您所在的大学:”<<endl;
cin>>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<<endl<<endl;
cout<<"#####欢迎来到购票系统#####"<<endl;
cout<<“请您选择购票的航班”<<endl;
for(i=1;i<=flight_max;i++)
{
cout<<i<<"."<<(a+i-1)->num<<" “<<(a+i-1)->start<<”–>"<<(a+i-1)->arrive<<" 票数剩余:"<<(a+i-1)->count<<endl;
cout<<“单价:”<<(a+i-1)->price<<endl;
}
cout<<“输入0取消购买。”<<endl;
cin>>i;
if(i0)
{
return true;
}
if((a+i-1)->count!=0)
{
float in;//purchase sucess
if((strcmp(p->airnum,“无”))!=0)//判断该用户是否已经购买机票
{
cout<<“您已经买过票了,给别人个机会吧,有钱也不要任性啊!”<<endl;
return false;
}
if(p->ifstu1)//判断是否是在校学生
{cout<<"您是在校学生,享有半价优惠。"<<endl; in=p->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..."<<endl; (a+i-1)->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..."<<endl; (a+i-1)->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<<endl<<endl;
cout<<" ** * ** ****** * **** **** * * ******"<<endl;
cout<<" ** *** ** * * * * * * * * * * “<<endl;
cout<<” ** ** ** ** ***** * * * * * * * * ***** “<<endl;
cout<<” ** ** ** ** * * * * * * * * * * “<<endl;
cout<<” *** *** * * * * * * * * * * “<<endl;
cout<<” * * ****** ****** **** **** * * * ******"<<endl;
cout<<endl<<endl<<endl;
cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Reservation System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;
cout<<endl;
cout<<" ┏━━━━━━━━━━━━━┓\n";
cout<<" ┃ 航空订票服务高级管理系统 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃1.用户信息管理 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃2.设置票价优惠 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃3.管理航班信息 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃0.退出 ┃\n";
cout<<" ┗━━━━━━━━━━━━━┛\n";
cout<<“请输入数字实现功能:”<<endl;
int m;
cin>>m;
switch(m)
{
case 1:
chapass(L,p,a,G); //更改用户信息
break;
case 2:
float pr;
pr=setdiscount(a);//设置折扣
if(pr!=0)
{
cout<<“打折之后的票价为:”<<endl;
cout<<pr<<endl;
cout<<endl<<endl<<“Press any key to continue…”<<endl;
}
else
{
cout<<“设置失败!”<<endl;
}
getch();
mainFram_ma(L,p,a,G);
break;
case 3:
maairline(a,L,G);//管理航班信息
mainFram_ma(L,p,a,G);
break;
case 0:
break;
default:
cout<<“您的输入有误,系统无法提供服务,按任意键返回。”<<endl;
mainFram_ma(L,p,a,G);
}
}
/***********************************************************-
功能描述:查看航班信息
-
输入参数:air型指针
-
输出参数: 航班的详细信息
-
返回值 :无
-
其他说明:入口函数
**/
void disairline(air a) //用户查看航班信息,表格形式,顺序结构
{
int i;
printf("|航班号| | 票价 | |折扣| |起始地| |目的地| | 发车时间 | |余票|\n");
for(i=0;i<flight_max;i++)
{
printf("|%-6s| |%-6.2f| |%-4.2f| |%-6s| |%-6s| | %-2d : %-2d | |%-4d|\n",(a+i)->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<<endl<<endl<<endl;
cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Reservation System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;
cout<<endl;
cout<<" ┏━━━━━━━━━━━━━┓\n";
cout<<" ┃ 用户信息管理界面 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃1.查看所有用户信息 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃2.添加一个用户 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃3.删除一个用户 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃4.更改用户信息 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃5.查找用户 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃0.退出 ┃\n";
cout<<" ┗━━━━━━━━━━━━━┛\n";
cout<<“请输入数字实现功能:”<<endl;
int m;
cin>>m;
switch(m)
{
case 1:
system(“cls”);//清屏
DispList(L);
getch();
chapass(L,p,a,G);
break;
case 2:
system(“cls”);
int i;
cout<<“请输入您要插入的位置:”<<endl;
cin>>i;
pass e;
if(ListInsert(L,i,e))
cout<<“信息添加成功,请按任意键返回。。。”<<endl;//插入一个节点
else
cout<<“添加失败,可能是超过最大名额限制或者插入的位置超过上限,请联系开发人员(17865569098)。”<<endl;
getch();
chapass(L,p,a,G);
break;
case 3:
int i1;
pass e1;
system(“cls”);
cout<<endl<<endl;
cout<<“warning : Your action is sensitive operation !”<<endl<<“警告:您现在的操作为敏感操作,请慎重考虑后再行删除!”<<endl;
cout<<“请选择删除模式”<<endl<<“1.按照身份证号删除”<<endl<<“2.按照预留手机号删除”<<endl;
int mode;
cin>>mode; //此处的mode变量为模式,将模式的值传递给LocateElem函数,进行相应的操作
if(mode==1)
{
cout<<“请输入您要删除用户的身份证号:”<<endl;
cin>>e1.id;
i1=LocateElem(L,mode,e1); //查找一个节点
if(i1!=0)
{
if(ListDelete(L,i1,e1)) //删除一个节点
{
cout<<“删除该用户信息成功!按任意键退回。。。”<<endl;
getch();
chapass(L,p,a,G);
}
else
{
cout<<“删除失败,没有找到该身份证号对应的用户。。。”<<endl;
getch();
chapass(L,p,a,G);
}
}else { cout<<"未找到符合条件的用户,查找失败。。。"<<endl; getch(); chapass(L,p,a,G); } } else if(mode==2) { cout<<"请输入您要删除用户的手机号:"<<endl; cin>>e1.phone; i1=LocateElem(L,mode,e1); //查找一个节点 if(i1!=0) { if(ListDelete(L,i1,e1)) //删除一个节点 { cout<<"删除该用户信息成功!按任意键退回。。。"<<endl; getch(); chapass(L,p,a,G); } else { cout<<"删除失败,没有找到该手机号对应的用户。。。"<<endl; getch(); chapass(L,p,a,G); } } else { cout<<"未找到符合条件的用户,查找失败。。。"<<endl; getch(); chapass(L,p,a,G); } } break;
case 4:
int i3;
pass e3;
system(“cls”);//清屏
cout<<endl<<endl<<“warning : Your action is sensitive operation !”<<endl<<“警告:您现在的操作为敏感操作,请谨慎操作!”<<endl; //敏感操作要警告
cout<<endl<<"####更改用户信息####"<<endl;
cout<<“请输入您要更改的用户的身份证号:”<<endl;
cin>>e3.id;
i3=LocateElem(L,1,e3);
if(i3!=0)
{
cout<<“查找成功,可以进行修改操作,请谨慎进行!”<<endl;
if(ListInsert(L,i3,e3))
{
cout<<“修改成功,Press any key to continue…”<<endl;
getch();
chapass(L,p,a,G);
}
else
{
cout<<“修改失败,可能是您没有操作权限或者操作非法!”<<endl;
getch();
chapass(L,p,a,G);
}
}
else
{
cout<<“未能找到符合条件的用户,Press any key to continue…”<<endl;
getch();
chapass(L,p,a,G);
}
break;
case 5:
system(“cls”);
cout<<endl<<endl<<"#####查找用户信息#####"<<endl;
int i2,mode2;
pass e2;
cout<<endl<<“请选择查找方式:”<<endl<<“1.按照身份证号查找”<<endl<<“2.按照预留手机号查找”<<endl;
cin>>mode2;
cout<<endl;if(mode2==1) { cout<<"请输入您要找的用户身份证号:"<<endl; cin>>e2.id; i2=LocateElem(L,mode2,e2); if(i2!=0) { cout<<"查找成功!以下是身份证为"<<e2.id<<"的信息:"<<endl; GetElem(L,i2,e2); cout<<"|姓名\t| | 身份证号 | |性别| | 电话号码 | |航班号\t| |学生认证|"; printf("\n"); printf("%-10s",e2.name); printf(" %-20s",e2.id); if(e2.sex==1) cout<<" 男\t"; else cout<<" 女\t"; printf("%-11s",e2.phone); printf(" %-12s",e2.airnum); if(e2.ifstu==1) cout<<" 是"<<"\t"; else cout<<" 否"<<"\t"; cout<<endl<<endl<<"按任意键继续。。。"<<endl; getch(); chapass(L,p,a,G); } else { cout<<"未能查到符合条件的用户信息,Press any key to continue..."<<endl; getch(); chapass(L,p,a,G); } } else { cout<<"请输入您要找的手机号:"<<endl; cin>>e2.phone; i2=LocateElem(L,mode2,e2); if(i2!=0) { cout<<"查找成功!以下是手机号为"<<e2.phone<<"的信息:"<<endl; GetElem(L,i2,e2); cout<<"|姓名\t| | 身份证号 | |性别| | 电话号码 | |航班号\t| |学生认证|"; printf("\n"); printf("%-10s",e2.name); printf(" %-20s",e2.id); if(e2.sex==1) cout<<" 男\t"; else cout<<" 女\t"; printf("%-11s",e2.phone); printf(" %-12s",e2.airnum); if(e2.ifstu==1) cout<<" 是"<<"\t"; else cout<<" 否"<<"\t"; cout<<endl<<endl<<"按任意键继续。。。"<<endl; getch(); chapass(L,p,a,G); } else { cout<<"未能查到符合条件的用户信息,Press any key to continue..."<<endl; getch(); chapass(L,p,a,G); } } break;
case 0:
mainFram_ma(L,p,a,G);
break;
default:
cout<<“您的指令有误,请按正确的格式输入!Press any key to continue!”<<endl;
getch();
chapass(L,p,a,G);
break;
}
}
/*********************************************************** -
功能描述:设置折扣
-
输入参数:air型指针与折扣
-
输出参数:折扣后的票价
-
返回值 :票价
-
其他说明:入口函数
************************************************************/
int setdiscount(air a)
{
int i;
float dis;
system(“cls”);
cout<<“请输入您想设置优惠的航班号:”<<endl;
char hang[10];
cin>>hang;
for(i=0;i<flight_max;i++)
{
if(!strcmp(((a+i)->num),hang))
{
cout<<“请输入您要设置的优惠:”<<endl;
cin>>dis;
(a+i)->discount=dis;
cout<<“设置成功。”<<endl;
(a+i)->price=(a+i)->price(a+i)->discount;
getch();
return (a+i)->price;
}
}
cout<<“没有该航班。”<<endl;
getch();
return 0;
}
/航班管理函数/
/***********************************************************-
功能描述:管理航班信息函数
-
输入参数:air型指针,Dlinklist型指针,ALGRAPH型指针
-
输出参数: 功能实现
-
返回值 :无
-
其他说明:入口函数
************************************************************/
void maairline(air *a,struct DNode *L,ALGraph *&G)
{
system(“cls”);
cout<<endl<<endl;
cout<<" ** * ** ****** * **** **** * * ******"<<endl;
cout<<" ** *** ** * * * * * * * * * * “<<endl;
cout<<” ** ** ** ** ***** * * * * * * * * ***** “<<endl;
cout<<” ** ** ** ** * * * * * * * * * * “<<endl;
cout<<” *** *** * * * * * * * * * * “<<endl;
cout<<” * * ****** ****** **** **** * * * ******"<<endl;
cout<<endl<<endl<<endl;
cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Airline System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;
cout<<endl;
cout<<" ┏━━━━━━━━━━━━━┓\n";
cout<<" ┃ 航空订票航班管理系统 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃1.更改航班信息 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃2.显示所有航班信息 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃0.退出 ┃\n";
cout<<" ┗━━━━━━━━━━━━━┛\n";
cout<<endl<<endl<<“请输入数字以实现功能:”<<endl;
int me5;
cin>>me5;
switch(me5)
{
case 0:
break;
case 1:
chairline(a,L,G);
getch();
break;
case 2:
DispAdj(G);
getch();
break;
default:
cout<<“您的指令有误,请重新输入。”<<endl;
getch();
maairline(a,L,G);
break;}
}
/*********************************************************** -
功能描述:更改航班信息界面
-
输入参数:air型指针,Dlinklist型指针,ALGRAPH型指针
-
输出参数: 实现界面与修改实现
-
返回值 :无
-
其他说明:入口函数
************************************************************/
void chairline(air *a,struct DNode *L,ALGraph *&G)
{
system(“cls”);
cout<<endl<<endl;
cout<<" ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Airline System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;
cout<<endl;
cout<<" ┏━━━━━━━━━━━━━┓\n";
cout<<" ┃1.更改航班号 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃2.放票、收票 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃0.退出 ┃\n";
cout<<" ┗━━━━━━━━━━━━━┛\n";
cout<<endl<<endl<<“请输入数字以实现功能:”<<endl;
int me4;
cin>>me4;
switch(me4)
{
case 0:
break;
case 1:
system(“cls”);
if(chline(a,L,G))
cout<<“修改成功!按任意键继续!”<<endl;
else
cout<<“您输入的航班号不存在,修改失败!”<<endl;
getch();
chairline(a,L,G);
break;
case 2:
system(“cls”);
if(chticcount(a,L,G))
cout<<“修改成功!按任意键继续!”<<endl;
else
cout<<“您输入的航班号不存在或者操作非法,修改失败!”<<endl;
getch();
chairline(a,L,G);
break;
default:
cout<<“您的指令有误,请重新输入。”<<endl;
getch();
maairline(a,L,G);
break;}
}
/变更航班号函数/
/*********************************************************** -
功能描述:变更航班号
-
输入参数:air型指针,Dlinklist型指针,ALGRAPH型指针
-
输出参数: 认证界面
-
返回值 :无
-
其他说明:入口函数
*****/
bool chline(air a,struct DNode L,ALGraph &G)
{
system(“cls”);
cout<<endl<<endl;
cout<<“请输入您要更改的航班号:”<<endl;
char hangn[10];
cin>>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<<“请输入新的航班号:”<<endl;
cin>>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<<endl<<endl;
cout<<“请输入您要更改的航班号:”<<endl;
char hangn[10];
cin>>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.收票”<<endl;
cout<<“当前此航班剩余票数:”<adjlist[i].data.count<<endl;
int sel;
cin>>sel;
if(sel1)
{
cout<<“请输入放票数量:”<<endl;
cin>>sel;
ncount=G->adjlist[i].data.count+sel; //条件判断值
if(ncount>60)
{
cout<<“大哥,飞机不是货车,哪有那么多票啊!”<<endl;
return false;
}
G->adjlist[i].data.count=ncount;//同步图结构的值与线性表中的一致!!!!重要
a[i].count=ncount;
cout<<“放票成功!”<<endl;
return true;
}
else if(sel2)
{
cout<<“请输入收票数量:”<<endl;
cin>>sel;
ncount=G->adjlist[i].data.count-sel;
if(ncount<0)
{
cout<<“大哥,票都收没了,别收了!”<<endl;
return false;
}
G->adjlist[i].data.count=ncount;
a[i].count=ncount;
cout<<“收票成功!”<<endl;
return true;
}
else
{
cout<<“error!错误输入!”<<endl;
return false;
}
}
p=p->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<<endl<<endl<<endl<<endl;
cout<<" ********************************************"<<endl;
cout<<" * *"<<endl;
cout<<" * 欢迎进入管理登录系统 *"<<endl;
cout<<" * *"<<endl;
cout<<" ********************************************"<<endl;
cout<<endl<<endl<<endl<<endl;
cout<<" 请输入用户名:";
cin>>username1;
cout<<endl;
cout<<" 请输入密码:";
cin>>password1;
if((!strcmp(username1,username))&& (!strcmp(password1,password))) //匹配固定密码
{
cout<<“登录成功!”<<endl;
return true;
}
else
return false;
}
.linklist.h
#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); //删除一个节点
#endiflinklist.cpp
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#include
#include “linklist.h”
#include <string.h>
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; i<n; i++)
{
s=(DLinkList )malloc(sizeof(DLinkList));//创建新结点
s->data=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; i<n; i++)
{
s=(DLinkList )malloc(sizeof(DLinkList));//创建新结点
//a[i].signinfo();
s->data=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=q;
q=p->next;
}
free§;
}
/ - 功能描述:判断链表是否为空
- 输入参数: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.sex1)
cout<<" 男\t";
else
cout<<" 女\t";
printf("%-11s",p->data.phone);
printf(" %-12s",p->data.airnum);
if(p->data.ifstu1)
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 (j<i && p!=NULL)
{
j++;
p=p->next;
}
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(mode1)
{
while (p!=NULL && (strcmp(p->data.id,e.id)))
{
n++;
p=p->next;
}
if (pNULL)
return(0);
else
return(n);
}
else if(mode2)
{
while (p!=NULL && (strcmp(p->data.phone,e.phone)))
{
n++;
p=p->next;
}
if (pNULL)
return(0);
else
return(n);
}
else
{
cout<<“您输入的模式有误,不能完成您的要求。。。”<<endl;
getch();
return(0);
}
}
bool ListInsert(DLinkList &L,int i,NewType e)
{
cout<<endl<<endl<<endl;
cout<<“请输入该用户的用户名:”<<endl;
cin>>e.name;
cout<<“请输入该用户的身份证号:”<<endl;
cin>>e.id;
cout<<“请输入该用户的缴存金额:”<<endl;
cin>>e.money;
cout<<“请输入该用户的性别(男为1,女为0):”<<endl;
cin>>e.sex;
cout<<“请输入该用户的预留手机号:”<<endl;
cin>>e.phone;
strcpy(e.airnum,“无”);
e.ifstu=0;
int j=0;
DLinkList p=L,s;
while (j<i-1 && p!=NULL)
{
j++;
p=p->next;
}
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 (j<i-1 && p!=NULL)
{
j++;
p=p->next;
}
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;
}}
graph.h
#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.cpp
#include <stdio.h>
#include <malloc.h>
#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; i<n; i++) //给邻接表中所有头节点的指针域置初值
G->adjlist[i].firstarc=NULL;
for (i=0; i<n; i++) //检查邻接矩阵中每个元素
for (j=n-1; j>=0; j–)
if (Arr[in+j]!=0) //存在一条边,将Arr看作n×n的二维数组,Arr[in+j]即是Arr[i][j]
{
p=(ArcNode )malloc(sizeof(ArcNode)); //创建一个节点p
p->adjvex=j;
p->info=Arr[in+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<<endl<<endl;
cout<<“当前的航班信息为:”<<endl;
int i;
ArcNode *p;
for (i=0; in; 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");
}
}
.main.cpp
#include
#include
#include <malloc.h>
#include <conio.h>
#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”,“371427199701252217”,300,0,“无”,1,“17865569098”},
{“zx”,“372458199823236636”,1000,1,“无”,1,“17865569102”},
{“hcj”,“375864645531154566”,600,1,“无”,0,“17865569110”},
{“zqb”,“376545555578951323”,500,0,“无”,0,“17865569105”},
{“zkw”,“371165456486453125”,1500,1,“无”,0,“17865569108”}
};//初始化乘客链表
DLinkList *l;
InitList(l);
CreateListR(l,p,5); //创建双链表
while(1)
mainFram(l,p,a,G);
return 0;
}
- 系统必须能存储以下数据信息:
-
基于C++航空客运订票系统(VC++6.0)
2021-06-18 11:28:47用C语言设计简易航空客运订票系统,其业务活动包括查询航线、客票预订和办理退票等 1 设计目的 熟悉掌握C语言中所学的理论知识,加深C语言的复习:输入输出,文件的读写,结构体的运用等; 2. 对于部分数据结构的...点击查看:基于C++航空客运订票系统
文件大小:5.2M
操作系统:Windows10旗舰版
开发工具:VC++6.0
开发语言:.cpp
简要概述:
用C语言设计简易航空客运订票系统,其业务活动包括查询航线、客票预订和办理退票等
1 设计目的
熟悉掌握C语言中所学的理论知识,加深C语言的复习:输入输出,文件的读写,结构体的运用等; 2. 对于部分数据结构的了解:链表的存储和建立,链表的查询、删除和插入,队列的建立和常用操作; 3. 熟悉VC6.0的调试技巧:新建工、代码注释、编译运行等;
通过综合C语言的基本知识来解决实际问题;
加强分析和解决问题的能力。 2.2 设计内容 航空客运订票的业务活动包括:查询航线、客票预订和办理退票等。设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。 2.3 需求分析 1. 航线所涉及的信息有 (1)航班号、出发、目的地、出发日期; (2)出发时间、达到时间、终点站名飞行日(星期几)、乘员定额余票量、已订票的客户名单; 2. 航班信息以及客户信息可以存储于文件中,程序运行时加载至内存; 3. 系统能实现的操作和功能 (1)显示全部航线 (2)查询航线(根据客户、航班号等查询) (3)订票(订票航线、数量来看是否余票) (4)退票(同上) 3 设计内容 3.1 系统结构
2 功能模块说明
显示已经加载文件中的全部航线信息;
浏览已订票客户信息;
根据客户提出的终点站名,调用find()函数寻找航线信息,调用list()函数输出航线信息;
办理订票业务:根据客户提供的航班号进行查询航线信息,若客户订票额超过乘员定票总额,退出,若客户订票额末超过余票量,订票成功并登记信息,在订票乘员名单域中添加客户信息;
办理退票业务:调用查询函数,根据客户提供的航线进行搜索根据客户提供的姓名到订票客户名单域进行查询。退票成功后,重新将航线名单域指向订票单链表的头指针。根据队列中从出的客户信息判断是否满足要求,如果满足,则将该客户的信息插入到乘客信息
-
C++实现的航空客运订票系统
2019-12-26 21:18:50C++实现的航空客运订票系统:实现了乘客和管理员两种不同的身份登录系统,而且实现了航班的基本增删改查等功能。 -
数据结构-航空客运订票系统
2009-12-21 20:50:09要求在TC或VC环境下设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。 1)每条航线所涉及的信息有:终点站名、航班号、飞机号、 飞行日期(星期几)、乘员定额、余票量、已经订票的客户名单(包括姓名、... -
C++课程设计:航空客运订票系统
2019-04-07 22:33:16航空客运订票系统 选题背景 ①背景: 现在人们更多的使用飞机作为出行交通工具,因此机票票务市场也在快速发展。国内外航空事业在飞速发展,各航空公司对票务管理的要求也在不断的提高,对航空的信息管理...航空客运订票系统
选题背景
①背景: 现在人们更多的使用飞机作为出行交通工具,因此机票票务市场也在快速发展。国内外航空事业在飞速发展,各航空公司对票务管理的要求也在不断的提高,对航空的信息管理系统提出了更高的要求。
②应达到的技术要求: 为实现航空管理员和乘客的不同需要,技术上应实行多级用户。管理员能够查看所有航班信息,乘客名单以及修改航班票价等;乘客用户能够查询航班信息,购买机票以及退票等操作。
为实现上述功能,需要完成文本文件的基本编辑:增、删、改、查,创建多文件适应不同需要,同时为了在内存中创建对应对象,需要良好的面向对象的知识。③指导思想: 为航空管理员和乘客提高良好的管理系统。
方案论证(设计理念)
** 设计理念:** 基于C++程序设计基础,实现了多级用户管理。乘客用户可以查询航班,根据旅客提出的终点站名输出信息;根据提供的航班号进行购票,可选择购票数,若有余票,则为用户办理订票;若无余票或余票不满足用户需求,可询问旅客是否登记排队候补。乘客可退票,若有旅客在次航班候补,可按顺序为满足订票数的乘客购票。 航空公司管理员可查看所有航班信息和乘客名单,并且可以修改航班票价。实现方案:
C++ MVC模式:win32控制台为界面(view)、文本文件提供数据(model)、面向对象中类、实例及链表。应用运行环境为visual studio 2010。这个方案的特点:
1.win32控制台界面简洁、用户交互良好,同时可以让程序制作者更专注于逻辑代码的编辑和落实上。虽然UI略显简陋,但是用户提示足够详细,界面上的不足完全可以由技术和逻辑弥补。
2.使用文本文件可直接打开获取、修改、保存数据,直观性好。
3.使用面向对象的方法设计程序,以管理员和乘客为基本点出发,结构和层次更清晰。同时先将文本文件的数据读取到内存中,作为链式储存,容易插入、删除数据,再与用户进行交互,避免了重复打开文件,多次操作文件带来的效率低下的问题。同时也利用了操作内存速度远比操作文件速度要快的特点,提升了程序性能。过程论述
1.建立对象:
实现多级用户管理。乘客用户可以查询航班,根据旅客提出的终点站名输出信息;票或余票不满足用户需求,可询问旅客是否登记排队候补。乘客可退票,若有旅客在次航班候补,可按顺序为满足订票数的乘客购票。航空公司管理员可查看所有航班信息和乘客名单,并且可以修改航班票价。
定义结构Client,表示乘客,具有next指针指向下一结点,可以实现链式结构。
具有next指针指向下一结点,可以实现链式结构。定义类对象airline,表示航班:
具有next指针指向下一结点,可以实现链式结构。具有终点站名、航班号、飞机号、飞行日、乘员定额、余票量、已订票的客户名单文件名以及等候替补的客户名单文件名等私有数据成员,保证了数据的安全性。以及一系列的友元函数,可以完成对航班的访问,来实现特定的功能。2.通过文本文件读取、存放数据
将文本文件的数据读取到内存中,作为链式储存,容易插入、删除数据,再与用户进行交互,避免了重复打开文件,多次操作文件带来的效率低下的问题。同时也利用了操作内存速度远比操作文件速度要快的特点,提升了程序性能。
本实验设计了一个航班信息的文本文件,以及每条航班线对应有一个乘客名单文件和排队候补旅客名单文件,这两份名单文件名在该航班信息中存放。
程序运行时,将航班信息文本文件读取到内存中,每次数据有修改时,对文本文件进行数据修改。
以下是文本内容:
3.基本功能的实现(以下简单介绍几个较为重要的函数)登录界面,通过选择乘客登录或管理员登录:
本次实验对登录界面进行简化,实际中较为复杂,乘客登录只需输入姓名,管理员登录输入管理员密码(666666)。根据不同的登录方式将进入不同的用户界面。
查询功能:
乘客根据终点站名查询航班,通过链表顺序查找,匹配终点站名,并判断是否找到,若找到则打印航班信息。
订票功能:
系统根据乘客提供的航班号链式顺序查找该航班,若找到,则询问购票数。
然后分为两个分支:一是余票量满足购票数,则购票成功,改用户列入乘客名单
二是余票不足,则继续询问,是否登记排队候补
退票功能:
分为两个部分,一是退票,二是若有用户排队候补次航班,则根据需求票数和排队顺序为候补乘客购票。
在该航班的乘客名单中根据姓名查找,若找到则询问退票数量。
首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队候补的客户
修改票价功能:
管理员通过输入航班号,找到该航班进行票价修改
4.完善用户界面系统通过main函数完成,switch分支选择调用不同的函数,到达不同的界面,实现各种功能。如图所示;
运行结果
图1 乘客登录
图2 乘客用户界面
图3 乘客查询航班
图4 乘客订票(余票足)
图5乘客订票(余票不足)
图6 乘客退票
图7 管理员登录
图8 管理员操作界面
图9 管理员查看所有航班信息
图10 管理员查看乘客名单
图11 管理员修改票价完整代码
#include<iostream> #include<fstream> #include<stdio.h> #include<cstring> using namespace std; struct client { /*客户*/ char name[20]; /*姓名*/ int ordering_number; /*订票量*/ int grade; /*舱位等级*/ client *next; }; class airline { /*航班信息*/ private: char end_station[20]; /*终点站名*/ char air_num[10]; /*航班号*/ char plane_num[10]; /*飞机号*/ char day[7]; /*飞行日(星期几)*/ int people_quota; /*乘员定额*/ double price; /*票价*/ int more_ticket; /*余票量*/ char passenger_list[50]; /*乘客名单*/ char waiting_list[50]; /*等候替补的客户名单*/ static int number; /*航班总数*/ public: void print() {/*打印航班信息*/ cout<<" 终点站名:"<<end_station<<" \t 航班号:"<<air_num<<"\t 飞机号:"<<plane_num <<"\n 时间:"<<day<<"\t\t 乘员定额:"<<people_quota<<"\n 票价:"<<price<<"\t\t 余票量:"<<more_ticket<<"\n\n"; } friend airline* get_airline(); /*读取文件中的航班信息*/ friend void client_list(); friend void put_airline(airline*); friend void print_airline(); friend void search(); friend void booking(); friend void refund(); friend client* get_passenger(airline); friend client* get_wait(airline); friend void put_passenger(airline,client*); friend void put_wait(airline,client*); friend void re_price(); }; int airline::number=0; char Name[20]=""; /*用于用户登录的姓名*/ airline *L; /*全局变量,航线指针*/ void app_client(client *c,client *q) {/*增加乘客*/ client *p=c; while(p->next) p=p->next; p->next=q; q->next=NULL; } int login() {/*登录*/ int f; char password[20],*p="666666"; /*管理员密码*/ cout<<"*************************登录*****************************\n\n"; cout<<" 1.乘客登录 2.管理员登录\n 请选择用户身份:"; fflush(stdin); /*刷新输入流缓冲区*/ while(f=int(getchar())-48) { if(f==1) { cout<<" 姓名:"; cin>>Name; cout<<"\n\t\t登录成功!!\n\n**********************************************************\n\n"; return 1; } else if(f==2) { cout<<"\n 输入管理员密码(提示6个6):"; fflush(stdin); while(cin>>password) { if(!strcmp(password,p)) { cout<<"\n\t\t登录成功!!\n\n**********************************************************\n\n"; return 2; } else cout<<"\n密码错误!! 请重新输入\n\n 输入管理员密码:"; } } else cout<<"输入错误!! 请重新输入\n 请选择用户身份: "; } } void search() {/*查询操作*/ char s[20]; int i=0; cout<<"*************************查询*****************************\n\n\t\t终点站名:"; cin>>s; while(i<L->number&&strcmp(s,L[i].end_station)) i++; /*按链表顺序匹配终点站名*/ if(i<L->number) L[i].print(); else cout<<"\n无此航班信息!\n\n"; cout<<"**********************************************************\n\n"; } void refund() {/*退票操作*/ char s[20]; int i=0,n; cout<<"*************************退票*****************************\n\n\t\t航班号:"; cin>>s; while(i<L->number&&strcmp(s,L[i].air_num)) i++; /*按航班号匹配*/ if(i<L->number) {/*找到此航班*/ client *c1=get_passenger(L[i]),*c2=get_wait(L[i]),*p=c1,*q,*r; /*获得次航班的乘客和候补乘客链表*/ while(p->next&&strcmp(Name,p->next->name)) p=p->next; /*姓名查找*/ if(p->next) {/*找到该用户姓名*/ cout<<"您在"<<L[i].air_num<<"航班(终点站:"<<L[i].end_station<<")订了" <<p->next->ordering_number<<"张票\n请输入退票数量:"; do {/*输入退票数*/ cin>>n; if(n>0&&n<=p->next->ordering_number) break; else cout<<"\n输入错误!!请重新输入:"; }while(1); if(n==p->next->ordering_number) {/*全部退票*/ r=p->next; q=r->next; p->next=q; delete r; } else if(n<p->next->ordering_number) p->next->ordering_number-=n; /*退部分票*/ L[i].more_ticket+=n; /*余票增加*/ int f=1; while(L[i].more_ticket&&f) {/*有余票且未访问完所有候补乘客*/ p=c2; while(p->next&&L[i].more_ticket<p->next->ordering_number) p=p->next; if(p->next) {/*找到需求票数满足的*/ L[i].more_ticket-=p->next->ordering_number; r=p->next; q=r->next; p->next=q; app_client(c1,r); } else f=0; /*访问完*/ } put_passenger(L[i],c1); /*刷新乘客名单*/ put_wait(L[i],c2); } else cout<<"\n退票错误!! 您没有在此航班订票\n"; } else cout<<"\n无此航班信息!\n\n"; cout<<"\n 退票完成!\n"; cout<<"**********************************************************\n\n"; put_airline(L); } void booking() {/*订票操作*/ char s[20]; int i=0,n,y,g; cout<<"*************************订票*****************************\n\n\t\t航班号:"; cin>>s; while(i<L->number&&strcmp(s,L[i].air_num)) i++; if(i<L->number) {/*找到该航班*/ L[i].print(); client *c1=get_passenger(L[i]); client *c2=get_wait(L[i]); cout<<" 舱位等级(1:头等舱,2:普通舱,3:经济舱):";cin>>g; cout<<" 购买票数:"; do {/*合理输入购买票数*/ cin>>n; if(n<=L[i].people_quota) break; else cout<<"错误!!不能超过最大乘员数("<<L[i].people_quota<<"),重新输入:"; }while(1); if(L[i].more_ticket) {/*有余票*/ if(n<=L[i].more_ticket) {/*余票足够*/ client *p=new client; strcpy_s(p->name,Name); p->ordering_number=n; L[i].more_ticket-=n; p->grade=g; app_client(c1,p); cout<<"\n 购票完成!\n"; } else if (n>L[i].more_ticket) {/*余票小于购买数*/ int x; client *p1=new client,*p2=new client; /*询问用户*/ cout<<"\n\n(1:只买"<<L[i].more_ticket<<"张 2:买"<<L[i].more_ticket<<"张," <<n-L[i].more_ticket<<"张等候 3:不买)\n 余票不足"<<n<<"张,是否继续购买?:"; cin>>x; switch(x) { case 1: strcpy_s(p1->name,Name); p1->ordering_number=L[i].more_ticket; L[i].more_ticket=0; p1->grade=g; app_client(c1,p1); cout<<"\n 购票完成!\n"; break; case 2: strcpy_s(p1->name,Name); p1->ordering_number=L[i].more_ticket; p1->grade=g; app_client(c1,p1); strcpy_s(p2->name,Name); p2->ordering_number=n-L[i].more_ticket; L[i].more_ticket=0; p2->grade=g; app_client(c2,p2); cout<<"\n 购票完成!\n"; break; } } } else {/*无余票*/ cout<<"\n 无余票! 是否排队等候票?(1:是 0:否)";cin>>y; if(y) {/*进入等候名单*/ client *p=new client; strcpy_s(p->name,Name); p->ordering_number=n; p->grade=g; app_client(c2,p); } } put_passenger(L[i],c1); /*刷新乘客名单*/ put_wait(L[i],c2); } else cout<<"\n无此航班信息!\n\n"; cout<<"\n**********************************************************\n\n"; put_airline(L); } void put_wait(airline l,client *c) {/*输出等候替补名单*/ fstream f; client *p=c->next; f.open(l.waiting_list,ios::out|ios::trunc); while(p) { f<<p->name<<" "<<p->ordering_number<<" "<<p->grade<<'\n'; p=p->next; } f.close(); } client* get_passenger(airline l) {/*读取某航班乘客信息*/ fstream f;int i=0; client *c=new client,*p=new client,*q=c; f.open(l.passenger_list,ios::in); while(f>>p->name>>p->ordering_number>>p->grade) { q->next=p; p=new client; q=q->next; } q->next=NULL; f.close(); return c; } void put_passenger(airline l,client *c) {/*输出乘客信息到文件*/ fstream f; client *p=c->next; f.open(l.passenger_list,ios::out|ios::trunc); while(p) { f<<p->name<<" "<<p->ordering_number<<" "<<p->grade<<'\n'; p=p->next; } f.close(); } client* get_wait(airline l) {/*读取某航班等候替补名单*/ fstream f;int i=0; client *c=new client,*p=new client,*q=c; f.open(l.waiting_list,ios::in); while(f>>p->name>>p->ordering_number>>p->grade) { q->next=p; p=new client; q=q->next; } q->next=NULL; f.close(); return c; } airline* get_airline() {/*读取文件中的航班信息*/ fstream f;int i=0; airline *line=new airline [100]; f.open("航班信息.txt",ios::in); while(f>>line[i].end_station>>line[i].air_num>>line[i].plane_num>> line[i].day>>line[i].people_quota>>line[i].price>>line[i].more_ticket >>line[i].passenger_list>>line[i].waiting_list) i++; line->number=i; f.close(); return line; } void put_airline(airline *L) {/*输出修改后的航班信息*/ fstream f;int i; f.open("航班信息.txt",ios::out); for(i=0;i<L->number;i++) f<<L[i].end_station<<" "<<L[i].air_num<<" " <<L[i].plane_num<<" "<<L[i].day<<" "<<L[i].people_quota<<" "<< L[i].price<<" "<<L[i].more_ticket<<" "<<L[i].passenger_list<<" "<<L[i].waiting_list<<'\n'; f.close(); } void print_airline() {/*打印所有航班信息(管理员操作)*/ L=get_airline(); int i=0; cout<<"*************************航班信息*************************\n\n"; for(int i=0;i<L->number;i++) L[i].print(); cout<<"\n**********************************************************\n\n"; } void client_list() {/*查看某航班乘客名单(管理员操作)*/ int i=0;char s[20],*g; cout<<"*************************乘客名单*************************\n\n\t\t航班号:"; cin>>s; while(i<L->number&&strcmp(s,L[i].air_num)) i++; if(i<L->number) { client c; fstream f; f.open(L[i].passenger_list,ios::in); cout<<"\n 已购票乘客名单:\n"; while(f>>c.name>>c.ordering_number>>c.grade) { switch(c.grade) { case 1:g="头等舱";break; case 2:g="普通舱";break; case 3:g="经济舱"; } cout<<"\t姓名:"<<c.name<<"\t舱位等级:"<<g<<"\t购票数:"<<c.ordering_number<<endl; } f.close(); f.open(L[i].waiting_list,ios::in); cout<<"\n 候补订票乘客名单:\n"; while(f>>c.name>>c.ordering_number>>c.grade) { switch(c.grade) { case 1:g="头等舱";break; case 2:g="普通舱";break; case 3:g="经济舱"; } cout<<"\t姓名:"<<c.name<<"\t舱位等级:"<<g<<"\t预订票数:"<<c.ordering_number<<endl; } f.close(); } else cout<<"\n无此航班信息!\n\n"; cout<<"\n**********************************************************\n\n"; } void re_price() {/*修改某航班票价(管理员操作)*/ int i=0,p;char s[20]; cout<<"*************************修改票价*************************\n\n\t\t航班号:"; cin>>s; while(i<L->number&&strcmp(s,L[i].air_num)) i++; if(i<L->number) { cout<<" 终点站名:"<<L[i].end_station<<"\t 飞机号:"<<L[i].plane_num <<"\n\n\t 原票价:"<<L[i].price<<"\n\t 新票价:"; cin>>p; L[i].price=p; cout<<"\n 修改票价完成\n"; } else cout<<"\n无此航班信息!\n\n"; put_airline(L); cout<<"\n**********************************************************\n\n"; } int form1() {/*乘客用户界面*/ int s; cout<<"*************************用户界面*************************\n\n"; cout<<" 1.查询航班\t 2.订票\t 3.退票 0.退出登录\n\n\t\t选择操作:"; fflush(stdin); while(s=int(getchar())-48) { if(s>=0&&s<=3) { cout<<"\n**********************************************************\n\n"; return s; } else cout<<"\t输入错误!! \n\t请重新选择操作:"; } } int form2() {/*管理员界面*/ int s; cout<<"***********************管理员界面*************************\n\n"; cout<<" 1.航班信息\t 2.乘客名单\t 3.修改票价 0.退出登录\n\n\t\t选择操作:"; fflush(stdin); while(s=int(getchar())-48) { if(s>=0&&s<=3) { cout<<"\n**********************************************************\n\n"; return s; } else cout<<"\t输入错误!! \n\t请重新选择操作:"; } } int main() { L=get_airline(); do { int f=1; switch(login()) { case 1:/*乘客界面*/ system("pause"); system("cls"); do { switch(form1()) { case 1:/*调用查询函数*/ system("cls"); search(); system("pause"); system("cls"); break; case 2:/*订票*/ system("cls"); booking(); system("pause"); system("cls"); break; case 3:/*退票*/ system("cls"); refund(); system("pause"); system("cls"); break; case 0:/*退出登录,返回上一层*/ f=0; system("cls"); } }while(f); break; case 2:/*管理员界面*/ system("pause"); system("cls"); do { switch(form2()) { case 1:/*查看所有航班信息*/ system("cls"); print_airline(); system("pause"); system("cls"); break; case 2:/*查看乘客名单*/ system("cls"); client_list(); system("pause"); system("cls"); break; case 3:/*修改票价*/ system("cls"); re_price(); system("pause"); system("cls"); break; case 0:/*退出登录,返回上一层*/ f=0; system("cls"); } }while(f); } }while(1); }
注: 需要在工程项目中Debug文件夹中加入以下文本文件
其中:北京 001 KN9500 星期一 150 2000 18 001a.txt 001b.txt
对应:终点站 航班号 飞机号 星期 总票数 票价 余票数 已购票文件名 候补订票文件名
工程文件打包下载地址: -
航空客运订票系统(数据结构课设)
2020-10-26 11:33:52航空客运订票的业务活动包括: 查询航线、 客票预订和办理退票等。 试设计一个航空客运订 票系统, 以使上述业务可以借助计算机来完成。 二、 基本要求(已实现) 2.1 每条航线所涉及的信息有: 终点站名、 航班号、... -
数据结构航空客运订票系统.docx
2020-10-30 00:42:08航空客运订票系统 程序要求 1 问题描述 航空客运订票的业务活动包括查询航线客票预订和办理退票等设计一 个航空客运订票系统以使上述业务可以借助计算机完成 2 要求 1 每条航线所涉及的信息有终点站名航班号飞机号... -
数据结构课设-航空客运订票系统(C语言实现)
2021-01-23 17:13:18数据结构课设:航空客运订票系统(C语言实现)。航空结点由带头结点的单链表实现,已订票客户订单结点由双向链表(不带头结点)实现,候补队列由链式队列(无头结点)实现 -
数据结构航空客运订票系统.pdf
2020-08-31 00:29:37航空客运订票系统 程序要求 1 问题描述 航空客运订票的业务活动包括查询航线客票预订和办理退票等设计一 个航空客运订票系统以使上述业务可以借助计算机完成 2 要求 1 每条航线所涉及的信息有 终点站名航班号飞机号...