飞机订票系统

飞机订票系统

摘要

随着时代的进步社会分工的不断细化,各个行业联系的不断密切,人们出行越来越多,出行的方式也是多种多样,作为空中重要的交通工具,飞机航空系统也在不断地得到优化,其中重要的一项就是航空飞机订票系统,因此好的订票系统关系着人们的日常出行方便与否,设计并编制出符合人们需要的航空订票系统是一项繁重而艰巨的任务。

本文使用Dev-C++ 作为程序代码的实现软件,进行飞机订票系统的数据结构课程设计。首先,根据课程设计内容进行需求分析,确定主要的功能模块。然后进行数据结构、各功能模块算法以及它们之间的调用关系的概要设计,做出各信息模块的数据结构表,并给出所用的结构体和结点类型。在此基础上,进行各功能模块的详细算法设计,做出各算法的流程图。最后,对系统进行测试,分为合法数据测试和非法数据测试,并对测试结果截图保存。本系统包含浏览航线信息(信息的录入在main函数中)、浏览已订票客户信息,查询航线、订票、退票和退出系统6 个基本功能,经测试性能良好。

关键词:飞机订票系统 数据结构 C语言 队列 单链表

目录

飞机订票系统… 1

摘 要… 1

目 录… 2

§1项目背景… 3

§2项目分析… 3

§3需求分析… 4

3.1、用户需求分析… 4

3.2、功能需求分析… 4

§4概要设计… 5

§5详细设计… 6

5.1、浏览航线信息… 7

5.2、浏览已订票客户信息… 8

5.3、查询航线… 9

5.4、办理订票业务… 10

5.5、办理退票业务… 11

5.6、菜单界面的制定… 12

§6编码实现… 13

§7实验结果与分析… 14

§8总结… 15

1.项目背景

飞机订票系统是一种新兴的现代商务方式,近几年来得到了迅速发展,显现了巨大的现代业价值。有理由相信,订票系统将逐渐方便社会生活,也将成为数字化社会的一种重要体现。它改变了传统的买卖双方面堆满的交流方式,也打破了旧有工作经营模式,它通过网络使航空公司面对整个世界,为用户提供每周
7
天,每天 24 小时的全天候服务订票的规模正在逐年迅速增长,它带来的商机是巨大而深远的。订票系统研究的主攻方是通过公共计算机通信网络进行网上订票活动,突破传统商务在时间、地域上的限制,为方便、快捷、安全可靠的新兴电子化商务活动模式。是网上订票活动更安全、可靠、快速、明确和方便。

对航空公司来说,航空订票管理系统既能扩大服务范围,扩大公司影响,减少营业费又对稳固航空公司的客源有着重要的辅助作用;站在旅客的角度,航空公提供的这种服务提供了更多的方便,节省了很多时间。建设航空订票管理系统是体现和提高航空公领导业绩的一条捷径。

2.项目分析

通过此系统可以实现如下功能:

本系统包含浏览航线信息(信息的录入在main函数中)、浏览已订票客户信息,查询航线、订票、退票和退出系统6 个基本功能,经测试性能良好。

录入:可以录入航班情况(数据可以存储在一个数文件中,数据结构、具体数据自定)

查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;

订票:可以订票,如果该航班已经无票,可以提供相关可选择航班;(订票情况可以存在一个数据文件

中,结构自己设定)

退票:可退票,退票后修改相关数据文件;

修改航班信息:当航班信息改变可以修改航班数据文件

3.需求分析

3.1用户需求分析

用户使用此程序所要完成的工作主要为:录入和查询所有航线信息、查看已订票客户信息、查询航线、办理订票业务、办理退票业务。通过此系统可以方便的进行上述工作。每条航线所涉及的信息有:终点站名、航班号、飞行时间、票价、乘员定额、余票量。已订票的客户名单信息包括姓名、订票量、舱位等级( 1, 2 或 3)。等候替补的客户名单信息包括姓名、所需票量。查询航线功能可以根据旅客提出的终点站名输出航班号、飞行时间、票价、乘员定额、余票量。订票业务功能根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若尚

