课程设计航空客运订票系统.docx
《课程设计航空客运订票系统.docx》由会员分享,可在线阅读,更多相关《课程设计航空客运订票系统.docx(22页珍藏版)》请在冰豆网上搜索。
![课程设计航空客运订票系统.docx](https://file1.bdocx.com/fileroot1/2023-1/31/d4a0b7f9-0ad9-4778-94b4-c12ecb3c8805/d4a0b7f9-0ad9-4778-94b4-c12ecb3c88051.gif)
课程设计航空客运订票系统
数据结构课程设计报告
课程名称______数据结构
题目名称航空客运订票系统
学生学院计算机学院
专业班级11级软件1班
2012年6月29日
一.需求分析
设计一个航空客运订票系统
基本要求:
1.每条航线所涉及的信息有:
终点站名、航班号、飞机好、飞行周日、乘员定额、余票量、已订票的客户名单(包括姓名、订票量、仓位等级1,2或3)以及等候替补的客户名单(包括姓名、所需票量);
2.作为示意系统,全部数据可以只放在内存中;
3.系统能实现的操作和功能如下:
(1)查询航线:
根据旅客提出的终点站名输出下列信息:
航班号、飞机好、星期几飞行,最近一天航班的日期和与票额;
(2)承办订票业务:
根据客户提出的要求(航班号,订票数额)查询该航班票额情况,若尚有余票,则为客户办理订票手续,输出座位号;若已满员活余票额少于订票额,则需重新询问客户要求。
若需要,可登记排队候补;
(3)承办退票业务:
根据客户提供的情况(日期、航班)。
为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则一次询问其他排队候补的客户。
2.概要设计
用链队储存客户信息,用线性表储存航线
函数声明
voidfromAirlineNum();//通过航班号查询
voidfromEndCity();//通过目的地查询
voidfromDay();//通过时间查询
voidInitialize();//初始化录入功能
voidairLineCheck();//查询功能
voidcustomerBooking();//订票功能
voidcancelFuntion();//退票功能
voidcustomerInformation();//用户信息查询
三.详细设计
#include
#include
#include
#include
#defineok1
typedefstructBooking
{//单链表
charname[15];//已订票的客户姓名
intticket;//已订票数量
structBooking*next1;
}Booking,*Link;
typedefstructyetBooking{//单链队
charname[15];//预订票的客户姓名
intmoreticket;//要订票数量
structyetBooking*next2;//下一个链队结点指针
}yetBooking,*Qptr;
typedefstruct{
Qptrfront;//单链队头结点
Qptrrear;//单链队尾结点
}linkQueue;
typedefstructairLine{//创建一个航线的结构体
charfightNum[15];//航班号-
charplaneNum[15];//飞机号
intfightTime;//起飞时间
intlevel;//舱位等级
intmoreTicket;//余票
charendCity[15];//降落城市
inttotalTicket;//票数总额
structairLine*next;//指向下一个链结点的指针
structBooking*bookingedList;//定义一个指向已订票客户的头结点指针
structyetBooking*bookdingQueue;
linkQueueQ;
}airLine,*Linklist;
structairLine*L=NULL;//定义全局量
structBooking*H;//为已订票客户链队来申请空间
//linkQueueQ;//linkQueue类型的来申请空间
LinklistInitLinklist();//声明
intInsertLinklist(Linklist&head1);//声明
voidfromAirlineNum();//通过航班号查询
voidfromEndCity();//通过目的地查询
voidfromDay();//通过时间查询
voidInitialize();//初始化录入功能
voidairLineCheck();//查询功能
voidcustomerBooking();//订票功能
voidcancelFuntion();//退票功能
voidcustomerInformation();//用户信息查询
voidmain()
{
H=(structBooking*)malloc(sizeof(Booking));
//Q.front=Q.rear=(Qptr)malloc(sizeof(yetBooking));
InitLinklist();
intn;
do{//打印主界面
printf("\t欢迎使用航空客运订票系统\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t==>1.录入航班功能==\n");
printf("\t==>2.航班查询功能==\n");
printf("\t==>3.订票功能==\n");
printf("\t==>4.退票功能==\n");
printf("\t==>5.用户信息查询==\n");
printf("\t==>6.退出==\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t请选择:
");
scanf("%d",&n);printf("\n");
switch(n)
{
case1:
Initialize();//录入功能
break;
case2:
airLineCheck();//查询功能
break;
case3:
customerBooking();//订票功能
break;
case4:
cancelFuntion();//退票功能
break;
case5:
customerInformation();
break;
default:
exit(0);//退出
}
}while(n==1||n==2||n==3||n==4||n==5);
}
voidInitialize()//航班录入功能
{
intj=1,m;
do{
if(!
InsertLinklist((Linklist)L))//向其中加入航班信息
{
printf("内存已满\n");exit(OVERFLOW);
}//向链表中加一结点
printf("\t是否要输入下一个航线记录?
\n");
printf("\t是请输入1\n");
printf("\t否请输入2\n\t");
scanf("%d",&m);//在这里依靠人来决定是否输入下一条航线记
}while(m==1);
}
LinklistInitLinklist()
{
L=(Linklist)malloc(sizeof(airLine));
if(!
L)exit(OVERFLOW);
L->next=NULL;//建立一个带有头结点的单链表
return(L);
}
intInsertLinklist(Linklist&L)//向航线链表添加新的结点
{
Linklistp;
p=(Linklist)malloc(sizeof(airLine));//为一个新的结点分配空间
if(!
p)exit(OVERFLOW);
printf("\t请依次输入下面几项内容:
\n\n");//这里的输入采用一个个单独输入,避免了乱赋值的现象
printf("航班号\n");
scanf("%s",p->fightNum);
printf("飞机号\n");
scanf("%s",p->planeNum);
printf("终点站\n");
scanf("%s",p->endCity);
printf("飞行日期(星期)\n");
scanf("%d",&p->fightTime);
printf("舱位等级\n");
scanf("%d",&p->level);
printf("票数总额\n");
scanf("%d",&p->totalTicket);
p->moreTicket=p->totalTicket;
p->bookingedList=(Booking*)malloc(sizeof(Booking));//为它申请空间
p->bookdingQueue=p->Q.front=p->Q.rear=(Qptr)malloc(sizeof(yetBooking));//为它申请空间
p->next=L->next;
L->next=p;//这二句是链表中的插入一个结点
p->Q.front->next2=NULL;
returnok;
}
voidairLineCheck()//查询功能
{
intn;
printf("\t查找航线信息\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t==>1.通过目的地查询==\n");
printf("\t==>2.通过航班号查询==\n");
printf("\t==>3.通过日期查询==\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t请选择:
\n");
scanf("%d",&n);
switch(n)
{
case1:
fromEndCity();
break;
case2:
fromAirlineNum();
break;
case3:
fromDay();
break;
default:
break;
}
}
voidfromEndCity()//通过目的地查询
{
charc[15];
Linklistp=L;
intm=1;
printf("\t请输入要查询的目的地:
\n");
scanf("%s",c);
do{
p=p->next;
if(p)
{
if(strcmpi((*p).endCity,c)==0)
{
printf("\t航班号:
%s\n",p->fightNum);
printf("\t飞机号:
%s\n",p->planeNum);
printf("\t飞行时间:
周%d\n",p->fightTime);
printf("\t票数总额%d\n",p->totalTicket);
printf("\t余票量:
%d\n\n\n",p->moreTicket);
m=0;
}
}
elsem=1;
}while(m!
=1);
if(m==1)printf("\t对不起没有你要找的航班号:
\n");
}
voidfromAirlineNum()//通过航班号查询
{
charc[15];
Linklistp=L;
intm=1;
printf("\t请输入要查询的航班号:
\n");
scanf("%s",c);
do{
p=p->next;
if(p)
{
if(strcmpi((*p).fightNum,c)==0)
{
printf("\t航班信息:
\n");
printf("\t航班号:
%s\n",p->fightNum);
printf("\t飞机号:
%s\n",p->planeNum);
printf("\t飞行时间:
周%d\n",p->fightTime);
printf("\t票数总额%d\n",p->totalTicket);
printf("\t余票量:
%d\n\n",p->moreTicket);
m=0;
}
}
else
{//如果不匹配的话就做
printf("\t对不起没有你要找的航班号:
\n");m=0;
}
}while(m!
=0);
}
voidfromDay()//通过日期查询航班
{
inti;
Linklistp=L;
intm=2;
printf("\t请输入日期:
\n");
scanf("%d",&i);
printf("\t航班信息:
\n");
do{
p=p->next;
if(p)
{
if((*p).fightTime==i)
{
printf("\t航班号:
%s\n",p->fightNum);
printf("\t飞机号:
%s\n",p->planeNum);
printf("\t飞行时间:
周%d\n",p->fightTime);
printf("\t票数总额%d\n",p->totalTicket);
printf("\t余票量:
%d\n\n\n",p->moreTicket);
m=0;
}
}
elsem=1;
}while(m!
=1);
if(m==1)printf("\t对不起没有你要找的航班号:
\n");
}
voidcustomerBooking()//订票功能
{
Linklistp=L;//Linklist类型的L来指向链表头
Booking*h,*h1;//Booking定义客户的结点,方便插入与删除
//linkQueueq;//linkQueue类型的来,方便插入与删除
structyetBooking*q3;
charc[15];
intm=1,ticket,n;
intydticket=0,yd=0;
printf("请输入航班号:
\n");
scanf("%s",c);
//p=L->next;
if(p){
do{//查找一下,是否有这个航班
if(!
p)
{
printf("对不起,没有你要找的航班:
\n\n");
m=-1;
break;
//gotoloop1;
}
m=strcmpi(p->fightNum,c);
//通过比较来判定
if(m==0)
{
printf("航班信息:
\n");
printf("航班号:
%s\n",p->fightNum);
printf("飞机号:
%s\n",p->planeNum);
printf("飞行时间:
周%d\n",p->fightTime);
printf("票数总额%d\n",p->totalTicket);
printf("余票量:
%d\n",p->moreTicket);
}
else
p=p->next;
}while(m!
=0);
if(m==0)
{//当有该航班时,进行订票
do{
printf("\n请输入你要订的票数:
\n");
scanf("%d",&ticket);
while(ticket<=0){
printf("票数应该大于0\n");
scanf("%d",&ticket);
}
if(ticket<=p->moreTicket)
{
h=p->bookingedList;
if(h)
{
h1=h;
h=h->next1;
h=(structBooking*)malloc(sizeof(Booking));
printf("请输入你的名字:
\n");
scanf("%s",h->name);
h->ticket=ticket;
h->next1=h1->next1;
h1->next1=h;
p->moreTicket=p->moreTicket-ticket;
printf("订票成功:
\n");
m=2;
}
}
else//余票量不足时
{
printf("余票量:
%d\n",p->moreTicket);
printf("对不起,余票%d张不足,不能完成订票\n",p->moreTicket);
printf("是否要重新订票?
\n");
printf("需要请输入1\n");
printf("取消请按2:
\n");
printf("预订请输入3:
\n");
scanf("%d",&m);
if(m==3)
{
q3=(yetBooking*)malloc(sizeof(yetBooking));
printf("请输入你的姓名\n");
scanf("%s",q3->name);
q3->moreticket=ticket;
q3->next2=NULL;
p->Q.rear->next2=q3;
p->Q.rear=q3;
printf("恭喜,预订成功!
\n");
}
}
}while(m==1);
}
}
}
voidcancelFuntion()//***************************************************************退票功能
{
Linklistp=L;
Booking*h=H,*h1,*h2;
//linkQueueq=Q;
charc[15],name1[15];
intm=1,ticket,n;//定义相应变量
printf("请输入航班号:
\n");
scanf("%s",c);
p=L->next;
if(p)
{
do{//使用dowhile来查找是否有此航班
if(!
p)
{//如果是到了表尾且没有匹配,
printf("\n对不起,没有你要找的航班:
\n");
m=-1;
}
if(strcmpi(p->fightNum,c)==0)//比较航班号输出信息
{
printf("\t航班信息:
\n");
printf("航班号:
%s\n",p->fightNum);
printf("飞机号:
%s\n",p->planeNum);
printf("飞行时间:
周%d\n",p->fightTime);
printf("票数总额%d\n",p->totalTicket);
printf("余票量:
%d\n",p->moreTicket);
m=0;
}
elsep=p->next;
}while(m>0);
if(m==0)
{//如果找到了,则退票
inti=1;
do{
h=p->bookingedList;
printf("请输入你的姓名:
\n");
scanf("%s",name1);
printf("请输入你订的票数:
\n");
scanf("%d",&ticket);
while(ticket<=0)
{
printf("票数不能小于等于零,请重新输入:
\n");
scanf("%d",&ticket);
}
while(h)
{
if(h)
if(strcmpi((*h).name,name1)==0&&h->ticket==ticket)//如果名字和订的票数相等,则就给他取消订票
{
p->moreTicket+=h->ticket;
h2=h;
if(i==1)
{
h=h->next1;
free(h2);
}
else{
h1->next1=h->next1;
free(h2);
}
printf("你取消订票成功\n");
structyetBooking*q3;
if(p->Q.front==p->Q.rear)
{
printf("没有人预订票:
\n");
break;
}
if((p->moreTicket)>=(p->Q.front->next2->moreticket))
{
h2=(Booking*)malloc(sizeof(Booking));
strcpy(h2->name,p->Q.front->next2->name);
h2->ticket=p->Q.front->next2->moreticket;
n=p->moreTicket-p->Q.front->next2->moreticket;
p->moreTicket=n;
q3=p->Q.front;//
if(p->Q.rear==q3){free(q3);p->Q.front=p->Q.rear=NULL;}
else{
p->Q.front=p->Q.front->next2;//这二语句来删除结点
free(q3);
}
printf("链队中删除成功\n");
h2->next1=p->bookingedList->next1;
p->bookingedList->next1=h2;//为之插入进已订票客户链表中
printf("为预订的客户订票成功\n");
break;
}
elseprintf("余票数不够,不能为预订客户订票!
\n");
}else{
h1=h;
h=h->next1;
}
}
if(!