数据结构试验报告.docx
- 文档编号:5253211
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:36
- 大小:342.17KB
数据结构试验报告.docx
《数据结构试验报告.docx》由会员分享,可在线阅读,更多相关《数据结构试验报告.docx(36页珍藏版)》请在冰豆网上搜索。
数据结构试验报告
3.航空订票系统:
1.需求分析:
(1)、可以实现航班信息的管理,包括查看航班信息,修改航班信息,删除航班信息;
(2)、可以查询查询航班信息,实现按起点站查询,按终点站查询,按日期查询功能;
(3)、实现订票业务,若有余票,则订购余票,若余票不够,问是否加入排队等待候列;
(4)、实现退票业务,退票后,要查询在排队等待的人,看退票和原来余票量是否满足客户的要求。
2.设计
2.1:
设计思想
(1)、数据结构设计
a、由于每趟航班的信息量比较大,则需要定义一个结构体表示航班的基本信息,航班的基本信息采用链表存储,以便于查询和修改航班信息;
b、至于座位等级,用一个二维数组保存座位号,第一维表示座位等级,第二维表示座位号;每当座位被定时,把这个等级的座位号标记为1,表示座位状态为已定。
当有客户退票时,座位号的标记又变为0,表示状态为未定;
c、用一个链表来存储已经订票的客户的信息,必要的时候可以查看已定客户的信息;
d、再用一个队列来保存等待的客户的信息,当有人退票时,需要查看在等待的用户是否能够订票。
(2)、算法设计
这个程序中没有用到特别的什么算法,主要是对链表和队列操作。
2.2、设计表示
(1)、函数调用关系
main()————>Menuselect()(输出菜单的函数)
选择1:
————>manage()(管理航班信息)
选择1:
——————>store()(存储航班信息)
选择2:
——————>Delete()(删除航班信息)
选择3:
——————>revise()(修改航班信息)
选择4:
——————>check()(查看当前航班信息)————>display()
(输出航班信息)
选择2:
—————>find()(查找航班信息)
选择1:
——————>FindInPlaneNumber()(按航班号查询)
选择2:
——————>FindInStartPoint()(按起点查询)
选择3:
——————>FindInEndPoint()(按终点站查询)
选择4:
——————>FindInDate()(按日期查询)
选择3:
——————>Ordertickets()(订票函数)
———————>WaitForMore()(排队等候)
选择4:
———————>Returntickets()(退票函数)
选择1:
——————>WaitedReturn()(加入过等待用户的退票)
选择2:
——————>UnwaitedReturn()(没有加入过顶戴用户的订票)
(2)、函数接口规格说明
voidListInitiate()//初始化各个指针
voiddisplay(airline*find)//输出航班信息函数
voidstore()//存取航班信息
voidDelete()//删除航班信息
voidrivise()//修改航班信息
voidcheck()//查询航班信息
voidManage()//管理航班系统的函数
structairline*FindInPlaneNumber()//按航班号查询
voidFindInStartPoint()//按起点站查询
voidFindInEndPoint()//按终点站查询
voidFindInDate()//按日期查询
voidfind()//查询函数
voidWaitForMore(charnumber[],intamount,intgrade,charname[],airline*p)//等待更多票的用户
voidOrdertickets()//订票函数
voidWaitedReturn(charname[])//等待过的用户退票
voidUnwaitedReturn(charname[])//没有等待过的用户退票
voidReturntickets()//退票函数
intMenuselect()//显示菜单界面的函数
voidmain()//主函数
3.调试分析
1、关于参数传递的问题:
由于之前学习的c语言中关于参数传递的部分没有学扎实,在传递数组的时候,出现了错误,后来在同学的帮助下,学会了正确的传递参数的方法。
2、关于座位号有没有被定得问题:
开始的时候,直接用加减法来计算座位订购情况,发现在当前边的作为被退的时候,不能正确的输出座位号,后来苦思冥想,想出了用标记的方法来区分座位是否被订购。
3.关于判断等候的人是否可以订票的问题:
开始的时候,没有加循环,导致如果第一个等候的人不能订票,后边的人都不能订票,后来在老师的提示下,加入了一个循环,解决了这个问题。
4、改进思想:
可以再增加部分退票的功能,其实也不难,就是让顾客输入要退票的座位号,然后,把这些作为好的标志修改一下。
5、经验体会:
通过这个程序的实习,完全掌握了对链表和队列的的应运,同时又加深了程序模块化的思想。
6、时间复杂度和空间复杂度:
本程序的时间复杂度和空间复杂度都为O(n)。
4、用户手册
1、程序运行后,首先显示的是主菜单界面;
2、用户可进行选择操作;
3、存取航班是需要按提示的顺序输入航班的信息;删除航班时要输入航班号;修改航班时也是要重新输入航班信息;
4、查询航班时:
按每种方式查询,都需要按照提示输入对应的信息;
5、订票时需要按照提示输入航班号,订票量,舱位等级和姓名
6、退票时也需要输入姓名和有没有加入过排队等候的队列。
5、测试数据及测试结果
6、源程序清单
#include
#include
#include
usingnamespacestd;
#defineMAXSIZE20
typedefstructwait
{
charPlaneNumber[10];//航班号
charname[10];//姓名
intNeedNumber;//总订票量
intWaitNumber;//等待订票量
intgrade;//舱位等级
charOrderedNumber[3][50];//保存已经订票的座位号
intOrderNumber;//已经订票量
structwait*next;
}qnode,*qptr;
structwait*begin;
typedefstructpqueue
{qptrfront;//等候替补客户名单域的头指针
qptrrear;//等候替补客户名单域的属指针
}linkqueue;
typedefstructorder
{
charPlaneNumber[10];//已定票的航班号
charname[10];//客户姓名
intOrdernumber;//订票量
intgrade;//舱位等级
intsitsnumber[3][50];//保存已定座位号
order*next;
}linklist;
structorder*start;
typedefstructairline
{
charPlaneNumber[10];
charPlaneType[10];
charStartPoint[10];
charEndPoint[10];
charDate[10];
charStartTime[10];
charEndTime[10];
intFlyTime;
intGradePrice[3];
intSitsNumber[3];
//intLeftNumber[3];
inttarget[3][100];//标记已经订过的座位号为1
structairline*next;
linklist*order;//指向乘员名单链表的头指针
linkqueuewait;//指向等候域的头指针
}SLNode;
structairline*head;
voidListInitiate()
{
head=(SLNode*)malloc(sizeof(SLNode));
start=(linklist*)malloc(sizeof(linklist));
begin=(qnode*)malloc(sizeof(qnode));
head->next=NULL;
start->next=NULL;
begin->next=NULL;
}
voiddisplay(airline*find)//输出航班信息函数
{
inti;
cout<<"航航起降日起降飞三个等三个等"< cout<<"班班飞落飞落行级舱位级的乘"< cout<<"机机机时时时的价格员定额"< cout<<"号型场场期间间长分别为分别为"< cout< find->Date<<""< ","< ","< cout<<"头等舱的座位号是: 1--"< cout<<"头等舱剩余票座位号是: "< for(i=0;i { if(find->target[0][i]==0) cout< } cout< cout<<"公务舱的座位号是: "< cout<<"公务舱剩余票座位号是: "< for(i=find->SitsNumber[0];i<(find->SitsNumber[0]+find->SitsNumber[1]);i++) { if(find->target[1][i]==0) cout< } cout< cout<<"经济舱的座位号是: "< find->SitsNumber[0]+find->SitsNumber[1]+find->SitsNumber[2]< cout<<"经济舱剩余票座位号是: "< for(i=find->SitsNumber[0]+find->SitsNumber[1];i { if(find->target[2][i]==0) cout< } cout< } voidmanageselect() { cout<<"******************************************"< cout<<"1.存取航班"< cout<<"******************************************"< cout<<"请按以上方式选择: "< } voidstore()//存取航班信息 { inti; structairline*p,*q; p=(SLNode*)malloc(sizeof(SLNode)); cout<<"请输入要存取的航班信息: "< cout<<"航班号为: "< cin>>p->PlaneNumber; cout<<"航班类型为: "< cin>>p->PlaneType; cout<<"起飞机场为: "< cin>>p->StartPoint; cout<<"降落机场为: "< cin>>p->EndPoint; cout<<"日期为: "< cin>>p->Date; cout<<"起飞时间为: "< cin>>p->StartTime; cout<<"降落时间为: "< cin>>p->EndTime; cout<<"飞行时长为: "< cin>>p->FlyTime; cout<<"头等舱的价格是: "< cin>>p->GradePrice[0]; cout<<"公务舱的价格是: "< cin>>p->GradePrice[1]; cout<<"经济舱的价格是: "< cin>>p->GradePrice[2]; cout<<"头等舱的座位数是: "< cin>>p->SitsNumber[0]; cout<<"公务舱的座位数是: "< cin>>p->SitsNumber[1]; cout<<"经济舱的座位数是: "< cin>>p->SitsNumber[2]; for(i=0;i p->target[0][i]=0; for(i=p->SitsNumber[0];i p->target[1][i]=0; for(i=p->SitsNumber[0]+p->SitsNumber[1];i p->target[2][i]=0; p->next=head->next; head->next=p; q=head->next; cout<<"现有的航班是: "< while(q) { display(q); q=q->next; } } voidDelete() { structairline*p,*s; charnumber[10]; p=head->next; s=head; cout<<"请输入要删除的的航班号: "< cin>>number; while(p) { if((! strcmp(number,p->PlaneNumber))&&s->next==p) s->next=p->next; s=s->next; p=p->next; } } voidrivise() { charnumber[10]; structairline*p; p=head->next; cout<<"请选择要修改的航班号"< cin>>number; while(p) { if(! strcmp(number,p->PlaneNumber)) { cout<<"请输入要修改的航班信息: "< cout<<"航班号为: "< cin>>p->PlaneNumber; cout<<"航班类型为: "< cin>>p->PlaneType; cout<<"起飞机场为: "< cin>>p->StartPoint; cout<<"降落机场为: "< cin>>p->EndPoint; cout<<"日期为: "< cin>>p->Date; cout<<"起飞时间为: "< cin>>p->StartTime; cout<<"降落时间为: "< cin>>p->EndTime; cout<<"飞行时长为: "< cin>>p->FlyTime; cout<<"头等舱的价格是: "< cin>>p->GradePrice[0]; cout<<"公务舱的价格是: "< cin>>p->GradePrice[1]; cout<<"经济舱的价格是: "< cin>>p->GradePrice[2]; cout<<"头等舱的座位数是: "< cin>>p->SitsNumber[0]; cout<<"公务舱的座位数是: "< cin>>p->SitsNumber[1]; cout<<"经济舱的座位数是: "< cin>>p->SitsNumber[2]; } p=p->next; } } voidcheck() { structairline*q; q=head->next; cout<<"现在的航班信息为: "< while(q! =NULL) { display(q); q=q->next; } } voidManage()//管理航班系统的函数 { inti=0,flag=0; manageselect(); while(! flag) { cin>>i; if(i! =1&&i! =2&&i! =3&&i! =4&&i! =5) { cout<<"选择错误,请重新输入"< cin>>i; } else switch(i) { case1: store();manageselect();break; case2: Delete();manageselect();break; case3: rivise();manageselect();break; case4: check();manageselect();break; case5: flag=1; } } } structairline*FindInPlaneNumber()//按航班号查询 { airline*find,*p; charnumber[10]; find=head->next; p=head; cout<<"请输入飞机号: "< cin>>number; while(find) { if(! strcmp(number,find->PlaneNumber)) { display(find); returnfind; } } } voidFindInStartPoint()//按起始地点查询 { airline*find,*p; charpoint[10]; find=head->next; p=head; cout<<"请输入起点站名字: "< cin>>point; while(find) { if(! strcmp(point,find->StartPoint)) { display(find); } if(find->next==NULL&&(strcmp(point,p->StartPoint))) { cout<<"对不起,没有找到你所需要的航班"< } find=find->next; p=p->next; } } voidFindInEndPoint()//按终点站查询 { airline*find,*p; charpoint[10]; find=head->next; p=head; cout<<"请输入终点站名: "< cin>>point; while(find) { if(! strcmp(point,find->EndPoint)) { display(find); } if(find->next==NULL&&(strcmp(point,p->StartPoint))) cout<<"对不起,没有找到你所需要的航班"< find=find->next; p=p->next; } } voidFindInDate()//按日期查询 { airline*find,*p; charDate[10]; find=head->next; p=head; cout<<"请输入航班日期: "< cin>>Date; while(find) { if(! strcmp(Date,find->Date)) { display(find); } if(find->next==NULL&&(strcmp(Date,find->Date))) cout<<"对不起,没有找到你所需要的航班"< find=find->next; p=p->next; } } voidfind()//查询函数 { inti; cout<<"******************************************"< cout<<"1.按航班号查询"< cout<<"******************************************"< cout<<"请按以上方式选择: "< cin>>i; if(i! =1&&i! =2&&i! =3&&i! =4) { cout<<"选择错误,请重新输入"< cin>>i; } else { switch(i) { case (1): FindInPlaneNumb
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 试验报告