有余票,则为客户办理订票手续,输出座位号;若已满员或余票额少于定票额,则需重新询问客户要求。若需要,可登记排队候补购票。退票业务功能根据客户提供的情况(航班号、姓名)为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队候补的客户

3.2功能需求分析

1.功能模块内容

(1).将航班的基本信息录入到系统中。

(2)根据航班号或者根据起飞地点、降落地点查询所需航班信息。

(3)输入姓名和所要订航班的航班号订票。

(4)输入姓名和所订航班的航班号办理退票

(5)输入航班号,修改该航班的起飞和降落时间以修改航班的起降时间。

(6)退出的同时将信息写入文件。

(注:上述功能需求分析在本设计的系统中的并不是全部体现出来)

2功能模块图
在这里插入图片描述

4.概要设计

1.航班的信息:航班的情况存储结构采用单链表和单链队列,每个元素表示一个航班的情况,包括航班号、终点站名、飞机号、飞行日期、乘员定额、余票量六个数据项,即:

struct airline

{
char ter_name[10];/*终点站名 */

char air_num[10];/航班号/

char plane_num[10];/飞机号/

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

int tkt_amt;/乘员定额/

int tkt_sur;/余票量/

linklist *order;/乘员名单域,指向乘员名单链表的头指针/

linkqueue wait;/等候替补的客户名单域,分别指向排队等候名单队头队尾的指针/

}lineinfo;

struct airline *start;

2.乘客的订票信息:乘客的情况储存结构采用单链表,有客户姓名、舱位等级、订票量三个数据项,即:

typedef struct ord_ros

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

int ord_amt;/订票量/

int grade;/舱位等级/

struct ord_ros *next;

}linklist;

订票系统数据结构表:

数据项

数据类型

航班号

字符串(char)

终点站名

字符串(char)

飞机号

字符串(char)

飞行日期

字符串(char)

乘员定额

整型(int)

余票量

整型(int)

客户姓名

字符串(char)

舱位等级

整型(int)

订票量

整型(int)

5.详细设计

根据3中的功能需求分析和4中的概要设计,以及数据类型结构,进行下述的详细设计:

5.1浏览航线信息

在飞机订票系统中,功能1就是航线信息的浏览,在编译时输入“1”查询航线信息。首先,定义函数void display(struct airline
*info)打印出每条航线的基本信息,

(info->ter_name,info->air_num,info->plane_num,info->day,info->tkt_amt,info->tkt_sur),然后根据函数void list()调用函数void display打印出全部航线信息,总共有MAXSIZE条航线,根据函数display中的指针info,由info=start输出信息printf(“终点站名\t航班号\t飞机号\t飞行周日\t乘员定额\t余票量\n”)。

/打印全部航线信息/

void list()

{

struct
airline *info;

int i=0;

info=start;

printf(“终点站名\t航班号\t飞机号\t飞行周日\t乘员定额\t余票量\n”);

while(i<MAXSIZE){

display(info);

info++;

i++;

}

printf("\n\n");

}

5.2浏览已订票客户信息

在飞机订票系统中,功能2就是浏览已订票客户的信息,在编译时输入“2”查询已订票客户信息。已订票的客户信息是根据航班号来查询的,找寻所有航班中的客户姓名,订票数,舱位等级。定义struct airline *find()来查询航班号是否存在,语句while(i<MAXSIZE)
{ if(!strcmp(number,info->air_num)) return info; info++; i++;}判断航线是否存在。定义函数void
prtlink()来查询订票客户名单信息,同时此处需要调用struct airline *find()得知航线,定义链表元素linklist *p;,并判空,指向下一个指针p=p->next;,找出所有乘客printf(“客户姓名 订票数额 舱位等级\n”);

/打印订票乘员名单域的客户名单信息/

void prtlink()

{

linklist
*p;

struct airline *info;

info=find();

p=info->order;

if(p!=NULL){

  printf("客户姓名   订票数额   舱位等级\n");

   while(p){

printf("%s\t\t%d\t%d\n",p->name,p->ord_amt,p->grade);

     p=p->next;

    }

}

else

printf(“该航线没有客户信息!!\n”);

}

