数据结构课程设计报告.docx
《数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告
数据结构课程设计报告
设计题目:
航空售票处管理
所在院系:
所在专业:
所在班级:
学生学号:
学生姓名:
指导老师:
完成时间:
2010-1-13
一、实验目的:
1.培养运用数据结构的基本知识解决实际问题的能力;
2.加深对数据结构基本知识的理解;
3.发挥各人的想象能力和分析能力,拓展思维空间;
4.掌握应用程序设计的基本方法。
二、需求分析:
1.问题描述:
航空售票处管理包括:
查询航线、客票预定和办理退票等。
设计一个航空售票处管理系统。
2.基本要求:
(1)每条航线所涉及的信息有:
终点站名、航班号、飞机号、飞行周日、乘员定额、余票量、已订票的客户名单以及等候替补的客户名单;
3.查询能实现的操作和功能如下:
(1)查询航线:
根据旅客提出的终点站名输出下列信息:
航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;
(2)承办订票业务:
根据客户提出的要求查询该航班票额情况,若尚有余票,则为客户办理订票手续,输出座位号;若已满员或余票少于订票额,则需重新询问客户要求。
若需要,可登记排队候补。
4.承办退票业务:
根据客户的情况(日期、航班),为客户办理退票手续,然后查询该航班是否有人排队,首先询问排在第一的客户,若所退票数满足他的要求,则为他办理订票手续,否则一次询问其他排队候补的客户。
三、概要设计:
本次数据结构课程设计所制作的航空售票处管理系统主要运用了链式存储结构来实现。
线性表以及队列的存储结构主要用到了链式结构存储,因而此系统使用这两种存储方式。
在航班信息方面,要对航班进行添加、删除、查询等操作。
由于链表的优势就在于便于进行添加、删除和查找,因此有关航班信息方面的部分可以由链表来实现。
但是为了更便于添加和删除,因此为链表设置了首、尾指针。
而对于订票、退票来说,其中要讲一个先来后到的道理。
基于这一点的要求,队列的存储方式再合适不过了,其“先进先出”(FIFO)的特点恰恰可以满足订票、退票的要求。
在结构定义方面,本系统定义了四个结构,分别用来储存航班信息、乘客信息、替补乘客信息以及结点信息。
而在航班信息定义中,分别将乘客信息、替补乘客信息引入其中,以供储存乘客信息和替补乘客信息。
根据本系统中的功能以及所定义的数据结构,特编写如下函数:
1.FlightInsert()//添加航班信息
2.FlightSearch()//查询航班信息
3.FlightRework()//修改航班信息
4.FlightBuyticket()//订票
5.FlightCancelticket()//退票
6.Buyticket(PFlightq,intTicket_Amount)//利用队列买票
7.MainMenu()//主菜单
8.Main()//主函数
四、详细设计:
本航空售票处管理系统分为两个文件:
1.头文件Ticket.h,用来存放系统中数据结构的结构体,以及所要到的方法及函数。
2.C++文件Ticket.cpp.,本文件主要是本系统的主函数,其中调用头文件,来实现系统的功能。
具体实现如下:
(1).Ticket.h,:
本文件是头文件,将售票管理系统的数据中的结构体定义在其中,并且利用所定义的结构来编写函数、方法来实现系统的功能。
首先采用链式结构,定义出三个结构体:
1.航线的结构体:
typedefstructFlight//航线信息
{
charDes[10];//终点站名
charFlightNum[10];//航班号
charPlaneNum[10];//飞机号
charWeek;//飞行周日
intRation;//乘员定额
intFreeTicket;//剩余票数
floatPrice[3];//舱位等级的价格
intReplacePas;//候补乘客数
Replace*ReplName;//该航班的候补乘客名单
Customer*CustName;//该航班的已定票乘客名单
structFlight*next;//指示下一航线结点
}Flight,*PFlight;
2.乘客结构体:
typedefstructCustomer//已定票乘客信息
{
charName[10];//姓名
intAmount;//定票数
intLevel;//舱位等级
intSeatNum;//座位号
charFlightNum[10];//所定航班号
structCustomer*next;
}Customer;
3.替补乘客结构体:
typedefstructReplace//替补乘客信息
{
charName[10];//姓名
intAmount;//定票数
intLevel;//舱位等级
charFlightNum[10];//所定航班号
structReplace*next;
}Replace;
以上三个结构体是以乘客信息、替补乘客信息为基础、再此之上有定义了飞机航线的结构体以及结点类型指针的结构体。
并在后者结构中引入了前两种结构体。
并且单独定义了两个指向Flight的指针,作为头只指针和尾指针:
Flight*head;//建立航线头结点
Flight*rear;//建立航线尾结点以及乘客队列的指针:
Customer*Cusrear;
Replace*Reprear;
其次,编写实现各个功能的函数与方法:
1.MainMenu()——系统主菜单
此函数设计了本系统的界面,是程序的开始,具体实现如下:
voidMainMenu()
{
chari='0';
while(i!
='8')
{
cout<<"航空售票处管理系统
<cout<<"1、增加航线5、预订机票*"<cout<<"2、查询航线6、退订机票*"<cout<<"3、修改航线7、清空系统*"<cout<<"4、删除航线8、退出系统*"<cout<<"**************************************************"<cin>>i;
switch(i)
{
case'1':
FlightInsert();break;
case'2':
FlightSearch();break;
case'3':
FlightRework();break;
case'4':
FlightDelete();break;
case'5':
FlightBuyticket();break;
case'6':
FlightCancelticket();break;
case'7':
Flightclean();break;
case'8':
;break;
default:
cout<<"error\n";break;
}
}
}
2.voidFlightInsert()——添加航班信息
此方法主要用到链表的思想,类似于链表中的插入属性。
与一般链表不同的是,此方法设置了一个表尾指针,便于航班信息的添加,具体实现如下:
voidFlightInsert()//添加航班信息
{
Flight*p;
p=newFlight;
cout<<"请输入终点站名:
"<cin>>p->Des;
cout<<"请输入航班号:
"<cin>>p->FlightNum;
cout<<"请输入飞机号:
"<cin>>p->PlaneNum;
cout<<"请输入飞行周日:
"<cin>>p->Week;
cout<<"请输入乘员定额:
"<cin>>p->Ration;
p->FreeTicket=p->Ration;
cout<<"请输入舱位等级的价格:
"<cout<<"头等舱价格"<cin>>p->Price[0];
cout<<"普通舱价格"<cin>>p->Price[1];
cout<<"经济舱价格"<cin>>p->Price[2];
p->ReplName=newReplace;
p->CustName=newCustomer;
p->CustName->next=NULL;
p->ReplName->next=NULL;
p->ReplacePas=0;
rear->next=p;
rear=p;
rear->next=NULL;
}
3.FlightLookup()——查询航班信息
其实,查询航班的原理与删除原理相似,最中心的环节就是现对指定的航班进行定位。
与删除不同的是,查询不涉及到指针的变换,仅仅输出要查询的信息就可以了,具体实现如下:
voidFlightLookup()//查询航班
{
Flight*p,*q;
charFlightNum[10];
p=head;
inti=0;
while(i!
=1)
{
cout<<"请输入需要查询的航班号:
"<cin>>FlightNum;
while(p->next&&strcmp(p->next->FlightNum,FlightNum))
{
p=p->next;
}
q=p->next;
if(q==NULL)
{
cout<<"对不起不存在此航班"<}
else
{
cout<<"航班号:
"<FlightNum<cout<<"飞机号:
"<PlaneNum<cout<<"目的地:
"<Des<cout<<"飞行周日:
"<Week<cout<<"成员定额:
"<Ration<cout<<"剩余票数:
"<FreeTicket<cout<<"候补乘客数:
"<ReplacePas<cout<<"头等舱价格:
"<Price[0]<cout<<"普通舱价格:
"<Price[1]<cout<<"经济舱价格:
"<Price[2]<cout<<"1、返回主菜单2、继续"<>i;
}
}
4.FlightRework()——修改航线信息
在修改航线信息方面,中心思想依旧类似于删除和查找。
只不过定位到所需信息之后要做的是重新给这些信息赋值,具体实现如下:
voidFlightRework()//修改航线信息
{
intCustomer_Number;
Flight*p,*q;cout<<"请输入需要修改的航班号:
"<cin>>FlightNum;
while(p->next&&strcmp(p->next->FlightNum,FlightNum))
{
p=p->next;
}
q=p->next;
if(q==NULL)
{
cout<<"对不起不存在此航班"<}
else
{
while(i!
='9')
{
cout<<"*****请输入需要修改的数据*****"<cout<<"*1、航班号2、飞机号*"<charFlightNum[10];
chari='0';
p=head;
cout<<"*3、目的地4、飞行周日*"<cout<<"*5、成员定额6、头等舱价格*"<cout<<"*7、普通舱价格8、经济舱价格*"<cout<<"*9、退出*"<cout<<"******************************"<cin>>i;
switch(i)
{
case'1':
cout<<"请输入航班号:
"<cin>>q->FlightNum;break;
case'2':
cout<<"请输入飞机号:
"<cin>>q->PlaneNum;break;
case'3':
cout<<"请输入目的地:
"<cin>>q->Des;break;
case'4':
cout<<"请输入飞行周日:
"<cin>>q->Week;break;
case'5':
cout<<"请输入乘员定额:
"<Customer_Number=q->Ration-q->FreeTicket;
cin>>q->Ration;q->FreeTicket=q->Ration-Customer_Number;break;
case'6':
cout<<"请输入头等舱价格:
"<cin>>q->Price[0];break;
case'7':
cout<<"请输入普通舱价格:
"<cin>>q->Price[1];break;
case'8':
cout<<"请输入经济舱价格:
"<cin>>q->Price[2];break;
case'9':
break;
default:
cout<<"error\n";break;
}
5.FlightBuyTicket()——订票
订票是本系统的核心功能,本系统的一切功能都是围绕“订票”这个关键词来进行的。
用户确定所要乘坐的航班之后,进行订票,如果航班中的空余票数大于用户所要订的票数,则订票成功。
。
其原理是运用链表的来添加乘客信息,运用队列来使替补乘客入队。
其中,还调用了另外两函数:
BuyTicket()和Buyreplace()来实现订票成功和进入替补乘客名单。
具体实现如下:
voidFlightBuyTicket()//订票
{
intTicket_Amount;
voidBuyTicket(PFlight,int);
voidBuyreplace(PFlight,int,int);
Flight*p,*q;
charDes[10];
inti=2;
while(i!
=1)
{
cout<<"请输入目的地:
"<cin>>Des;
p=head;
while(p->next&&strcmp(p->next->Des,Des))
{
p=p->next;
}
q=p->next;
if(q==NULL)
{
cout<<"对不起不存在此航班"<}
else
{
while(i!
=1)
{
cout<<"输入需要够买的票数"<cin>>Ticket_Amount;
while(Ticket_Amount==0)
{
cout<<"请输入一个非零数:
"<cin>>Ticket_Amount;
}
if(Ticket_Amount<=q->FreeTicket)
{
BuyTicket(q,Ticket_Amount);
//买票,详细介绍见下文
}
else
{
intn;
cout<<"剩余票数小于定票数,是否需要列入候补名单?
(1、是2、否)"<cin>>n;
Buyreplace(q,Ticket_Amount,n);
//进入替补名单,详细介绍见下文
}
cout<<"1、返回主菜单2、继续"<cin>>i;
}
}
6.FlightCancelTicket()——退票
作为人性化的航空客运订票系统,不但要实现订票,还要实现退票。
在退票方面,仍旧是利用链表,将乘客信息删除。
但删除之后,如若有替补乘客,还要使其依照进入替补乘客的队列的次序出队来实现订票。
其具体实现代码如下:
voidFlightCancelTicket()//退票
{
voidBuyTicket(PFlight,int);
Flight*p,*q;
Customer*h,*j;
charFlightNum[6];
charCustomer_Name[10];
intReplace1_Amount;//候补第一个人的定票数
inti;
while(i!
=1)
{
cout<<"请输入需要退定的航班号:
"<cin>>FlightNum;
p=head;
while(p->next&&strcmp(p->next->FlightNum,FlightNum))
{
p=p->next;
}
q=p->next;
if(q==NULL)
{
cout<<"对不起不存在此航班"<}
else
{
while(i!
=2)
{
cout<<"请输入姓名:
"<cin>>Customer_Name;
h=q->CustName;
while(h->next&&strcmp(h->next->Name,Customer_Name))
{
h=h->next;
}
j=h->next;
if(j==NULL)
{
cout<<"查无此人"<}
else
{if(j->next==NULL){//当删除最后一个结点
Cusrear=h;
}
h->next=h->next->next;
q->FreeTicket+=j->Amount;
deletej;
cout<<"删除成功!
"<if(q->ReplName->next!
=NULL)
{
Replace1_Amount=q->ReplName->next->Amount;
if
(Replace1_Amount<=q->FreeTicket)
{
Replace*rep;
rep=q->ReplName->next;
Customer*Cus2;
Cus2=newCustomer;
Cus2->SeatNum=q->Ration-q->FreeTicket+1;
strcpy(Cus2->FlightNum,q->FlightNum);
strcpy(Cus2->Name,rep->Name);
Cus2->Amount=rep->Amount;
Cus2->Level=rep->Level;
cout<<"乘客"<Name<<"已经成功买票"<cout<<"座位号为:
";
for(inti=1;i<=(rep->Amount);i++)
{
}
q->FreeTicket-=rep->Amount;
q->ReplName->next=q->ReplName->next->next;
q->ReplacePas--;
deleterep;
}
}
}
cout<<"2、退出姓名录入"<cin>>i;
}
}
cout<<"1、返回主菜单"<cin>>i;
}
}
7.BuyTicket(PFlightq,intTicket_Amount)——买票
作为订票功能实现的核心之一,其思想是利用链表结构将买票乘客的信息添加到表中,具体实现如下:
voidBuyticket(PFlightq,intTicket_Amount)//买票
{
intn=Ticket_Amount;
Customer*Cus2;
Cus2=newCustomer;
Cus2->SeatNum=q->Ration-q->FreeTicket+1;
strcpy(Cus2->FlightNum,q->FlightNum);
Cus2->Amount=Ticket_Amount;
cout<<"请输入姓名:
"<cin>>Cus2->Name;
cout<<"请输入舱位等级:
"<cin>>Cus2->Level;
cout<<"你的座位号为"<for(inti=1;i<=Ticket_Amount;i++)
{
cout<SeatNum++<<"";
}
cout<if(q->CustName->next==NULL)
{
Cusrear=q->CustName;
Cusrear->next=Cus2;
Cusrear=Cus2;
Cusrear->next=NULL;
}
else{
Cusrear->next=Cus2;q->FreeTicket-=Ticket_Amount;
}
8.Flightclean()——系统清空
本方法是将航班信息清空,主要思想是将头指针赋予下一个结点,然后将原来的头指针删除,具体代码如下:
voidFlightclean()
{
head->next=rear->next;
cout<<"系统已经清空!
"<}
(一)Ticket.cpp,:
作为本程序的主函数,其完成的是各个函数的调用,来具体实现系统的功能:
#include"ticket.h"
voidmain()