C语言版数据结构-课程设计-航空客运订票系统 V2.0 附源码(增加管理员功能)

相信很多粉丝看过看过我的主页,有一个航空订票系统:

数据结构航空订票系统(附源码)

但是最近后台收到很多粉丝的要求,在上一个航空订票系统中要加上管理员的功能块,于是对上面那个课设进行了改进,新的功能流程如下:(航班信息由管理员添加和删除、顾客可以实现购票与退票,订票分为经济舱和商务舱)

新增管理员模块的功能如下,采用单链表、队列实现(航班信息改为由管理员添加):

管理员模块的功能:
A:管理员密码验证
B:查询所有航班信息
C:根据航班ID查询客户信息(包括身份证号码)
D:增加航班(航班的各个信息输入要合法,不合法的重新输入)
E:删除航班,根据ID进行删除,ID不存在则删除失败。
F:返回上一级菜单

//管理员的操作,包括管理员的验证,包括查看航班、增加航班、删除航班和查看订票的客户信息,能查到身份证号码。

航空订票系统V2.0的功能需求如下:

【基本需求】
(1)每条航线所设计的信息有:航班ID、起点站名、终点站名、飞机号、飞行周日(星期几)、成员定额、总余票量、经济仓余票量、商务舱余票量、已订票的客户名单、经济舱候补客户名单、商务舱候补客户名单。其中,经济舱候补客户名单和商务舱候补客户名单中的包括以下几个域:姓名、身份证、所需票量、预定票的等级


(2)作为示意系统,数据放在内存中;

(3)系统能实现的操作和功能如下:
     查看所有航班信息:
     查询模块:输入起点站和终点站进行搜索


 订票模块的功能:
A:输入航班ID进行订票,当航班ID不存在或者不合法时要求重新输入航班ID,然后输入订票数量和等级,数量和等级要合法,订票数目要大于0,等级输入1代表经济舱,输入其他数据商务舱。不合法则重新输入,再判断对应等级的票是否足够 ,足够则继续输入客户信息(姓名和身份证),然后订票成功。当对应等级的票数不足时,询问是否改变订票计划,同意改变计划则重新输入航班ID进行相应的订票操作。不同意改变计划则继续询问是否排队等候,不同意排队等候则询问是否需要推荐相同航线的其他航班,询问操作时,输入Y或者y表示同意,输入N,n或者其它数据表示不同意。
B:根据起点和终点查询航班
C:查询所有航班的相关信息
D::查询航班的订票情况,输入航班ID,当航班ID不存在或者不合法时要求重新输入航班ID,根据ID查询航班,显示出已订票的客户的姓名、订票数目和仓位等级,为了保密,不能显示客户的身份证。
E:返回上一级菜单

退票模块的功能:
A:先输入航班ID,然后输入姓名和身份证号码进行验证,验证成功则办理退票手续。然后查询该航班是否有人排队候补,如果有,而且票数够了,则首先询问排在第一的客户,是否需要订票,是则为他办理订票手续,否则出队,依次询问其他排队候补的客户。若刚刚退票的是经济舱,则询问经济舱排队的客户;若是商务舱,则询问商务舱排队的客户。
B:返回上一级菜单
C:退出系统


管理员模块的功能:
A:管理员密码验证
B:查询所有航班信息
C:根据航班ID查询客户信息(包括身份证号码)
D:增加航班(航班的各个信息输入要合法,不合法的重新输入)
E:删除航班,根据ID进行删除,ID不存在则删除失败。
F:返回上一级菜单

 

运行效果主页面截图:

运行环境(Dev C++ 或者 code blocks),测试数据如下:

 

 运行后,首先需要管理员登录,来添加航班信息:

 

然后管理员添加航班:

管理员查看航班信息:

普通用户输入起点站终点站 名称,查询 航班信息:

 普通客户科根据  经济舱  和   商务舱  两种情况订票:

 

 查询订票模块:根据航班ID查询谁订票订了几张票还有舱位等级

 退票操作:

管理员删除航班信息:

 退出系统:

所用类型定义:

完整代码请访问:

腾讯文档腾讯文档-在线文档https://docs.qq.com/doc/p/71239d69a76f56cf1521717ae6b22c27cf876f10

typedef int Status;

//航班日期枚举类,星期一到星期天

enum Week {

    Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7

};

//乘客节点
typedef struct CustomerNode {

    char name[10];//客户姓名

    int clientTickets;//客户订票量

    char identification[20];//客户身份证号码

    int rank;//舱位等级

    CustomerNode *next;

} CustomerNode, *CusLinkList;
//候补队列中的节点

typedef struct WaitPassenger {

    char name[10];//姓名

    char identification[20]; //身份证

    int preTickets;//预定的票量

    struct WaitPassenger *next;

} WaitQNode, *PWait;
//候补队列

typedef struct Queue {

    PWait front;//等候替补客户名单域的头指针

    PWait rear;//等候替补客户名单域的尾指针

} LinkQueue;
//封装乘客的姓名和订票量和身份证

//用于候补客户出队时把关键字返回