5.3查询航线

在飞机订票系统中,功能3就是查询航线,在编译时输入“3”查询航线信息。查询航线时是根据客户提出的终点站名查询航线信息,因此需要输入的终点站进行判断,如果终点站名字不对,则会报错。然后调用函数display()输出所有航线信息,代码如下:

void search()

{
struct airline *info,*find();

char name[10];

int i=0;

info=start;

printf(“请输入终点站名:”);

scanf("%s",name);

while(i<MAXSIZE) {

if(!strcmp(name,info->ter_name)) break;

info++;

i++;

}

if(i>=MAXSIZE)

printf(“对不起,该航线未找到!\n”);

else{

printf(“终点站名\t航班号\t飞机号\t飞行周日\t乘员定额\t余票量\n”);

display(info);

}

}

5.4办理订票业务

1.在飞机订票系统中,功能4就是办理订票业务,在编译时输入“4”进行订票业务办理。在办理订票时可能存在余票不足的情况,因此咨询用户是否愿意排队等候。定义linklist *insertlink(linklist *head,int amount,char name[],int
grade)来加订票乘员名单域的客户信息,用 malloc 函数申请一个航班结点, 并将客户信息赋到新申请的结点中

NEW->ord_amt=amount;NEW->grade=grade;

NEW->next=NULL;head=NEW;
NEW->next=p1; 该操作将该结点插入航班链表中。在由此增加排队等候的客户名单linkqueue
appendqueue(linkqueue q,char name[],int amount)

/增加订票乘员名单域的客户信息/

linklist *insertlink(linklist *head,int
amount,char name[],int grade)

{

linklist
*p1,*NEW;

p1=head;

NEW=(linklist *)malloc(sizeof(linklist));

if(!NEW) {printf("\nOut of memory!!\n");return NULL;}

strcpy(NEW->name,name);

NEW->ord_amt=amount;

NEW->grade=grade;

NEW->next=NULL;

if(head==NULL)/若原无订票客户信息/

{head=NEW;NEW->next=NULL;}

else

head=NEW;

NEW->next=p1;

return head;

}//insertlink ending

2.当航班票的剩余量还足够时,办理订票业务要根据客户提供的航班号进行查询

if(!(info=find())) ,如为空,退出该模块。如果客户订票额超过乘员定票总额,退出if(amount>info->tkt_amt)。如果客户订票额末超过余票量if(amount<=info->tkt_sur),然后添加订票成功并等记信息,在订票乘员名单

域中添加客户信息info->order=insertlink(info->order,amount,name,

grade); 再依次输出该订票客户的座位号,用语句遍历for(i=0;i<amount;i++) ,流程图如下:
在这里插入图片描述

5.5办理退票业务

在飞机订票系统中,功能5就是办理退票业务,在编译时输入“5”进行退票业务办理。

用查询函数,根据客户提供的航线进行搜索if(!(info=find()))
return;

然后根据客户提供的姓名到订票客户名单域进行查询while(p1!=NULL)

若信息查询成功,删除订票客户名单域中的信息 info->tkt_sur+=num; 若未找到,退出本模块。info->order=head;重新将航线名单域指向订票单链表的头指针 。f=(info->wait).front;f指向排队等候名单队列的头结点

r=(info->wait).rear;r指向排队等候名单队列的尾结点;t=f;t为当前满点条件的排队候补名单域。

找到匹配航班号的航班结点,根据航班号,姓名,退票数量修改退票删除要退票的客户订单。如果没有找到匹配的客户结点,输出提示信息,定义函数删除客户信息,同时修改后插入到订票客户名单链表中info->order=insertlink(info->order,t->req_amt,t->name,grade);完成退票。

/退票模块/

void return_tkt()

