
实验报告27题航空客运订票系统.doc
13页班级:计算机03 (2)姓名:关海宁学号:29实验报告 2.7 题 航空客运订票系统实验报告题目:编织一个航空客运订票系统班级:计算机 03( 2) 姓名:关海宁 学号: 29 完成日期: 矚慫润厲钐瘗睞枥庑赖 賃軔需要分析 用一个带头结点的单向链表存储已订票的客户的信息,每个节点包括 data、next 域, data 域包括客户姓名、订票量、 航位等级、证件类型、证件号码五个域;当没有订票客户时,链 表只有头结点; 聞創沟燴鐺險爱氇谴净祸測用一个带有节点、尾结点的链表存储结构的队列来存储等候替补的客户名单每结点包括 data和next两个域,data域包括客户姓名和所需票量两个域; 残骛楼諍锩瀨濟溆塹籟婭骤用一个顺序表存储航线信息, 每个结点包括终点名、航班号、飞机号、飞行日期、飞行周 日、乘员定额、余票量、客户链表和替补客户队列 9 个域; 酽锕极額閉镇桧猪訣锥顧荭 可根据客户提出的终点站名查询航线 所有符合的则输出最近一天该航线的航班号、 飞机号、 飞行日期、飞行周日和余票量; 彈贸摄尔霁毙攬砖卤庑诒尔订票业务, 根据客户提出的要求 (航班号、 订票数额) 查询该航班的票额情况, 若尚有余额, 则为客户办理订票手续, 输出座位号; 若已满员或余额少于订票量, 则需重新询问客户要求。
若需要则排队候补; 謀荞抟箧飆鐸怼类蒋薔點鉍承办退票业务:更具客户提供的情况(航班号、客户姓名、证件号) ,为客户办理退票手续, 然后查询该航班是否有人排队候补 首先询问排在第一的客户, 若所退票额能满足他的要求, 则为他办理订票手续,否则一次询问其他候补的客户 厦礴恳蹒骈時盡继價骚卺癩测试数据见目录下的 ” hangban.txt、"” kehu1.,txt、kehu2.txt文'本程序执行的命令为:1 )显示航班 2)新增 3)查询 4)订票 5)退票 6)显示客户 7)保存概要设计设定顺序表的抽象数据类型定义为:ADT List{数据对象:D={a.i | a.i属于ElemSet , I = 1 , 2 , ……,茕桢广鳓鯡选块网羈泪镀齐数据关系:R1={ < a.i-1 , a.i> | a.i属于 D , I = 2 , ••…鹅娅尽損鹤惨歷茏鴛賴縈诘基本操作:InitList(&L) 操作结果:构造一个空的线性表 LDestroyList(&L) 初始条件:线性表 L 已存在 操作结果:烧毁线性表 L ClearList(&L) 初始条件:线性表 L 已存在 操作结果:将 L 重置为空表。
ListEmpty(L) 初始条件:线性表 L 已存在 操作结果:若 L 为空表,则返回 TRUE ,否则返回 FALSE ListLength(L) 初始条件:线性表 L 已存在 操作结果:返回 L 中数据元素的个数GetElem(L ,i, &e)初始条件:线性表 L 已存在, 1<=i<=ListLength(L) 操作结果:用e返回L中第i个数据元素的值LocateElem(L , e,compare() )初始条件:线性表 L已存在,compare()是数据元素判定函数操作结果:返回L中第一个与e满足关系compare的数据元素的位序若这样的数据元素 不存在,则返回值为 0 籟丛妈羥为贍偾蛏练淨槠挞PriorElem(L , cur_e, &pre_e)初始条件:线性表 L 已存在操作结果:若 cur_e 是 L 数据元素,且不是第一个,则用 pre_e 返回它的前驱,否则操作失 败,pre_e无定义預頌圣鉉儐歲龈讶骅籴買闥NextElem(L , cur_e, &next_e)初始条件:线性表 L 已存在操作结果:若cur_e是L的数据元素,且不是最后一个, 则用next_e返回它的后续,否则操作失败, next_e 无定义 渗釤呛俨匀谔鱉调硯錦鋇絨。
ListInsert(&L , i , e )初始条件:线性表 L 已存在, 1<= i <=ListLength(L) + 1 操作结果:在 L 中第 i 个位置之前插入新的数据元素 e, L 的长度加 1ListDelete(&L , i , e)初始条件:线性表 L 已存在且非空, 1<= i <=ListLength(L) + 1 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1ListTraverse(L,visit ( ) )初始条件:线性表 L 已存在操作结果:依次对 L的每个数据元素调用函数 visit ()一旦visit ()失败,则操作失败}ADT List2.本程序包括四个模块1 )主程序模块:Void main(){初始化;While(ch !=‘ 0'){接受命令;处理命令;Cin>>ch;}}2) 链表模块 —— 实现链表抽象数据类型3) 队列模块 —— 实现链表抽象数据类型4) 顺序表模块 —— 实现顺序表抽象数据类型详细设计链表的数据类型:typedef struct{newString name; //客户姓名int number; //订票量newString Class; //航位等级newString zjlx; //证件类型newString zjh; //证件号码}ElemType;typedef struct LNode //头指针的 number 域纪录总订票量{ElemType data;struct LNode *next;// 指针域}LNode,*LinkList;Status InsertKehu1(LinkList &L);〃按输入增加客户1Status InsertKehu1(LinkList &L,QElemType e);//按输入增加客户1 。
e 传送新增客户的名字和订票量void CreateKehu1(LinkList &L,ifstream& infile); //从文件读取信息,建立客户1链表,凡回头指针LinkList SearchKehu1(LinkList L); //查找函数.如果找到,则返回所找元素的前域.否则返回空指针 Status SearchKehu1(LinkList L,newString NAME,newString ZJH); 铙誅卧泻噦圣骋贶頂廡缝勵 //查找函数.如果找到,则返回 TRUE .否则返回 FALSEStatus DeleteKehu1(LinkList &L);//删除某个客户如果成功,则返 OK 否则返回 FALSEvoid PrintKehu1(LinkList L);//显示所有客户的信息 其中部分操作的算法:Status DeleteKehu1(LinkList &L) //删除某个客户 如果成功, 则返 OK 否则返回 FALSE擁締凤袜备訊顎轮烂蔷報赢{LinkList p;p=SearchKehu1(L);if(!p)return FALSE;LinkList q;q=p->next;L->data.number-=q->data.number;p->next=q->next;delete(q);return OK;}Status SearchKehu1(LinkList L,newString NAME,newString ZJH) 贓熱俣阃歲匱阊邺镓騷鯛汉。
//按姓名、证件号查找.如果找到,则返回 TRUE .否则返回 FALSE{LinkList p=L->next;while(p){if(p->data.name==NAME&&p->data.zjh==ZJH)return OK; p=p->next;}return FALSE;}队列的数据类型typedef struct{newString name; //预约订票的客户的姓名int number; //订票量}QElemType;typedef struct kehu2{QElemType data;struct kehu2 *next;}kehu2,*Kehu2Ptr;typedef struct{Kehu2Ptr front; //队头指针Kehu2Ptr rear; //队尾指针}Kehu2Queue;Status InitQueue(Kehu2Queue &q);//构造一个空队列Status EnQueue(Kehu2Queue &q,QElemType e);〃插入元素e为q的新的队尾元素Status EnQueue(Kehu2Queue &q);//按输入新增队列元素Status CreateQueue(Kehu2Queue &q,ifstream& infile); 坛摶乡囂忏蒌鍥铃氈淚跻馱。
//从文件读入数据,新建队列 qvoid PrintQueue(Kehu2Queue q);//显示客户队列的所有信息void PrintQueue_H(Kehu2Queue q);//显示客户队列头结点的信息Status GetQueue(Kehu2Queue &q,QElemType &e,int i);//若队列不空且存在符合 i 要求的结点,则将该结点的值与头结点交换,返回 //OK ;否则返回 FALSEStatus DeQueue(Kehu2Queue &q,QElemType &e);〃若队列不空,则删除 q的队头元素,用e返回其值其中部分操作的算法:Status EnQueue(Kehu2Queue &q,QElemType e) //插入元素 e 为 q 的新的队尾元素 蜡變黲癟 報伥铉锚鈰赘籜葦{Kehu2Ptr p;p=(Kehu2Ptr)new kehu2;if(!p)return FALSE; p->data.name=e.name ; p->data.number=e.number; p->next=NULL; q.rear->next=p;q.rear=p;return OK;}Status DeQueue(Kehu2Queue &q,QElemType &e)//若队列不空,则删除 q 的队头元素,用 e 返回其值 {if(q.front==q.rear)return FALSE; Kehu2Ptr p=q.front->next;e.name=p->data.name; e.number=p->data.number; q.front->next=p->next;p->next=NULL; if(q.rear==p)q.rear=q.front;delete p; return OK;}顺序表的数据类型typedef struct{newString des; // 终点站名newString hbh; //航班号newString fjh; // 飞机号newString date; //飞行日期newString day; //飞行周日int number; //乘员定额int resnum; //剩余票量LinkList L; //指向客户 1 链表的头指针Kehu2Queue queue;}hangban;typedef ha。












