课程设计说明书11、设计目的和要求1、录入航线信息:每条航线信息包括航班号、飞机号、目的地、订票数、余票数共5项。假设现在有3条航线,目的地分别是北京,上海,广州,飞机上可乘坐100人(即初始订票数为0,余票数为100)。2、订票业务:客户信息包括姓名,航班号,座位号(初始为0)。有新客户订票时,先输入客户的姓名和他提出的航班号,查询该航线的订票情况,若有余票,则为客户办理订票手续,分配给客户一个座位号,然后将新客户的信息添加,并修改该航线的订票数和余票数。若无余票,则输出客满信息。进一步可实现如果该航班已经无票,可以提供相关可选择航班信息。3、退票业务:根据客户提出的航班号,办理退票,删除该客户的信息,并修改文件相应航线的订票数和余票数。4、修改航班信息:当航班信息改变可以修改。2、设计原理1、线性链表1.1线性链表简介线性表的链式存储结构称为线性链表,是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接来实现的。因此,在链式存储方式中,每个结点由两部分组成:一部分用于存放数据元素的值,称为数据域;另一部分用于存放指针,称为指针域,用于指向该结点的前一个或后一个结点(即前件或后件)1.2线性链表分类线性链表分为单链表、双向链表和循环链表三种类型。在单链表中,每一个结点只有一个指针域,由这个指针只能找到其后件结点,而不能找到其前件结点。因此,在某些应用中,对于线性链表中的每个结点设置两个指针,一个称为左指针,指向其前件结点;另一个称为右指针,指向其后件结点,这种链表称为双向链表。1.3线性链表的基本运算(1)在线性链表中包含指定元素的结点之前插入一个新元素。在线性链表中插入元素时,不需要移动数据元素,只需要修改相关结点指针即可,也不会出现课程设计说明书2“上溢”现象。(2)在线性链表中删除包含指定元素的结点。*:在线性链表中删除元素时,也不需要移动数据元素,只需要修改相关结点指针即可。(3)将两个线性链表按要求合并成一个线性链表。(4)将一个线性链表按要求进行分解。(5)逆转线性链表。(6)复制线性链表。(7)线性链表的排序。(8)线性链表的查找。线性链表不能随机存取。1.4线性表顺序存储的缺点:(1)插入或删除的运算效率很低。在顺序存储的线性表中,插入或删除数据元素时需要移动大量的数据元素;(2)线性表的顺序存储结构下,线性表的存储空间不便于扩充;(3)线性表的顺序存储结构不便于对存储空间的动态分配。2、航班的信息为了便于查找和修改,航班的情况存储结构采用单链表,每个元素表示一个航班的情况,包括航班号、起飞达到的时间、空座和目的的、票价以及限座七个数据项:降落城市航班号飞机号飞行时间余票量总座位数起飞城市单链表如下:每个结点包括数据域和指针域:数据域指针域3、旅客的资料为了便于插入、删除和修改,其采用单链表存储结构,每个数据元素包括姓名、证件号码、航班号和座位号四个数据项:旅客姓名航班号座位号票的张数每个结点包括数据域和指针域:数据域指针域hD1D2D3课程设计说明书34、客户链表每个数据元素包括头指针和尾指针两个数据项:每个结点包括两个指针域:3、设计内容1、总体设计总体设计的流程图如图2-1,飞机订票系统的总的界面图如图2-2。图2-1图2-22、录入航班信息模块首先是需要进行管理员密码验证,设置的密码为char头指针域尾指针域课程设计说明书4password[20]=guanliyuan;intaddflight(air&plane)调用if(strcmp(ps,password)==0)进行密码验证,密码正确后,调用createlistcorrect(plane);增加航班信息。会依次要求输入:站名-航班号-飞机号-飞行时间客机容量-总余票量。将新航班结点插入航班链表中。如图3-1图3-13、删除航班模块添加、删除航班信息的流程图如图3-5所示。首先是需要进行管理员密码验证,设置的密码为charpassword[20]=guanliyuan;intdeleteflight(air&plane)会调用if(strcmp(ps,password)==0)进行密码验证,密码正确后,调用scanf(%s,banci);锁定班次,后用语句delep=plane-next;frontp=plane;将此航班删除。如图3-2。图3-2删除前的全部航班显示:如图3-3图3-5课程设计说明书5图3-3删除后的全部航班显示:如图3-4图3—44、查询航班模块航班的查询有三种,目的地查询、航班号查询和查询全部航班。具体流程图如图3-9图3-9调用intsearchaim(airplane)查询函数,通过if(strcmp(p-terminusname,Aim)==0)进行目的地对应查询,找到所查询的航班号,显示航班信息printf(航班号:%s飞机号:%s飞行时间:%s余量:%d\n,p-flightno,p-planeno,p-flytime,p-unsellno);如图3-6图3-6课程设计说明书6调用intsearchnum(airplane)查询函数,通过if(strcmp(p-flightno,Aim)==0)进行航班号对应查询,找到所查询的航班号,显示航班信息printf(航班号:%s飞机号:%s飞行时间:%s余量:%d\n,p-flightno,p-planeno,p-flytime,p-unsellno);如图3-7图3-7可以进行全部航班的查询显示,显示结果如图3-8图3-85、客户订票、退票模块客户订票、退票的流程图如图3-10所示5.1订票系统图3-10通过调用intbookticket(air&plane)函数,依次输入登记:航班号-购买的票数-姓名,后系统会分配一个座位号给你,并将新客户结点插入客户链表中。如图3-11图3-115.2退票系统通过调用inttuipiao(air&plane)函数,依次校对:航班-日期-用户名,核对后,可以退票成功。如图3-12图3-126、登记、查询模块6.1客户登记模块客户登记模块分为已经订票的客户信息,和预订票的客户信息。同是管理员可课程设计说明书7以通过密码登陆后查询全部的已经订票的客户信息和预订票的客户信息,流程图如图3-13,客户登记,如图3-14、3-15图3-13图3-14图3-156.2管理员查看客户信息模块同是管理员可以通过密码登陆后查询全部的已经订票的客户信息和预订票的客户信息附录1:#includestdio.h#includestdlib.h#includestring.h#includemalloc.h#defineERROR0#defineOK1typedefstructaldbook{//已订票人结点charalbookname[20];//订票人姓名intalbookno;//订票量structaldbook*next;}aldbook,*albook;typedefstructundbook{//等候订票人节点charunbookname[20];//等候订票人姓名intunbookno;//所需票量structundbook*next;}undbook,*unbook;typedefstruct{//队列unbookfront;//队头指针unbookrear;//队尾指针}linkqueueun;typedefstructairline{//航线结点charterminusname[20];//终点站名charflightno[10];//航班号charplaneno[10];//飞机号charflytime[10];//起飞时间课程设计说明书8intallnumber;//乘员定额intunsellno;//余票量structairline*next;albookalbookP;linkqueueunQY;}airline,*air;intinitqueue(linkqueueun&Q){//建立以Q为头结点的链队列,成功返回OK,否则返回ERRORQ.front=Q.rear=(unbook)malloc(sizeof(undbook));//分配存储空间,使队头队尾指针指向同一结点if(!Q.front)returnERROR;//分配空间失败Q.front-next=NULL;returnOK;}//initqueue()intinitlist1(air&P){//建立存储航线信息的空链表P=(air)malloc(sizeof(airline));if(!P)returnERROR;P-next=NULL;returnOK;}//initlist1()intinitlist2(albook&Y){//建立存储已定票人信息的空链表Y=(albook)malloc(sizeof(aldbook));if(!Y)returnERROR;Y-next=NULL;returnOK;}//initlist2()intenqueue(linkqueueun&Q,charname[],intnum)intdeletelist(albook&Y,charname[])//在存放已定票人信息的链表中删除用户名为name[]的结点{//并返回此用户的订票数量inti;albookp,q;p=Y-next;q=Y;while(p&&strcmp(p-albookname,name)){p=p-next;q=q-next;}if(!p){printf(对不起!本航班无此用户信息!请确认是否输入正确!\n);returnERROR;}i=p-albookno;q-next=p-next;free(p);课程设计说明书9returni;}//deletelist()intcreatelistcorrect(air&p)//建立存储航线信息的链表{airnewbase,pa;pa=p;newbase=(airline*)malloc(sizeof(airline));if(!newbase)returnERROR;printf(请依此输入以下内容:\n);printf(请输入终点站名:);scanf(%s,newbase-terminusname);printf(请输入航班号:);scanf(%s,newbase-flightno);printf(请输入飞机号:);scanf(%s,newbase-planeno);printf(请输入飞行时间(输入格式为:飞行周日(用数字表示)-(具体时间)):);scanf(%s,newbase-flytime);printf(请输入客机容量:);scanf(%d,&newbase-allnumber);printf(请输入客机总余票量:);scanf(%d,&newbase-unsellno);initlist2(newbase-albookP);initqueue(newbase-QY);newbase-next=pa-next;pa-next=newbase;returnOK;}//createlistcorrect()intcreatelist(air&p){//建立以P为头结点的链表airnewbase;newbase=(airline*)malloc(sizeof(airline));//分配新的存储空间if(!newbase)returnERROR;//分配失败strcpy(newbase-terminusname,上海);//初始化strcpy(newbase-flightno,AZ001);strcpy(newbase-planeno,BY747);strcpy(newbase-flytime,3-09:00);newbase-allnumber=200;newbase-unsellno=200;initlist2(newbase-albookP);//建立存储以订