{
struct airline *info;

qnode *t,*back,*f,*r;

int grade,num;

linklist *p1,*p2,*head;

char cusname[10];

if(!(info=find())) return;/调用查询函数,根据客户提供的航线进行搜索/

head=info->order;

p1=head;

printf(“请输入你的姓名(退票客户):”);

scanf("%s",cusname);

while(p1!=NULL) {/根据客户提供的姓名到订票客户名单域进行查询/

if(!strcmp(cusname,p1->name)) break;

p2=p1;p1=p1->next;

}

if(p1==NULL){ printf(“对不起,你没有订过票!\n”);return;}/若未找到,退出本模块/

else{/若信息查询成功,删除订票客户名单域中的信息/

printf(“您的订票量为:%d\n”,p1->ord_amt);

printf(“请输入您的退票数量:”);

scanf("%d",&num);

if(p1==head)

{ grade=p1->grade;

if(p1->ord_amt==num) {head=p1->next;free(p1);}

else

{

if(p1->ord_amt>num) head->ord_amt-=num;

}

}

else

{

if(p1->ord_amt==num) {p2->next=p1->next;free(p1);}

else

{

if(p1->ord_amt>num) p1->ord_amt-=num;

}

}

info->tkt_sur+=num;

printf("\n成功退票!\n");

}

info->order=head;/*重新将航线名单域指向订票单链表的头指针 */

f=(info->wait).front;/f指向排队等候名单队列的头结点/

r=(info->wait).rear;/r指向排队等候名单队列的尾结点/

t=f;/t为当前满点条件的排队候补名单域/

while(t)

{

if(info->tkt_sur>=info->wait.front->req_amt){/若满足条件者为头结点/

int i;

info->wait.front=t->next;

printf("%s订票成功!\n",t->name);

for(i=0;ireq_amt;i++)/输出座位号/

printf("%s的座位号是:%d\n",t->name,(info->tkt_sur)-i);

info->tkt_sur-=t->req_amt;

info->order=insertlink(info->order,t->req_amt,t->name,grade);/插入到订票客户名单链表中/

free(t);

break;

}

back=t;t=t->next;

if((info->tkt_sur)>=(t->req_amt)&&t!=NULL)/若满足条件者不为头结点/

{ int i;

back->next=t->next;

printf("\n\t%s订票成功!\n",t->name);

for(i=0;ireq_amt;i++)/输出座位号/

printf("<%s>'s seat number
is:%d\n",t->name,(info->tkt_sur)-i);

info->tkt_sur-=t->req_amt;

info->order=insertlink(info->order,t->req_amt,t->name,grade);/插入到订票客户名单链表中/

free(t);break;

}

if(f==r) break;

}

}

5.6菜单界面的制定

根据上述的五大功能,最后为飞机订票系统制定退出系统功能模块,制作系统界面,使得整个界面系统化,界面示意图如下:
在这里插入图片描述

6.编码实现

整个飞机订票系统的设计,各功能模板函数之间的调用关系如下:

void display(struct airline *info) /打印每条航线的基本信息/

void list() /*打印全部航线信息 */

void search()/根据客户提出的终点站名输出航线信息/

struct airline *find()/根据系统提出的航班号查询并以指针形式返回/

void prtlink()/打印订票乘员名单域的客户名单信息/

linklist *insertlink(linklist *head,int
amount,char name[],int grade) /增加订票乘员名单域的客户信息/

linkqueue appendqueue(linkqueue q,char
name[],int amount) /增加排队等候的客户名单域/

void order()/办理订票业务/

void return_tkt()/退票模块/

int menu_select()/菜单界面/

7.实验结果与分析

(1)输入菜单号“1”,浏览全部航班信息
在这里插入图片描述
根据设置的MAXSIZE值为3,总共有3条航线,同时每一条航线的相关信息都展示出来。

(2)输入菜单号“2”,浏览已订票客户信息
在这里插入图片描述
观察上述三条航线的订票客户信息,发现每一条航线都没有客户信息,因此推测是没有录入客户信息。那么,客户信息如何录入?在本系统中,客户信息测录入是通过功能“4”办理订票业务录入的。
在这里插入图片描述

当输入的航班号不存在时,会出现报错的信息并退出系统。

(3)输入菜单号“3”,查询航线:
在这里插入图片描述

根据输入航线的终点站名查询航线的信息,当输入的航线终点站名不在已有的航线内时,会出现报错信息。

(4)输入菜单号“4”,办理订票业务
在这里插入图片描述

订票时,需要根据客户的所要乘的航班、订票数量和舱位等级决定。
在这里插入图片描述

当购票时航班号和订票数量都不对时,系统会提醒报错信息。
在这里插入图片描述

当余票不足时,系统会提醒是否需要排队等票。
在这里插入图片描述

当有乘客已经购票时,此时使用功能“2”查询已购票的客户信息,就会一一呈现出来客户姓名、订票数量和舱位等级。

(5)输入菜单号“5”,办理退票业务
在这里插入图片描述
在办理退票时,如果输入的姓名和航班号不对,则系统会提醒您出现没有购票。退票过程是根据订票人的姓名和航班号决定的。

8.总结

在设计飞机订票系统时,总体功能把握良好,系统的使用性能一般。其中出现了下列问题:(1)在录入乘客的信息时是通过功能“4”办理订票业务间接录入的,应从新需要设计一个功能录入乘客信息会更好。(2)在办理订票业务时,发现没有根据客户的证件信息。(3)在办理订票业务时,对舱位的要求设计出现问题,舱位等级超出已有的等级没有用报错,可能是此处在实际生活中只有三个等级的原因。

附录:所有代码的呈现

//c语言代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 3 /*定义航线量的最大值*/
 
typedef struct wat_ros
{  char name[10];/*姓名*/
   int req_amt;/*订票量*/
   struct wat_ros *next;
}qnode,*qptr;
 
typedef struct pqueue  /*定义单链队列*/
{  qptr front;/*等候替补客户名单域的头指针*/
   qptr rear;/*等候替补客户名单域的尾指针*/
}linkqueue;
 
typedef struct ord_ros
{  char name[10];/*客户姓名*/
   int ord_amt;/*订票量*/
   int grade;/*舱位等级*/
   struct ord_ros *next;
}linklist;
 
struct airline
{   char ter_name[10];/*终点站名 */
    char air_num[10];/*航班号*/
    char plane_num[10];/*飞机号*/
    char day[7];/*飞行周日(星期几)*/
    int tkt_amt;/*乘员定额*/
    int tkt_sur;/*余票量*/
    linklist *order;/*乘员名单域,指向乘员名单链表的头指针*/
    linkqueue wait;/*等候替补的客户名单域,分别指向排队等候名单队头队尾的指针*/
}lineinfo;
struct airline *start;


/*打印每条航线的基本信息*/ 
void display(struct airline *info)
{
	printf("%8s\t%3s\t%s\t%4s\t\t%3d\t%10d\n",
		info->ter_name,info->air_num,info->plane_num,info->day,info->tkt_amt,info->tkt_sur);
}

 /*打印全部航线信息
 */
void list()
{  
	struct airline *info;
   int i=0;
   info=start;
   printf("终点站名\t航班号\t飞机号\t飞行周日\t乘员定额\t余票量\n");
   while(i<MAXSIZE){
     display(info);
     info++;
     i++;
   }
   printf("\n\n");
}
 
/*根据客户提出的终点站名输出航线信息*/ 
void search()
{  struct airline *info,*find();
   char name[10];
   int i=0;
   info=start;
   printf("请输入终点站名:");
   scanf("%s",name);
   while(i<MAXSIZE) {
     if(!strcmp(name,info->ter_name)) break;
     info++;
     i++;
   }
   if(i>=MAXSIZE)
     printf("对不起,该航线未找到!\n");
   else{
     printf("终点站名\t航班号\t飞机号\t飞行周日\t乘员定额\t余票量\n");
     display(info);
   }
}


/*根据系统提出的航班号查询并以指针形式返回*/ 
struct airline *find()
{  
	struct airline *info;
   char number[10];
   int i=0;
   info=start;
   printf("请输入航班号:");
   scanf("%s",number);
   while(i<MAXSIZE) {
     if(!strcmp(number,info->air_num)) return info;
     info++;
     i++;
   }
   printf("对不起,该航线末找到!\n");
   return NULL;
}

 /*
 打印订票乘员名单域的客户名单信息
 */
void prtlink()
{  
	linklist *p;
   struct airline *info;
   info=find();
   p=info->order;
   if(p!=NULL){
	   printf("客户姓名   订票数额   舱位等级\n");
	    while(p){
	      printf("%s\t\t%d\t%d\n",p->name,p->ord_amt,p->grade);
	      p=p->next;
	     }
    }
   else
      printf("该航线没有客户信息!!\n");
}

 /*增加订票乘员名单域的客户信息*/
linklist *insertlink(linklist *head,int amount,char name[],int grade)
{  
	linklist *p1,*NEW;
   p1=head;
   NEW=(linklist *)malloc(sizeof(linklist));
   if(!NEW) {printf("\nOut of memory!!\n");return NULL;}
   strcpy(NEW->name,name);
   NEW->ord_amt=amount;
   NEW->grade=grade;
   NEW->next=NULL;
   if(head==NULL)/*若原无订票客户信息*/
     {head=NEW;NEW->next=NULL;}
   else
     head=NEW;
     NEW->next=p1;
   return head;
}//insertlink ending 


/*增加排队等候的客户名单域*/ 
linkqueue appendqueue(linkqueue q,char name[],int amount)
{ qptr NEW;
  NEW=(qptr)malloc(sizeof(qnode));
  strcpy(NEW->name,name);
  NEW->req_amt=amount;
  NEW->next=NULL;
  if(q.front==NULL)/*若原排队等候客户名单域为空*/
    q.front=NEW;
  else
    q.rear->next=NEW;
  q.rear=NEW;
  return q;
}//appendqueue ending


/*办理订票业务*/ 
void order()
{  
	struct airline *info;
   int amount,grade;
   char name[10];
   info=start;
   if(!(info=find())) return;/*根据客户提供的航班号进行查询,如为空,退出该模块*/
   printf("请输入您订票的数量:");
   scanf("%d",&amount);
   if(amount>info->tkt_amt)/*若客户订票额超过乘员定票总额,退出*/
   {  
   	printf("\n对不起,您输入订票的数量已经超过乘员定额!\n");
      return;
   }
   if(amount<=info->tkt_sur)/*若客户订票额末超过余票量,订票成功并等记信息*/
   {
     int i;
  	printf("请输入您的姓名(订票客户):");
     scanf("%s",name);
  	printf("请输入%s票的舱位等级:",name);
     scanf("%d",&grade);
     info->order=insertlink(info->order,amount,name,grade);/*在订票乘员名单域中添加客户信息*/
     for(i=0;i<amount;i++)/*依次输出该订票客户的座位号*/
       printf("%s的座位号是:%d\n",name,info->tkt_amt-info->tkt_sur+i+1);
     info->tkt_sur-=amount;/*该航线的余票量应减掉该客户的订票量*/
  printf("\n订票成功,祝您旅途愉快!\n");
   }
   else       /*若满员或余票额少于订票额,询问客户是否需要进行排队等候*/
   {  char r;
   printf("\n已经没有更多的票,您需要排队等候吗?(需要请按'Y',若不需要请按'N')");
   fflush(stdin);
   scanf("%c", &r);
   if(r=='Y'||r=='y')
   {  printf("\n请输入您的姓名(排队订票客户):");
         scanf("%s",name);
      info->wait=appendqueue(info->wait,name,amount);/*在排队等候乘员名单域中添加客户信息*/
      printf("\n注册成功!\n");
   }
   else printf("\n欢迎您下次再次订购!\n");
    }
}

 /*退票模块
 */
void return_tkt()
{  struct airline *info;
   qnode *t,*back,*f,*r;
   int grade,num;
   linklist *p1,*p2,*head;
   char cusname[10];
   if(!(info=find())) return;/*调用查询函数,根据客户提供的航线进行搜索*/
   head=info->order;
   p1=head;
   printf("请输入你的姓名(退票客户):");
   scanf("%s",cusname);
   while(p1!=NULL) {/*根据客户提供的姓名到订票客户名单域进行查询*/
     if(!strcmp(cusname,p1->name)) break;
     p2=p1;p1=p1->next;
   }
  if(p1==NULL){ printf("对不起,你没有订过票!\n");return;}/*若未找到,退出本模块*/
   else{/*若信息查询成功,删除订票客户名单域中的信息*/
        printf("您的订票量为:%d\n",p1->ord_amt);
        printf("请输入您的退票数量:");
        scanf("%d",&num);
        if(p1==head)
        {    grade=p1->grade;
          if(p1->ord_amt==num) {head=p1->next;free(p1);}
          else
          {
            if(p1->ord_amt>num) head->ord_amt-=num;
          }
        }
        else
        {
           if(p1->ord_amt==num) {p2->next=p1->next;free(p1);}
          else
          {
            if(p1->ord_amt>num) p1->ord_amt-=num;
          }
        }
        info->tkt_sur+=num;
 
        printf("\n成功退票!\n");
   }
   info->order=head;/*重新将航线名单域指向订票单链表的头指针 */
   f=(info->wait).front;/*f指向排队等候名单队列的头结点*/
   r=(info->wait).rear;/*r指向排队等候名单队列的尾结点*/
   t=f;/*t为当前满点条件的排队候补名单域*/
   while(t)
   {
    if(info->tkt_sur>=info->wait.front->req_amt){/*若满足条件者为头结点*/
    int i;
    info->wait.front=t->next;
    printf("%s订票成功!\n",t->name);
    for(i=0;i<t->req_amt;i++)/*输出座位号*/
         printf("%s的座位号是:%d\n",t->name,(info->tkt_sur)-i);
    info->tkt_sur-=t->req_amt;
          info->order=insertlink(info->order,t->req_amt,t->name,grade);/*插入到订票客户名单链表中*/
    free(t);
    break;
   }
      back=t;t=t->next;
      if((info->tkt_sur)>=(t->req_amt)&&t!=NULL)/*若满足条件者不为头结点*/
      {  int i;
      back->next=t->next;
   printf("\n\t%s订票成功!\n",t->name);
      for(i=0;i<t->req_amt;i++)/*输出座位号*/
         printf("<%s>'s seat number is:%d\n",t->name,(info->tkt_sur)-i);
      info->tkt_sur-=t->req_amt;
   info->order=insertlink(info->order,t->req_amt,t->name,grade);/*插入到订票客户名单链表中*/
      free(t);break;
   }
   if(f==r) break;
   }
}

/*菜单界面*/ 
int menu_select()
{
   int c;
   char s[20];
   puts("================================================================================\n "
            "-----------------------    欢迎使用航空客运订票系统     ----------------------   \n"
            "================================================================================ \n"
            "                                                              \n"
            "                            * * * * * * * * * * * * *         \n"
            "                                                              \n"
            "                               1.浏览航线信息                 \n"
	    	"                               2.浏览已订票客户信息           \n"
            "                               3.查询航线           	       \n"
            "                               4.办理订票业务                 \n"
            "                               5.办理退票业务                 \n"
	    	"                               6.退出系统                     \n"
            "                                                              \n"
            "                            * * * * * * * * * * * * *                           \n\n\n"           "================================================================================ ");
   do{
     printf("                             请选择并按回车键结束:");
     scanf("%s",s);
     c=atoi(s);
   }while(c<0||c>7);
   return c;
}
 
int main(void) 
{  
	struct airline air[MAXSIZE]={
		{"beijing","1","B8571","SUN",3,3},
	    {"shanghai","2","S1002","MON",2,2},
	    {"london","3","L1003","FRI",1,1}
	};/*初始化航线信息*/
 /*  clrscr();*/
  start=air;
  for(;;){
    switch(menu_select()){
       case 1:list();break;
       case 2:prtlink();break;
       case 3:search();break;
       case 4:order();break;
       case 5:return_tkt();break;
       case 6: exit(0);
    }
 }
}
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值