1、 数据结构课程设计论文计算机科学与技术专业(2)班 36 号 杨晓光航空客运订票系统1、 问题描述航空客运订票的业务活动包括:查询航线、客票预订和办理退票等。设计一个航空客运订票系统,以使上述业务可以借助计算机完成。功能如下:a 查询航线:用户给出终点站名,系统输出航班班次、飞机号、时间及多余票额;b 承办订票业务;c 退票业务。2、 需求分析1) 每条航线所涉及的信息有:终点站名、航班号、飞机号、飞行周日(星期几)、 乘员定额、余票量、已订票的客户名单(包括名字、订票量、舱位等级1、2、3) 以及等候替补的客户名单;) 客户通过计算机进行订票时,先在终端输入终点站,执行查找操作,会出现两种情
2、况,一种是余票量为零,这时可询问客户是否要求候补,如要,则在候补名单中增加一个客户名单,由客户输入自己的相关信息,否,则退出;另一种是还有余票,客户应输入自己的名字,订票量和舱位等级,此时,变量都会发生相应的变化。操作完毕后,退出。3) 退票时,根据客户提供的情况(日期、航班) ,为客户办理退票手续,然后查询该航班是否有人候补,首先询问排在第一位的客户,若退票能满足他的要求,则为他办理订票手续,否则依次询问其他排队候补的客户,并让队头出队,再入队成为队尾。如果退票不满足所有候补乘客的要求,则退出,同时,该航班的余票额发生变化。3 假设分析假设某小型航空公司开设了 5 条直达航线,每条航线的信息
3、分为可变的和不可变的,其中定量有终点站站名、航班号、飞机号、飞行周日和乘员定额(分别为一等舱、二等舱、三等舱) ,变量则有余票量(分别为一等舱、二等舱、三等舱) 、已订票的乘客名单(名字、订票量、等级)和候补乘客。当用户输入终点站时,系统进行查找,成功则输入相关信息,不成功则请再输入一次。当用户进行订票或退票时,定量不变,系统对变量进行修改,操作成功后退出系统,否则,请用户再输入一次。4 数据流程图五 模块的划分由于订票系统涉及到三个基本操作,再加上数据的输入,可以将整个系统划分为四个模块,分别为数据的输入和保存,查询航线,订票以及退票。在数据的输入和保存这个模块中,数据需要保存在一个文件里面
4、,在查询、订票和退票模块中,对文件里的数据进行调用和处理,但文件里的数据保持不变。在退票模块中,要考虑是否有候补乘客,如果有并且退数据输入系 统 软 件订 票 退 票查 询候补队列票满足他的要求,则要调用订票模块,进行订票操作。数据的输入和保存输入终点站,飞机号,航班号时间,票额查 询订 票输入终点站,飞机号,航班号,时间,票额建立乘客链表初值赋予 0建立候补队列初值赋 0直到 i MAX输入终点站名 placei =1i +直到 Airlinei.Eplace= place输出终点站,飞机号,航班号时间,余票量输入终点站名直到输出终点站,飞机号,航班号时间,余票量票 满是 否是否候补 输入姓
5、名,订票额是 否 输入姓名 将乘客信息插入到订票额 乘客链表中去 入候补 余票=余票- 订票额 队列 退 票七 算 法1) 定义#define MAX 5#define N 10输入乘客姓名 在乘客链表中进行查询不成功 成功 打印出请 在乘客链表中删除该乘客信息再输入一 次 候补队列为空是 否 p =队头 余票=队头出队余票额+ 退票额 满足退票队头要求 是 否 把队头插入 队头入队到乘客链表 成为队尾中 队头= = p是 否余票=余票额+退票额#define M 10#define OK 1#define ERROR 0#include#includetypedef int status;s
6、truct seatint frist;int second;int third;/票的定义,分为一等、二等、三等。struct ElemTypechar name;seat ticket;/ElemTypetypedef struct LNodechar name;seat ticket;struct LNode *next;LNode,*passenger;typedef struct WQueue passenger front;passenger rear; /WQueue,候补队列;typedef struct ALchar EPlace; /终点站int FNo; / 航班号int
7、 PNo; /飞机号int Time; /时间seat Ticket; /总票量,用结构体 seatpassenger BPassenger; /已经订票的乘客,next 存放已经订票的乘客链表的表地址seat RTicket; /剩余的票额passenger wait; /候补队列,next 存放队头地址AL,AirlineMAX;2) 链表和队列的基本操作status Initlink(passenger if(!Pa) return ERROR;Pa-name=0;Pa-ticket.frist=0;Pa-ticket.second=0;Pa-ticket.third=0;Pa-next
8、=NULL;return OK;/Initlink,建立乘客链表status InitQueue(WQueue Q)Q.front=Q.rear=(passenger)malloc(sizeof(LNode);if(!Q.front)return ERROR;Q.front-next=NULL;return OK;/InitQueue,建立候补队列status EnQueue(WQueue p=(passenger)malloc(sizeof(LNode);if(!p) return ERROR;p-name=pa.name;p-ticket.frist=pa.ticket.frist;p-t
9、icket.second=pa.ticket.second;p-ticket.third=pa.ticket.third;p-next=NULL;Q.rear-next=p;Q.rear=p;return OK;/EnQueue,队头出队status InsertList(passenger p=L;while(p-nextq=(passenger)malloc(sizeof(LNode);q-ticket.frist=pa.ticket.frist;q-ticket.second=pa.ticket.second;q-ticket.third=pa.ticket.third;q-next=N
10、ULL;p-next=q;return OK; /乘客链表的插入status DeQueue(WQueue if(Q.front=Q.rear)return ERROR;q=Q.front-next;p.name=q-name;p.ticket.frist=q-ticket.frist;p.ticket.second=q-ticket.second;p.ticket.third=q-ticket.third;Q.front-next=q-next;if(Q.rear=q)Q.front=Q.rear;return OK;/DeQueue,入队列status search_delet(passe
11、nger L,ElemType pa)passenger p,q;p=L-next;while(p-next)if(p-next-name=pa.name)return OK;else p=p-next;/whileq=p-next;p-next=q-next;free(q);return OK;/ 乘客链表的插入和删除2) 各个模块的具体算法 输入数据信息 status Enter( AL AirlineMAX)int i;printf(“Please enter these messages!n“);for(i=0;iname=0;Airlinei.BPassenger-ticket.fr
12、ist=0;Airlinei.BPassenger-ticket.second=0;Airlinei.BPassenger-ticket.third=0;Airlinei.BPassenger-next=Pa;WQueue Q;InitQueue(Q);Airlinei.wait-name=0;Airlinei.wait-ticket.frist=0;Airlinei.wait-ticket.second=0;Airlinei.wait-ticket.third=0;Airlinei.wait-next=Q.rear;Airlinei.RTicket.frist= Airlinei.Ticke
13、t.frist;Airlinei.RTicket.second = Airlinei.Ticket.second;Airlinei.RTicket.third = Airlinei.Ticket.third;/forreturn OK; / 输入航线信息查 询 status Search(char place, AL AirlineMAX)int i;for(i=0;i=MAX)printf(“Please enter again!n“);return Airlinei; /Search,查找订 票status Book(AL line )int p,q;WQueue Q;passenger
14、Pa;ElemType pa;printf(“Do you want to book tickets?n“);scanf(“%d“,if(!p)printf(“Thank you!n“);elseif(line.RTicket.frist=0scanf(“%d“,if(!q)printf(“Thank you!n“);else EnQueue(Q,pa);/ifelseprintf(“Please enter your name and ticket:n“);scanf(“%c,%d,%d,%d“,InsertList(Pa,pa);line.RTicket.frist=line.RTicke
15、t.frist-pa.ticket.frist;line.RTicket.second=line.RTicket.second-pa.ticket.second;line.RTicket.third=line.RTicket.third-pa.ticket.third;printf(“Successful! Thank you!n“); /else/elsereturn OK;/Book,订票退票status Return(AL line)ElemType pa;printf(“Do you want to return your ticket?n“);int p;WQueue Q;scanf
16、(“%d“,if(p)scanf(“%c,%d,%d,%d“,search_delet(line.BPassenger,pa);if(Q.rear!=Q.front)DeQueue(Q,pa);InsertList(line.BPassenger,pa);/ifelse line.RTicket.frist=line.RTicket.frist+pa.ticket.frist;line.RTicket.second=line.RTicket.second+pa.ticket.second;line.RTicket.third=line.RTicket.third+pa.ticket.third
17、; /else /ifelse printf(“Thank you!n“);return OK;/退票八 测试数据输入 a,01,747,020312,20,30,40,b,02,747,020312,10,20,30,c,03,747,20,30,50,d,04,747,020314,50,10,20,d,05,747,020214,10,20,30,当输出“Please enter a place:”时,请任意输入一个一个字符的地名,如果输出“Please enter again!”,则表明没有与该地名匹配的信息,反之,会输出终点站、飞机号、航班号以及一、二、三等舱的余票额。接下来,程序输出“Do you want to book tickets?”,如果要,请输入“1” ,程序会输出“Please enter your name :”请输入你的姓名(一个字符)和订票额(一等、二等、三等) ,订票成功后会输出“Successful!Thank you!”。如果不要订票,请输入“0 ” ,程序将输出“Thank you!”当程序输出“Do you want to return your tickets?”时,操作与订票基本一致。九 心得体会这次课程设计进行了整整两个星期,虽然一整天都在电脑房里对着电脑,很枯燥,也很辛苦,但是我觉得还是很有收获的。