赞
踩
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<conio.h>
- #include<iostream>
- #define MAXSIZE 5/*定义航线数量,可修改*/
- typedef struct wat_ros /*单链队列存储等候替补的客户信息*/
- {a
- 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 time[10];/*飞机时间*/
- char pri[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\t%4s\t%3d\t%10d\n",info->ter_name,info->air_num,info->time,info->pri,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);/*调用display函数来输出*/
- 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))/*有该站名strcmp则返回,if(!0)即break*/
- {
- break;
- }
- info++;
- i++;
- }
- if(i>=MAXSIZE)/*没有匹配的航线*/
- {
- printf("对不起,没有这条航线!\n");
- }
- else
- {
- printf("终点站名\t航班号\t飞行时间\t票价\t乘员定额\t余票量\n");
- display(info);/*调用display函数输出航线信息*/
- }
- }
- 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,*new1;
- p1=head;
- new1=(linklist*)malloc(sizeof(linklist));
- if(!new1)/*存储空间不足*/
- {
- printf("\nOut 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_sur) /*若客户订票额末超过余票量,订票成功并等记信息*/
- {
- int i;
- printf("请输入您的姓名:");
- scanf("%s",name);
- printf("请输入您需要的舱位等级(1,2或):");
- 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)");
- r=getch();
- printf("%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;
- 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_sur+=p1->ord_amt;
- grade=p1->grade;
- printf("%s退票成功!\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_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("%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];
- printf("\ 航空订票系统 \n");
- 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},
- {"linyi","3","1330","960",10,10},
- {"guangzhou","4","1700","760",50,50},
- {"dalian","5","1400","550",40,40},
- };
- start=air;
- for(;;)/*无限循环(除非用户选择.退出)*/
- {
- system("cls");/*清空屏幕*/
- 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:printf("\n感谢您的使用,再见!\n"); /*退出系统*/
- exit(0); /*正常退出程序*/
- }
- printf("\n任意键继续...\n");
- getch();/*任意键继续*/
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。