航空订票系统
目录
1 实习目的 ................................................................ 1 2 问
描述 ................................................................ 1 3 需求
................................................................ 1 4 概要设计 ................................................................ 2
4.1功能模块图 ......................................................... 2
4.2 函数及功能要求 .................................................... 2
4.3功能模块说明 ....................................................... 3
4.3.1用户模块 ..................................................... 3
4.3.2管理员模块 ................................................... 4 5 详细设计 ................................................................ 4
5.1用户办理业务模块 ................................................... 4
5.1.1 查询航线 ..................................................... 4
5.1.2订票业务 ..................................................... 5
5.1.3 退票业务 ..................................................... 7
5.2 管理员操作模块 .................................................... 9
5.2.1 管理员修改密码 ............................................... 9
5.2.2管理员增加航线 .............................................. 10
5.2.3 管理员删除航线 .............................................. 12
5.2.4 管理员修改票价和折扣 ........................................ 12 6 测试分析 ............................................................... 15
6.1 操作员管理功能 ................................................... 15
6.2 使用说明 ......................................................... 15 7
................................................................... 16 8 参考文献 ............................................................... 17 9 附录 程序源代码 ........................................................ 18
i
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
航空订票系统
1 实习目的
(1)(数据结构课程设计是综合运用数据结构课程中学到的几种典型数据结构,以及程序设计语言(C语言),自行实现一个较为完整的应用系统的设计与开发
(2)(通过课程设计,自己通过系统分析、系统设计、编程调试,写实验
等环节,进一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解典型数据结构在软件开发中的应用 。
(3)(训练学生灵活运用所学数据结构知识独立完成问题分析结合数据结构理论知识编写程序求解指定问题
(4).学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力。
航空空订票系统:
a)熟练掌握链表存储结构及其建立过程和常用操作;
b)熟练掌握队列的建立过程和常用操作;
c)学会自己调试程序的方法并掌握一定的技巧。
2 问题描述
飞机订票的业务活动包括:查询航线、客票预订和办理退票等。设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。同时这个系统能够方便航空公司管理员管理订票,提高工作效率并且在管理首页增加密码,加强了系统的安全性。 3 需求分析
(1)( 每条航线所涉及的信息有:起点站名、终点站名、航班号、折扣、乘员定额、余票量、已订票的客户名单信息(包括姓名、订票量、舱位等级1,2或3)以及等候替补的客户名单(包括姓名、所需票量);
(2)( 系统能实现的操作和功能如下:
a):办理订票业务:
根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若尚有余票,则为客户办理订票手续,输出座位号;若已满员或余票额少于定票额,则需重新询问客户要求。若需要,可登记排队候补;
b):办理退票业务
根据客户提供的情况(日期、航班),为客户办理退票手续,然后查询该航班是
1
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队候补的客户。
c):查询航线信息
根据旅客提出的终点站名输出下列信息:航班号、哪天飞行,最近一天航班的日期
和余票额。
d):浏览航线信息
e):增加航线
根据现实需要可以增加航线,加入航班号、起始站、终点站、起飞时间、降落时间、票价、折扣、机票数等信息。
f):删除航线
输入要删除的航班的航班号。
g):修改票价和折扣
对需要调整的航班的票价和折扣进行修改,并且能够查看修改后的航班的新票价和新折扣。
4 概要设计
4.1功能模块图
登录页面
退出系统 用户登录 管理员登录
退办办查浏返退增删修修浏查返 返
出理理询览回出加除改改览看回写回
本订退航航上本航航登航航客上入上
系票票线线级系线 线 录班班户一文级
统 业业信信菜统 密信信订级 件 菜
务 务 息 息 单 码 息 息 票单
信
息 图1 功能模块图
4.2 函数及功能要求
(1)(desktop():提供航空订票系统的界面。
2
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
(2)(cusdesk():实现进入用户操作界面的功能。
(3)(admdesk():实现进入管理员操作界面的功能。
(4)(maindesk():实现航空订票系统界面下一步操作的功能。
(5)(customer():实现客户进入用户操作界面后进行下一步操作的功能。
(administer():管理员输入密码进入管理员操作界面。 (6)
(7)(airline *find():实现查找航线的功能。
(8)(linklist *insertlink(linklist *head,int amount,char name[]):增加订票乘员名单域的客户信息。
(9)(linkqueue add(linkqueue q,char name[],int amount):提供在航空订票系统增加排队等候的客户名单域的功能。
(10)(display(struct airline *info):提供显示用户信息的功能。
(11)(print():打印全部航线信息。
(12)(search():查询航线,根据客户提出的终点站名输出航线信息。
(13)(order():实现客户办理订票业务的功能。
(14)(back():实现客户办理退票业务的功能。
(15)(addline();实现管理员在航空管理系统增加航线的功能。
(16)(delline():实现管理员在航空管理系统删除航线的功能。
(17)(xiugai():实现管理员在航空管理系统选择修改票价和折扣的功能。
(18)(chanceprince():实现管理员修改票价的功能。
(19)(chancezhekou():实现管理员修改折扣的功能。
(20)(display1(struct acustomer *a):实现管理员查看订票客户信息的功能。
(21)(save():实现管理员对信息进行保存的功能。
(22)(changecode():管理员修改进入管理员界面的密码。
4.3功能模块说明
4.3.1用户模块
a)办理订票业务:根据客户提供的航班号进行查询航线信息,若客户订票额超过乘员定票总额,退出,若客户订票额末超过余票量,订票成功并登记信息,在订票乘员名单域中添加客户信息;如果暂时没有票,询问客户是否要排队等侯,如果是,则在等候队列增加该客户的订票信息。
b).办理退票业务:调用查询函数,根据客户提供的航线进行搜索根据客户提供的
3
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计 姓名到订票客户名单域进行查询。退票成功后,重新将航线名单域指向订票单链表的头指针。根据队列中从出的客户信息判断是否满足要求,如果满足,则将该客户的信息插入到乘客信息链表中。
c).查询航线信息:通过输入终点站名,调用search()函数寻找航线信息,调用list()函数输出航线信息
d).浏览航线信息
e).退出本系统
f).返回上级菜单
4.3.2管理员模块
a).增加航线:通过调用addline()函数增加航线。
b).删除航线:通过调用delline()函数删除航线。
c).修改登录密码:管理员对进入管理员的界面密码进行修改。
d).修改航班信息:通过调用display()函数显示修改后的航班信息。
e).浏览航班信息
f).查看客户订票信息
g).写入文件:管理员对进入管理员界面进行的操作进行保存。
h).退出本系统
i).返回上级菜单
5 详细设计
5.1用户办理业务模块
5.1.1 查询航线
void search()
{ struct airline *info,*find();
char name[10];
int i=0;
info=start;
printf("请输入终点站名:");
scanf("%s",name);
while(i
arriva)==0) break;
4
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
info++;
i++;
}
if(i>=MAXSIZE)
printf("对不起,该航线未找到!\n");
else
{ display(info);
} getchar();
}
5.1.2订票业务
void order()
{ struct airline *info;
int f=0,len,amount=0,i;
char name[10];
char zhenghao[10];
char start1[10];
char end[10];
char sum[2];
info=start;
if(!(info=find())) return;
do{ printf("请输入你订票所需要的数量:");
scanf("%s",sum);
len=strlen(sum);
for(i=0;i='0' && sum[i]<='9'))
{printf("输入格式错误,请重新输入~\n"); f=1;}
else { i=0;
while(iinfo->num)//若客户订票额超过乘员定票总额,退出
{ printf("\n对不起,已超过成员定额!");
return;
} if(amount<=info->rest)//若客户订票额末超过余票量,订票成功并等记信
息{ int i;
printf("请输入您的姓名(订票客户):");
scanf("%s",name);
info->order=insertlink(info->order,amount,name);//在订票乘员名单域中添加客户信息
printf("请输入您的证号:");
scanf("%d",&zhenghao);
info->order=insertlink(info->order,amount,zhenghao );//在订票乘员名单域中添加客户信息
printf("请输入起始站名:");
scanf("%s",&start1);
info->order=insertlink(info->order,amount,start1 );//在订票乘员名单域中添加客户信息
printf("请输入终点站名:");
scanf("%s",&end);
info->order=insertlink(info->order,amount,end );//在订票乘员名单域中添加客户信息
for(i=1;i<=amount;i++)//依次输出该订票客户的座位号
printf("%s的座位号是:%d\n",name,info->num-info->rest+i);
info->rest-=amount;//该航线的余票量应减掉该客户的订票量
printf("\n祝您乘坐愉快~");
MAxCUSmer++;
getchar();
} else //若满员或余票额少于订票额,询问客户是否需要进行排队等候
6
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
{ char r;
printf("已经没有更多的票,您需要排队等候吗?(Y/N) ");
r=getch();
printf("%c",r);
if(r=='Y'||r=='y')
{ printf("\n请输入您的姓名(排队订票客户):");
scanf("%s",name);
info->wait=add(info->wait,name,amount);//在排队等候乘员名单域中添
加客户信息
printf("注册成功!");
getchar();
}
else printf("\n欢迎您下次再次订购~");
getchar();
}
}
5.1.3 退票业务
void back()
{ struct airline *info;
qnode *t,*back,*f,*r;
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->bname)==0) break;
7
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
p2=p1; p1=p1->next;
}//while
if(p1==NULL)
{ printf("对不起,你没有订过票!\n");
getchar();
return;
}//if
else
{//若信息查询成功,删除订票客户名单域中的信息
if(p1==head) head=p1->next;
else p2->next=p1->next;
info->rest+=p1->bnum;
printf("%s成功退票~\n",p1->bname);
free(p1);
}//else
info->order=head;//重新将航线名单域指向订票单链表的头指针
f=(info->wait).front;//f指向排队等候名单队列的头结点
r=(info->wait).rear;//r指向排队等候名单队列的尾结点
t=f;//t为当前满点条件的排队候补名单域
while(t)//若有人排队候补,则为第一个人订票
{if(info->rest=info->wait.front->anum)
{//若满足条件者为头结点
int i;
info->wait.front=t->next;
printf("%s订票成功~",t->aname);
for(i=0;ianum;i++)//输出座位号
printf("\n%s的座位号是:%d\n",t->aname,(info->ID)-i);
info->rest-=t->anum;
info->order=insertlink(info->order,t->anum,t->aname);//插入到
订票客户名单链表中
8
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
free(t);
break;
}
back=t;t=t->next;
if((info->rest)>=(t->anum) && t!=NULL)//若满足条件者不为头结点
{ int i;
back->next=t->next;
printf("%s订票成功~\n",t->aname);
for(i=0;ianum;i++)//输出座位号
printf("<%s>的座位号是:%d\n",t->aname,(info->rest)-i);
info->rest-=t->anum;
info->order=insertlink(info->order,t->anum,t->aname);//插入到订票
客户名单链表中
free(t);break;
}
if(f==r) break;
}//while
getchar();
}
5.2 管理员操作模块
5.2.1 管理员修改密码
void changecode(){//修改密码
char code1[15],code2[15],code0[15];
char flag[5];
int f=0;
loop: printf("请输入原始密码 ");
mima(code0);
if(strcmp(code0,code)!=0)
{printf("\n原始密码输入错误~");
printf("\n是否继续修改密码,yes继续,no不继续 ");
9
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
scanf("%s",flag);
if(strcmp(flag,"yes")==0)
goto loop;
}
else if(strcmp(code0,code)==0)
do{
printf("\n请输入修改后的密码: ");
mima(code1);
printf("\n请再次输入相同密码来确认修改: ");
mima(code2);
if(strcmp(code1,code2)==0)
{printf("\n密码修改成功,请记住登陆密码~\n");
strcpy(code,code1);break;}
else
{printf("\n密码修改不成功,请确认前后密码是否一致~\n");
printf("是否继续修改密码,yes继续,no不继续 ");
scanf("%s",flag);
if(strcmp(flag,"yes")==0) f=1;
}//else
}while(f);
}
5.2.2管理员增加航线
void addline(){
int flag=0,i;
char a[5];
do
{ MAXSIZE++;
printf("请输入航班号:\n");
scanf("%d",&air[MAXSIZE-1].ID); //读取航班号
for(i=0;iID) break;
info++;
i++;
}
if(i>=MAXSIZE)
printf("对不起,该航线未找到!\n");
else
{ display(info);
printf("请输入新的票价:\n");
scanf("%d",&b);
info->prince=b;
save();
13
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
}
}void chancezhekou()
{ struct airline *info,*find();
int a;
char aa[10];
int i=0;
info=start;
printf("请输入航班号:");
scanf("%d",&a);
while(iID) break;
info++;
i++;
}
if(i>=MAXSIZE)
printf("对不起,该航线未找到!\n");
else
{display(info);
printf("请输入新的折扣:\n");
scanf("%s",aa);
strcpy(info->zhekou,aa);
save();
}
}
14
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计 6 测试分析
6.1 操作员管理功能
(1).当我们进入航空订票管理系统界面后,会出现如下图画面:
图2 进入系统图
(2).若是用户就选择A,会出现图3。用户可以办理订退票业务及查询航线业务。
图3 用户办理业务界面
(3).当从键盘或文本文件初始化后,测试增加或删除航线业务,增加或删除航班,以上各功能都正确。
6.2 使用说明
(1)(运行程序,首先出现主界面。主界面包括三个选项。选项一:退出系统界面,选择该项可退出系统;选项二:用户登陆界面,选择该项用户可以进行相关操作。选项三:管理员登录界面,选择该项可进行订票系统的管理
(2)(管理员管理界面包括八个选项:选项一:退出本系统界面,可以退出航空管
15
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计 理系统;选项二:增加航线界面,可进行进行航线的增加,具体使用见说明4;选项三:删除航线界面,可进行航班删除,具体使用见说明5;选项四:修改登录密码界面,可对进入管理员界面的密码进行修改,具体使用见说明6;选项五:修改航班信息界面,可对航线的票价或是折扣进行修改;选项六:对航线(包括修改的航线)的信息进行浏
八:返回上一级览;选项七:查看客户订票信息界面,可以浏览所有客户的信息;选项菜单,可返回主界面。
(3)(用户使用界面包括六个选项:选项一:退出本系统;选项二:办理订票业务界面,可以通过查询航线信息进行订票;选项三:办理退票业务界面;选项四:查询航线信息界面,通过输入航班号等信息可以对航线进行查询;选项五:浏览航线信息界面;选项六:返回上级菜单,可返回主界面。
7 总结
在一周的时间里,我们不断地对程序及各模块进行修改、编译、调试、运行,其间遇到很多问题:
(1)因能力有限,在编写的时候只使用了相对较为简单的基础语言 ,代替了相对较为复杂的语言,降低了运行效率。
(2)程序在起初设计的时候,经常出现溢出错误,而且不只一处。为了修正这些溢出错误,耗费了大量的时间,修正解释之后再看源程序,才发现原来只是因为开始的函数定义的数据类型出现了问题,对函数的定义不清楚,字符的不正确定义造成了后期大量的纠错工作,
(3)由于忘记了一些c语言的规范使得在调试过程中一些错误没有发现。
(4)测试用例具有一定的广泛性。运行程序时输入了多种不同字符信息,经过多次修改结果达到了预期效果。说明程序具有一定的可靠性和稳定性。
(5)在哈夫曼编码译码系统中用出栈入栈进行哈夫曼译码编码译码要简单于使用数组,而使用结构体数组来存储待编译的字符,编码译码时通过结构体数组来实现要优于使用链表。
通过这次课程设计,巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。我们对调试掌握的更加熟练了,改变了过去只调试不知道如何对照程序语言修改程序的坏习惯,对调试也有了新的认识,意识到了程序语言的规范性以及我们在编程时要有严谨的态度,同时在写程序时如果加一定量的注释,既增加了程序的可读性,也可以使自己在读程序时更容易。
16
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计 8 参考文献
[1] 魏善沛. Web数据库技术使用教程[M]. 北京:清华大学出版社,1999. [2]严蔚敏、吴伟民 《数据结构》[M]. 清华大学出版社,2001 [3]严蔚敏 《数据结构题集》清华大学出版社1999
[4] 田淑清.《C语言程序设计辅导与习题集》[J].中国铁道出版社,2000. [5]王曙燕 《C语言程序设计》高等教育出版社, 2000
[6]徐孝凯,魏荣《数据结构》,机械工业出版社,1996年
[7]徐孝凯《数据结构简明教程》,清华大学出版社,1995
[8]陈文博,朱青《数据结构与算法》,机械工业出版社,1996
[9]许卓群,张乃孝,杨冬青,唐世渭《数据结构》,高等教育出版社,1988
[10]李廉治,姜文清,郭福顺《数据结构》,大连理工大学出版社,1989
[11]晋良颍《数据结构》,人民邮电出版社,2002
17
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
9 附录 程序源代码
#include #include #include #include
#include #define length 15//length为当前数组的容量 int MAXSIZE=0; //max为当前数组的长度 int MAxCUSmer=0; char code[15]={"admin"};//管理员登陆的初始密码 typedef struct acustomer//已订票客户信息链表 { char aname[10];//姓名
int zhenghao;//证件号
int anum;//订票量
char start1[10];
char end[10];
struct acustomer *next; }qnode,*qptr;
typedef struct wqueue//候补队列
{ qptr front;//等候替补客户名单域的头指针
qptr rear; //等候替补客户名单域的属指针 }linkqueue;
typedef struct bcustomer//预订票客户信息 { char bname[10];//预订票客户姓名
int bnum; //预订票量
int zhenghao;
struct bcustomer *next; }linklist;
struct airline//航线信息
{ char arrival[15];//起始站名
char arriva[15];//终点站名
int ID;//航班号
char flytime[10];
char flyend[10];
int prince;//票价
char zhekou[10];//折扣
int num;//乘员定额
int rest;//余票量
linklist *order;//已预订票乘员名单域,指向乘员名单链表的头指针
linkqueue wait;//等候替补的客户名单域,分别指向排队等候名单队头队尾的指
针
}lineinfo,air[length]; struct airline *start; struct acustomer *yonghu; void order();
18
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计 void back();
void wrong();
void search();
void display(struct airline);//
void print();//
void addline();
void delline();
void chakan();//查看用户资料
void display1();//
void save();
void read();
void xiugai();
void changecode();//
void mima(char shurumima[15]);//
void maindesk();
void chanceprince();
void chancezhekou();
void customer();
void administer();
struct airline *find();
linklist *insertlink(linklist ,int,char name[],int zhenghao);
void desktop(){//显示桌面
getchar();system("cls");
printf("\n ※※※※※※※※※※※※※※※※※※※※※※※※※※ \n");
printf("\n 欢迎进入航空管理系统~请选择要进行的操作\n\n");
printf(" ※※※※※※※※※※※※※※※※※※※※※※※※※※ \n");
printf(" ? E.退出系统 ? \n");
printf(" ? A.用户登录 ? \n");
printf(" ? B.管理员登录 ? \n ");
printf(" ※※※※※※※※※※※※※※※※※※※※※※※※※※ \n");
printf("请输入你的选择:\n");
}//desktop
void cusdesk(){//用户操作界面
getchar();
system("cls");//清屏
printf("\n ※※※※※※※※※※※※※※※※※※※※※※※※※※ \n");
printf("\n 尊敬的客户您好~欢迎在本公司办理业务~\n\n");
printf(" ※※※※※※※※※※※※※※※※※※※※※※※※※※ \n");
printf(" ? 0.退出本系统 ? \n");
printf(" ? 1.办理订票业务 ? \n");
printf(" ? 2.办理退票业务 ? \n");
printf(" ? 3.查询航线信息 ? \n");
printf(" ? 4.浏览航线信息 ? \n");
printf(" ? 5.返回上级菜单 ? \n");
printf(" ※※※※※※※※※※※※※※※※※※※※※※※※※※ \n");
19
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
printf("请输入你的选择:\n");
}
void admdesk(){//管理员操作界面
getchar();
system("cls");//清屏
printf("\n ※※※※※※※※※※※※※※※※※※※※※※※※※※ \n");
printf("\n 您好~您现在以管理员登录,请谨慎操作~\n\n");
printf(" ※※※※※※※※※※※※※※※※※※※※※※※※※※ \n");
printf(" ? 0.退出本系统 ? \n");
printf(" ? 1.增加航线 ? \n");
printf(" ? 2.删除航线 ? \n");
printf(" ? 3.写入文件 ? \n");
printf(" ? 4.修改登陆密码 ? \n");
printf(" ? 5.修改航班信息 ? \n");
printf(" ? 6.浏览航班信息 ? \n");
printf(" ? 7.查看客户订票信息 ? \n");
printf(" ? 8.返回上级菜单 ? \n");
printf(" ※※※※※※※※※※※※※※※※※※※※※※※※※※ \n");
printf("请输入你的选择:\n");
}void maindesk(){
char se;
int flag=0;
do{desktop();
se=getch();
printf(" 您的选择是 %c",se);
getchar();
if(se=='A'||se=='a') customer();
else if(se=='B'||se=='b') administer();
else if(se=='E'||se=='e') exit(1);
else {printf("选择错误,请重新选择~");flag=1;}
}while(flag);
return ;}
void customer(){//客户操作选择
char ch;
cusdesk();
printf("请在0-5中选择以回车键结束:\n");
while( ch=getchar())
{ switch(ch){
case '0':desktop();
case '1': order();
break;
case '2':back();
break;
case '3':search();
break;
case '4':print();
20
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
break;
case '5':maindesk();
break;
default :printf("选择错误~重新选择~");
} //switch
printf("按回车返回用户菜单~");
cusdesk();
}//while
}//customer
void administer()//输入模块程序
{
char f[10]; //密码
char a[10]; //继续与否,
int fl=0;
while(!fl)
{ printf("请输入密码并以回车键结束:");
mima(f);
if(strcmp(f,code)==0) //判断密码是否正确
{ char ch;
admdesk();
printf("请在0-5中选择以回车键结束: ");
while( ch=getchar())
{ switch(ch){
case '0':exit(1);
case '1':addline();
break;
case '2':delline();
break;
case '3':save();
break;
case '4':changecode();
break;
case '6':print();
break;
case '5':xiugai();
break;
case '7':chakan();
break;
case '8':maindesk(); break;
break;
default :printf("选择错误~重新选择~");
}//switch
printf("按回车返回管理员菜单~");
admdesk();
}//while
} //验证密码的if
21
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
else
{ printf("输入密码错误!请检查您的密码是否正确!\n\n"
"是否继续输入密码,输入yes继续,输入no结束\n\n");
scanf("%s",a);
if(strcmp(a,"no")==0)
{ fl=1;
break;
} //是否继续输入密码的if
}//验证密码的else
}//最外面的while
return ;
} //administer
struct airline *find()//根据系统提出的航班号查询并以指针形式返回 { struct airline *info;
int number;
int i=0;
info=start;
printf("请输入航班号:");
scanf("%d",&number);
while(iID) return info;
info++;
i++;
}
printf("对不起,该航线末找到!\n");
return NULL;
}linklist *insertlink(linklist *head,int amount,char name[])//增加订票乘员名单域的客户信息
{ linklist *p1,*new1;
p1=head;
new1=(linklist *)malloc(sizeof(linklist));
if(!new1) {printf("\n内存溢出!!\n");return NULL;}
strcpy(new1->bname,name);
new1->bnum=amount;
new1->next=NULL;
if(head==NULL)//若原无订票客户信息
{head=new1;new1->next=NULL;}
else
head=new1;
new1->next=p1;
return head;
}linkqueue add(linkqueue q,char name[],int amount)//增加排队等候的客户名单域 { qptr new1;
new1=(qptr)malloc(sizeof(qnode));
strcpy(new1->aname,name);
new1->anum=amount;
22
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
new1->next=NULL;
if(q.front==NULL)//若原排队等候客户名单域为空
q.front=new1;
else
q.rear->next=new1;
q.rear=new1;
return q;
}
void display(struct airline *info)//打印每条航线的基本信息 {
printf(" ********************************\n");
printf(" 起始站名:");
printf("%s",info->arriva);
printf("\n");
printf(" 终点站站名:");
printf("%s",info->arrival);
printf("\n");
printf(" 航班号:");
printf(" %d",info->ID);
printf("\n");
printf(" 起飞时间:");
printf(" %s",info->flytime);
printf("\n");
printf(" 降落时间:");
printf(" %s",info->flyend);
printf("\n");
printf(" 票价:");
printf(" %d",info->prince);
printf("\n");
printf(" 折扣:");
printf(" %s",info->zhekou);
printf("\n");
printf(" 乘客数:");
printf(" %d",info->num);
printf("\n");
printf(" 剩余票数:");
printf(" %d\n",info->rest);
printf(" **********************************");
printf("\n");
}void print()//打印全部航线信息
{ struct airline *info;
int i=0;
info=start;
while(iarriva)==0) break;
info++;
i++;
}
if(i>=MAXSIZE)
printf("对不起,该航线未找到!\n");
else
{ display(info);
}
getchar();
}void order()//办理订票业务
{ struct airline *info;
int f=0,len,amount=0,i;
char name[10];
char zhenghao[10];
char start1[10];
char end[10];
char sum[2];
info=start;
if(!(info=find())) return;//根据客户提供的航班号进行查询,如为空,退出该模块
do{printf("请输入你订票所需要的数量:");
scanf("%s",sum);
len=strlen(sum);
for(i=0;i='0' && sum[i]<='9'))
{printf("输入格式错误,请重新输入~\n"); f=1;}
else { i=0;
while(iinfo->num)//若客户订票额超过乘员定票总额,退出
24
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
{ printf("\n对不起,已超过成员定额!");
return;
}
if(amount<=info->rest)//若客户订票额末超过余票量,订票成功并等记信息
{int i;
printf("请输入您的姓名(订票客户):");
scanf("%s",name);
info->order=insertlink(info->order,amount,name);//在订票乘员名单域中添加客户信息
printf("请输入您的证号:");
scanf("%d",&zhenghao);
info->order=insertlink(info->order,amount,zhenghao );//在订票乘员名单域中添加客户信息
printf("请输入起始站名:");
scanf("%s",&start1);
info->order=insertlink(info->order,amount,start1 );//在订票乘员名单域中添加客户信息
printf("请输入终点站名:");
scanf("%s",&end);
info->order=insertlink(info->order,amount,end );//在订票乘员名单域中添加客户信息
for(i=1;i<=amount;i++)//依次输出该订票客户的座位号
printf("%s的座位号是:%d\n",name,info->num-info->rest+i);
info->rest-=amount;//该航线的余票量应减掉该客户的订票量
printf("\n祝您乘坐愉快~");
MAxCUSmer++;
getchar();
}
else //若满员或余票额少于订票额,询问客户是否需要进行排队等候
{ char r;
printf("已经没有更多的票,您需要排队等候吗?(Y/N) ");
r=getch();
printf("%c",r);
if(r=='Y'||r=='y')
{ printf("\n请输入您的姓名(排队订票客户):");
scanf("%s",name);
info->wait=add(info->wait,name,amount);//在排队等候乘员名单域中添加客户信息
printf("注册成功!");
getchar();
}
else printf("\n欢迎您下次再次订购~");
getchar();
}
}void back()//办理退票业务
{ struct airline *info;
25
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
qnode *t,*back,*f,*r;
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->bname)==0) break;
p2=p1; p1=p1->next;
}//while
if(p1==NULL)
{ printf("对不起,你没有订过票!\n");
getchar();
return;
}//if
else
{//若信息查询成功,删除订票客户名单域中的信息
if(p1==head) head=p1->next;
else p2->next=p1->next;
info->rest+=p1->bnum;
printf("%s成功退票~\n",p1->bname);
free(p1);
}//else
info->order=head;//重新将航线名单域指向订票单链表的头指针
f=(info->wait).front;//f指向排队等候名单队列的头结点
r=(info->wait).rear;//r指向排队等候名单队列的尾结点
t=f;//t为当前满点条件的排队候补名单域
while(t)//若有人排队候补,则为第一个人订票
{if(info->rest=info->wait.front->anum)
{//若满足条件者为头结点
int i;
info->wait.front=t->next;
printf("%s订票成功~",t->aname);
for(i=0;ianum;i++)//输出座位号
printf("\n%s的座位号是:%d\n",t->aname,(info->ID)-i);
info->rest-=t->anum;
info->order=insertlink(info->order,t->anum,t->aname);//插入到订票客户名单链表中
free(t);
break;
}
back=t;t=t->next;
if((info->rest)>=(t->anum) && t!=NULL)//若满足条件者不为头结点
{ int i;
26
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
back->next=t->next;
printf("%s订票成功~\n",t->aname);
for(i=0;ianum;i++)//输出座位号
printf("<%s>的座位号是:%d\n",t->aname,(info->rest)-i);
info->rest-=t->anum;
info->order=insertlink(info->order,t->anum,t->aname);//插入到订票客户名单链表中
free(t);break;
}
if(f==r) break;
}//while
getchar();
}void addline(){//增加航线
int flag=0,i;
char a[5];
printf("请依次输入要增加的航班信息:\n\n"); //打印提示信息
printf("^^^^^^^^^^^^^^^^^^^^^^^^\n");
do
{ MAXSIZE++;
printf("请输入航班号:\n");
scanf("%d",&air[MAXSIZE-1].ID); //读取航班号
for(i=0;iID) break;
info++;
i++;
}
if(i>=MAXSIZE)
printf("对不起,该航线未找到!\n");
else
{display(info);
printf("请输入新的票价:\n"); scanf("%d",&b);
info->prince=b;
save();
}
}void chancezhekou() { struct airline *info,*find();
int a;
char aa[10];
int i=0;
info=start;
printf("请输入航班号:");
scanf("%d",&a);
while(iID) break;
info++;
i++;
}
if(i>=MAXSIZE)
printf("对不起,该航线未找到!\n");
else
{display(info);
printf("请输入新的折扣:\n"); scanf("%s",aa);
strcpy(info->zhekou,aa);
save();
}
}
void display1(struct acustomer *a)
29
德州学院 计算机系 计算机科学与技术专业 数据结构课程设计
{ printf(" ********************************\n");
printf(" 客户名:");
printf("%s",a->aname);
printf("\n");
printf(" 客户证号:");
printf("%d",a->zhenghao);
printf("\n");
printf(" 订票数:");
printf("%d",a->anum);
printf("\n");
printf(" 起始站:");
printf("%d",a->start1);
printf("\n");
printf(" 终点站:");
printf("%d",a->end);
printf("\n");
printf(" **********************************");
printf("\n");
}void chakan()
{ struct acustomer *b;
int i=0;
b=yonghu;
while(i