typedef struct NameAndNumAndID {

    char name[10];//姓名

    char identification[20]; //身份证号码

    int num;//订票量

} NameAndNumAndID;
//航班节点

typedef struct Flight {

    char startPoint[20];//起点站名

    char destination[20];//终点站名

    char flightCodeID[20];//航班ID(相当于主键)

    char planeNum[20];//飞机号

    char day[20];//飞行日期(星期几)

    int totalTickets;//乘员定额(总票数)

    int left;//总余票量

    int leftEconomicTicket; //经济票剩余量

    int leftBusinessTicket; //商务票剩余量

    Flight *next;

    CusLinkList cusLinkList;//乘员名单域,指向乘员名单链表的头指针

    LinkQueue waitQueue1;//经济舱候补,等候替补的客户名单域,指向一个队列

    LinkQueue waitQueue2;//商务舱候补,等候替补的客户名单域,指向一个队列


} Flight, FlightNode, *PFlight;

航班链表采用全局变量:pFlight,指向航班链表的头指针

 pflight1,一个数组,存有留个基本航班,一个个入pFlight 航班链表中。

/
*入队,增加排队等候的客户名单域
*@paramq带头结点的链队列
*@paramname
*@paramamount
*@return
*/
LinkQueueAppendqueue(LinkQueue&q,charname[],intamount,charidentification[]){
PWaitnew1;
new1=(PWait)malloc(sizeof(WaitQNode));
strcpy(new1->name,name);
strcpy(new1->identification,identification);
new1->preTickets=amount;
new1->next=NULL;

q.rear->next=new1;
q.rear=new1;

returnq;
}
/
*退票功能模块
*/
voidReturnTicket(){
structFlight*info;
intrank;
//p1为遍历指针,p2为辅助指针,指向p1的前驱
CustomerNode*p1,*p2,*head;
//客户姓名
charcusname[10];
//客户身份证
charidentification[20];
system("cls");
//info指针,find函数根据航班ID返回该航班节点的指针
intloop;
loop:
{
info=find();
};

if(info==NULL){
printf("没有这个航班,请重新输入\n");
gotoloop;
}

//head为该航班的的乘员名单域的头指针
head=info->cusLinkList;
//带头结点的指针,head->next开始遍历
p1=head->next;
printf("请输入你的姓名:");
scanf("%s",cusname);
printf("请输入你的身份证号码:");
scanf("%s",identification);
//根据客户姓名搜索客户是否订票
p2=head;
while(p1!=NULL){
if((strcmp(cusname,p1->name)==0)&&(strcmp(identification,p1->identification)==0))break;
p2=p1;
p1=p1->next;
}

if(p1==NULL){
printf("对不起,你没有订过票或姓名和身份证不对应\n");
return;
}else{//退票成功
//从乘客名单域中移除该节点
rank=p1->rank;
p2->next=p1->next;
//加回该航班的剩余票
info->left+=p1->clientTickets;
if(rank==1){
info->leftEconomicTicket+=p1->clientTickets;
}else{
info->leftBusinessTicket+=p1->clientTickets;
}
printf("%s成功退票!\n",p1->name);
free(p1);
}

LinkQueuequeue1=info->waitQueue1;
LinkQueuequeue2=info->waitQueue2;
NameAndNumAndIDnameAndNumAndID={0,0};


if(rank==1){//有经济舱退票,询问经济舱排队的客户
for(;queue1.front->next!=NULL&&queue1.front->next->preTickets<=info->leftEconomicTicket;){
//从候补客户队列中,出队客户的姓名和订票量用NameAndNumAndID返回
QueueDelete(info->waitQueue1,nameAndNumAndID);
inty;
printf("有经济舱票剩余,尊敬的%s:\n",nameAndNumAndID.name);
printf("是否确认订票(1确认订票,其他数字拒绝订票\n");
scanf("%d",&y);
/
*订票界面
*属于订票模块
*/
voidBookticketFace(){
inta3;
intloop3;
loop3:
{
system("cls");
printf("\n");
printf("\n");
printf("WelcomeTo订票模块\n");
printf("-----------------------------------------------\n");
printf("|1.客户订票|\n");
printf("|2.根据起点和终点搜索航班|\n");
printf("|3.查询所有航班|\n");
printf("|4.通过航班ID查询订票客户名单|\n");
printf("|5.返回上一级菜单|\n");
printf("------------------------------------------------\n");
printf("请输入您的选择:");
scanf("%d",&a3);
}
switch(a3){
case1:
//订票
BookTickets();
system("PAUSE");
BookticketFace();
break;
case2:
//输入起点和终点查询
SearchFlight();
system("PAUSE");
BookticketFace();
break;
case3:
PrintFilghtlist(pFlight);
BookticketFace();
break;
case4:
//为了保密,只能查到客户的姓名和订票量,查不到身份证
PriCusInfo();
system("PAUSE");
BookticketFace();
break;
case5:
MenuSelect();
break;
default:
gotoloop3;
}
}

  • 11
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白不会debug

需要源码打个赏呗~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值