订机票订机票
#include #include #include #include #include #define MAXSIZE 5//定义航班数最多为5 typedef struct wat_ros{ //在单链队列中等候替补的人员信息
char name[10];//姓名
int req_amt;//订票量
struct wat_ros*next; }qnode,*qptr;
typedef struct pqueue{//等待候补的客户名单
qptr front;//队头指针
qptr rear;//队尾指...
订机票
#include
#include #include #include #include #define MAXSIZE 5//定义航班数最多为5 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{ //成员名单
int ord_amt;//订票量
char name[10];//客户姓名
int grade;//舱位等位
struct ord_ros*next; }linklist;
struct airline{
char ter_name[10];//终点站的名字
char air_num[10];//航班号
char time[10];//飞行时间
char pri[7];//票价
int tkt_amt;//乘务定额
int tkt_aur;//余票量
linklist *order;//乘员名单域,指向乘务名单的头指针
linkqueue wait;//等待候补的客户名单,分别指向等待候补的客户名单的队头队尾
}lineinfo;
struct airline*start; void display(struct airline*info){//打印每条航线的基本信息
printf("%s %s %s %s %d %d\n",info->ter_name ,info->air_num ,
info->time ,info->pri ,info->tkt_amt ,info->tkt_aur );
}
void list(){//打印全部航线的信息
struct airline*info;
int i=0;
info=start;
printf("终点站名 航班号 飞行时间 票价 乘务定额 余票量\n");
while(iter_name )){//名字匹配则返回,如果if(~)则break
break;
}
info++;
i++;
}
if(i>=MAXSIZE){//没有匹配的航线
printf("对不起,没有您要找的航线\n");
}
else{
printf("终点站名 航班号 飞行时间 票价 乘务定额 余票量\n");
display(info);//调出display函数输出航线基本信息
}
}
struct airline*find(){//根据系统提出的航班号查询并以指针返回
struct airline*info;
info=start;
char number[10];
int i=0;
printf("请输入航班号:");
scanf("%s",&number);
while(iair_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 %d %d",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,*new1;
p1=head;
new1=(linklist*)malloc(sizeof(linklist));
if(!new1){//储存空间不足
printf("out of memory\n");
return NULL;
}
strcpy(new1->name ,name);
new1->ord_amt =amount;
new1->grade =grade;
new1->next =NULL;
if(head==NULL){//若原订票系统客户信息为空
head=new1;
new1->next =NULL;
}
else{
head=new1;
}
new1->next =p1;
return head;
}
linkqueue appendqueue(linkqueue q,char name[],int amount)
{//增加排队等候的客户名单
qptr new1;
new1=(qptr)malloc(sizeof(qnode));
strcpy(new1->name,name);
new1->req_amt =amount;
new1->next =NULL;
if(q.front ==NULL)//若原来排队等候客户名单为空
{
q.front =new1;
}
else{
q.rear ->next =new1;
}
q.rear =new1;
return q;
}
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");
return;
}
if(amount<=info->tkt_aur ){//订票量小于等于余票量,订票成功,等级信息
int i;
printf("请输入姓名:");
scanf("%s",&name);
printf("请输入您所需舱位等级:");
scanf("%d",&grade);
info->order =insertlink(info->order ,amount,name,grade);//在订票乘员名单中添加客
户信息
for(i=0;itkt_amt -info->tkt_aur +i+1);
}
info->tkt_aur -=amount;//余票量等于之前的减去客户订票量
}
else{//若满员或订票量多余余票额,询问客户是否需要排队等候
char r;
printf("没有这么多票了,您需要排队吗");
r=getch();
printf("%c",r);
if(r=='y'||r=='Y'){
printf("请输入您的姓名:");
scanf("%s",&name);
info->wait =appendqueue(info->wait ,name,amount);//在排队等候乘员名单域中
添加客户信息
printf("您已添加队列成功\n");
}
else{
printf("欢迎再次订购\n");
}
}
}
void return_tkt(){//退票
struct airline*info;
qnode*t,*back,*f,*r;
int grade;
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{//若信息查询成功,则删除订票域中客户信息
if(p1==head){
head=p1->next ;
}
else{
p2->next =p1->next ;
}
info->tkt_aur +=p1->ord_amt ;
grade=p1->grade ;
printf("退票成功\n",p1->name );
free(p1);
}
info->order =head;//重新将航线名单域指向订票单链表的头指针
f=(info->wait ).front ;//f指向排队等候名单队列的头结点
r=(info->wait ).rear ;//r指向排队等候名单队列的尾结点
t=f;//t为当前满点条件的排队候补名旦域
while(t){
if(info->tkt_aur >=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_aur )-i);
}
info->tkt_aur =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_aur )>=(t->req_amt )&&t!=NULL){//若满足条件者不为头结点
int i;
back->next =t->next ;
printf("%s订票成功\n",t->name );
for(i=0;ireq_amt ;i++){//输出座位号
printf("<%s>的座位号是:%d\n",t->name ,(info->tkt_aur )-i);
}
info->tkt_aur =t->req_amt ;
info->order =insertlink(info->order ,t->req_amt ,t->name ,grade);
//插到订票客户名单链表中
free(t);
break;
}
if(f==r){
break;
}
}
}
int meun_select(){//菜单界面
int c;
char s[20];
printf("订票系统\n");
printf("~~~~~~~~~~~~~~~~~~~~\n");
printf("1.查看航线信息\n");
printf("2.查看已订票客户信息\n");
printf("3.查询航线\n");
printf("4.办理订票业务\n");
printf("5.办理退票业务\n");
printf("6.退出系统\n");
printf("~~~~~~~~~~~~~~~~~~~~\n");
do{
printf("请选择1-6:");
scanf("%s",&s);
c=atoi(s);
}while(c<1||c>6);
return c;
}
void main(){
struct airline air[MAXSIZE]= //初始化航线信息
{
{"beijing","1","1200","860",30,30},
{"shanghai","2","1000","770",20,20},
{"london","3","1330","960",10,10},
{"harbin","4","1700","760",50,50},
{"dalian","5","1400","550",40,40}
};
start=air;
for(;;){//无限循环
system("cls");//清空屏幕
switch(meun_select()){
case 1:list();//打印全部航线信息
break;
case 2:prtlink();//浏览已订票客户信息
break;
case 3:search();//查询航线
break;
case 4:order();//订票
break;
case 5:return_tkt();//退票
break;
case 6:printf("感谢您的使用,再见\n");//退出系统
exit(0);//正常退出程序
}
printf("任意键继续\n");
getch();
}
}
本文档为【订机票】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。