数据结构试验报告.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<PlaneNumber<<""<PlaneType<<""<StartPoint<<""<EndPoint<<""<<
find->Date<<""<StartTime<<""<EndTime<<""<FlyTime<<""<GradePrice[0]<<
","<GradePrice[1]<<","<GradePrice[2]<<""<SitsNumber[0]<<","<SitsNumber[1]<<
","<SitsNumber[2]<<""<cout<<"头等舱的座位号是:
1--"<SitsNumber[0]<cout<<"头等舱剩余票座位号是:
"<for(i=0;iSitsNumber[0];i++)
{
if(find->target[0][i]==0)
cout<
}
cout<cout<<"公务舱的座位号是:
"<SitsNumber[0]<<"--"<SitsNumber[0]+find->SitsNumber[1]<cout<<"公务舱剩余票座位号是:
"<for(i=find->SitsNumber[0];i<(find->SitsNumber[0]+find->SitsNumber[1]);i++)
{
if(find->target[1][i]==0)
cout<
}
cout<cout<<"经济舱的座位号是:
"<SitsNumber[0]+find->SitsNumber[1]<<"--"<<
find->SitsNumber[0]+find->SitsNumber[1]+find->SitsNumber[2]<cout<<"经济舱剩余票座位号是:
"<for(i=find->SitsNumber[0]+find->SitsNumber[1];iSitsNumber[0]+find->SitsNumber[1]+find->SitsNumber[2];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;iSitsNumber[0];i++)
p->target[0][i]=0;
for(i=p->SitsNumber[0];iSitsNumber[0]+p->SitsNumber[1];i++)
p->target[1][i]=0;
for(i=p->SitsNumber[0]+p->SitsNumber[1];iSitsNumber[0]+p->SitsNumber[1]+p->SitsNumber[2];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