实例介绍
3.退票
【实例截图】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <iostream>
#define MAXSIZE 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 /*乘员名单*/
{
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或3):");
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("\t订票系统\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;
}
int 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 (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(); /*任意键继续*/
return 0;
}
}
标签: 航空机票订票系统
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论