数据结构报告.docx
《数据结构报告.docx》由会员分享,可在线阅读,更多相关《数据结构报告.docx(48页珍藏版)》请在冰豆网上搜索。
数据结构报告
一、航空客运订票系统基本要求
1、每条航线所涉及的信息有:
终点站名、航班号、飞机号、飞机周日(星期几)、乘员定额、余票量、订定票的客户名单(包括姓名、订票量、舱位等级1,2或3)以及等候替补的客户名单(包括姓名、所需数量)。
2、系统能实现的操作和功能如下:
1)查询航线:
根据客户提出的终点站名输出如下信息:
航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;
2)承办订票业务:
根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,输出座位号;若已满员或余票少余订票额,则需重新询问客户要求。
若需要,可登记排队候补;
3)承办退票业务:
根据客户提出的情况(日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其它排队候补的客户。
实现提示:
两个客户名单可分别由线性表和队列实现。
为查找方便,已订票客户的线性表应按客户姓名有序,并且,为了插入和删除方便,应以链表作为存储结构。
由于预约人数无法预计,队列也应以链表作为存储结构。
二、问题描述
设计一个航班信息查询与订票系统程序,要求设计航班信息,订票信息的存储结构,并实现以下功能:
录入:
可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)
查询:
可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;
订票:
(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;
退票:
可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
修改航班信息:
当航班信息改变可以修改航班数据文件
三、需求分析
1.本程序以动态链表为存储结构,有两个链表,第一个链表:
每个航班信息开辟一个节点空间,在节点中存放航班信息,如航班号,起飞时间,出发地,目的地,总座位数,折扣,票价等。
第二个链表:
每个乘客开辟一个节点,存放乘客的记录:
姓名,证件号码,预定的航班号,定单号码及订票的数量。
2.本程序有五大模块组成,分别为基本信息输入模块(包括航班信息输入和客户信息输入),信息查询模块,订票模块,修改模块(包括退票模块及修改航班信息模块)。
信息输入模块的功能是录入各航班的基本信息;信息查询模块的功能为提供各种信息查询的操作;订票模块是录入各订票人的基本信息;信息修改模块是退票和修改航班信息。
3.程序执行的命令:
1.录入信息2.查询3.订票4.退票5.修改6.显示航班信息7.显示客户信息8.退出
4.测试数据:
航班数据库中的数据。
以xiaying.txt文件保存。
(附在源程序中)
四、概要设计
1、系统的抽象数据类型
设定民航航班信息查询与客票发售服务系统的抽象数据类型定义:
ADThanban{
数据对象:
D={ai|ai∈CharSet,i=1,2,,…,n,n>=0}
数据关系:
R={c1c2}
基本操作:
creat();
操作结果:
录入航班信息。
search();
操作结果:
进入航班查询系统。
order();
操作结果:
进行订票。
quit();
操作结果:
进行退票。
revise();
操作结果:
修改航班信息。
print();
操作结果:
显示航班信息。
print2();
操作结果:
显示客户资料。
Clear();
操作结果:
清除记录。
}ADThanban
2、程序中用到的库函数
#include
#include
#include
#include
#include
#include
#include
3、程序的四大模块
(1)主程序模块:
Voidmain()
{
do{
接受命令;
处理命令;
}while(命令!
=退出);
}
(2)信息输入模块——完成基本信息的输入和修改;
(3)实现功能模块——实现信息查询、订票和退票功能操作;
(4)信息显示模块——实现录入信息的显示。
4、函数间调用关系
图1整体思想方框图
5、算法设计:
(每个模块的算法设计说明如下:
)
(1)录入模块:
查找单链表的链尾,在链尾插入一个“航班信息”的新结点。
(2)查询模块:
提供两种查方式:
按航号和按航线查询,1代表按航号查询,2代表按航线查询。
0则表示退出查询。
顺着单链表查找,如果与航班号(航线)一致,输出相关信息,否则,查询不成功。
(3)订票模块:
查找乘客要订的航班号,判断此航班是否有空位,有则输入乘客有关信息,订票成功,否则失败。
(4)退票模块:
输入要退票的乘客姓名以及证件号码,查找乘客资料的链表中是否有这位乘客,有则删去此结点,并在空位加上1,无则退票失败。
(5)修改模块:
输入密码,确认是否有权限对航班信息进行修改,有则在航班信息链表中查找要修改的结点,进行修改,否则不能修改。
6、存储结构设计:
(1)航班的信息:
为了便于查找和修改,航班的情况存储结构采用单链表,每个元素表示一个航班的情况,包括航班号、起飞达到的时间、余票和出发地、目的地、票价以及总票数八个数据项:
航班号
起飞时间
达到时间
出发地
目的地
总票数
余票
票价
单链表如下:
每个结点包括数据域和指针域:
数据域
指针域
C语言描述如下:
typedefstructPlane{/*航班信息*/
charplaneNo[10];/*航班号*/
charstart[30];/*起飞时间*/
charend_time[30];/*到达时间*/
charstartplace[30];/*起飞城市*/
charend_place[30];/*到达城市*/
intprice;/*机票价格*/
intdiscount;/*折后价格*/
inttotal;/*机票总数*/
inttamount;/*剩余票数*/
structPlane*next;
}Plane;
(2)旅客的资料:
为了便于插入、删除和修改,其采用单链表存储结构,每个数据元素包括姓名、证件号码、航班号和座位号四个数据项:
旅客姓名
证件号码
航班号
C语言描述如下:
typedefstructpassengernode{/*定义乘客资料结点*/
charname[20];
charID_num[20];
charair_num[20];
structpassengernode*next;
}passengernode;
五、详细设计
1、主程序中需要的全程量
structPlane{/*航班信息*/
charplaneNo[10];/*航班号*/
charstart[30];/*起飞时间*/
charend_time[30];/*降落时间?
*/
charstartplace[30];/*起飞城市*/
charend_place[30];/*降落城市*/
intprice;/*机票价格*/
intdiscount;/*折后价格*/
inttotal;/*总机票数*/
inttamount/*剩余机票数*/
structPlane*next;
}Plane;
structcustomer/*客户资料*/
{charname[30];/*客户姓名*/
charID[30];/*证件号*/
inttamount;/*订票数量*/
charplane[30];/*航班号*/
charno[30];/*订单编号*/
structcustomer*next;
}customer;
Structplane*head=NULL;
structcustomer*glist=NULL;
2.部分函数模块以及流程图:
1)主函数模块
main()
{inti;
while
(1)
{system(“cls”);
printf("\n");
printf("\n\t\****************定**票**系**统**************");
printf("\n");
printf("\n\t\********1.录入信息*");
printf("\n");
printf("\n\t\*******2.查询**");
printf("\n");
printf("\n\t\******3.订票***");
printf("\n");
printf("\n\t\*****4.退票****");
printf("\n");
printf("\n\t\****5.修改*****");
printf("\n");
printf("\n\t\***6.显示航班信息******");
printf("\n");
printf("\n\t\**7.显示客户信息*******");
printf("\n");
printf("\n\t\*8.退出********");
printf("\n");
printf("\n\n********************************************");
printf("\n请选择操作命令:
");
while
(1)
{
scanf("%d",&i);
if(i>=1&&i<=8)break;
elseprintf("\nchoose1,2,3,4,5,6,7,8");
}
switch(i)
{
case1:
system(“cls”);creat();break;
case2:
system(“cls”);search();break;
case3:
system(“cls”);order();break;
case4:
system(“cls”);quit();break;
case5:
system(“cls”);revise();break;
case6:
system(“cls”);print();break;
case7:
system(“cls”);print2();break;
case8:
exit(0);
default:
break;
}
}
}
主函数流程图
图2主函数流程图
2).录入信息函数模块:
void*creat()
{Plane*info;
while
(1)
{info=(Plane*)malloc(sizeof(Plane));/*建立新结点*/
if(!
info)
{
printf("EMShasbeenfull!
!
\n");
returnNULL;
}
printf("\n输入航班号:
");
scanf("%s",info->planeNo);
printf("输入起飞时间:
");
scanf("%s",info->start);
printf("输入到达时间:
");
scanf("%s",info->end_time);
printf("输入起飞地点:
");
scanf("%s",info->startplace);
printf("输入到达地点:
");
scanf("%s",info->end_place);
printf("输入机票价格:
");
scanf("%d",&info->price);
printf("输入折后价格:
");
scanf("%d",&info->discount);
printf("输入总机票数:
");
scanf("%d",&info->total);
printf("输入剩余票数:
");
scanf("%d",&info->tamount);
info->next=head;
head=info;
system("cls");
printf("是否继续?
y/n");
if(getch()=='n'||getch()=='N')break;
}
save1(head);
}
输入信息函数流程图
图3输入信息函数流程图
3).查询航班信息函数模块
voidsearch()
{chars1[30],s2[30];
Plane*p;
inti=0,ch;
while
(1)
{p=head;
printf("请选择\n");
printf("1.按航班号查询\n");
printf("2.按起落城市查询\n");
printf("3.退出\n");
scanf("%d",&ch);
if(ch==1)
{printf("\n请输入航班号\n");
scanf("%s",s1);/*读如航班号*/
while(p)
{
if(!
strcmp(s1,p->planeNo))
{
printf("\n起飞地点:
%s",p->startplace);
printf("\n起飞时间:
%s",p->start);
printf("\n到达地点:
%s",p->end_place);
printf("\n到达时间:
%s",p->end_time);
printf("\n机票价格:
%d",p->price);
printf("\n折后价格:
%d",p->discount);
printf("\n总机票数:
%d",p->total);
printf("\n剩余票数:
%d\n\n",p->tamount);
if(p->tamount==0)printf("\n此航班已满!
\n");/*提示此航班已满*/
p=p->next;
i++;
}
elsep=p->next;
}
if(!
i)printf("无此航班\n");i=0;
}
if(ch==2)
{
printf("输入起飞地点:
");
scanf("%s",s1)/
printf("\n输入到达地点:
");
scanf("%s",s2);
while(p)
{
if(!
strcmp(s1,p->startplace)&&!
strcmp(s2,p->end_place))
{
printf("起飞地点:
%s",p->startplace);
printf("\n起飞时间:
%s",p->start);
printf("\n到达地点:
%s",p->end_place);
printf("\n到达时间:
%s",p->end_time);
printf("\n机票价格:
%d",p->price);
printf("\n折后价格:
%d",p->discount);
printf("\n总机票数:
%d",p->total);
printf("\n剩余票数:
%d\n\n",p->tamount);
if(p->tamount==0)printf("\n此航班已满!
\n");
p=p->next;
i++;
}
elsep=p->next;
}
if(!
i)printf("无此航班\n");i=0;
}
if(ch==3)break;
}
}
查询函数流程图
图4查询函数流程图
4).订票功能函数模块:
voidorder()
{
customer*info;
Plane*p,*q;
chars[30];intflag=0;
while
(1)
{
p=q=head;
printf("您想预定哪趟航班");
scanf("%s",&s);
if(strcmp(p->planeNo,s)!
=0)/*判断*/
{
printf("无此航班");/*出错提示*/
p=p->next;
getch();
break;
}
if(p->tamount==0)
{
printf("此航班已满.\n是否需要预定其他到达该城市的航班:
y/n\n");
if(getch()=='n'||getch()=='N')break;
else
while(q)
{
if(!
strcmp(p->end_place,q->end_place)&&p!
=q)
{printf("您可以预定%s号航班到达该城市\n",q->planeNo);flag=1;}
q=q->next;
}
if(flag==0){printf("没有到打该城市的其他航班");getch();break;}
}
else
{
printf("目前此航班还有%d张票",p->tamount);
info=(customer*)malloc(sizeof(customer));
if(!
info)
{
printf("EMShasbeenfull!
!
\n");
exit(0);
}
printf("\n姓名:
");
scanf("%s",info->name);
printf("\n身份证号码:
");
scanf("%s",info->ID);
printf("\n航班号:
");
scanf("%s",info->planeNo);
printf("\n订票数量(<=%d):
",p->tamount);
scanf("%d",&info->tamount);
p->tamount=p->tamount-info->tamount;
info->no=num;
printf("\n您的订单号是%d\n",info->no);
num++;
info->next=glist;
glist=info;
printf("是否继续?
y/n");
if('n'==getch()||'N'==getch())break;
system(“cls”);
}
save1(head);
save2(glist);
}
}
订票函数流程图
图5订票函数流程图
5).退票功能函数模块
voidquit()
{
chars1[30],s2[30],s3[30];
intm=0;
Plane*p;
customer*q,*r;
while
(1)
{p=head;
r=q=glist;
printf("输入姓名:
\n");
scanf("%s",s2);
if(strcmp(s2,q->name)!
=0)/*判断*/
{
printf("您没有预定机票");getch();break;/*出错提示*/
}
else
{
printf("您想退订哪趟航班:
\n");
scanf("%s",s1);
if(strcmp(s1,q->planeNo)!
=0)/*判断*/
{
printf("您没有预定此航班\n");getch();break;/*出错提示*/
}
}
else
{
printf("输入身份证号:
\n");
scanf("%s",s3);
if(strcmp(s3,q->ID)!
=0)/*判断*/
{
printf("\n您输入的身份证号码有误\n");getch();break;/*出错提示*/
}
else
{
printf("想退几张机票:
\n");
scanf("%d",&m);
while(strcmp(p->planeNo,s1))p=p->next;
p->tamount=p->tamount+m;
while(strcmp(q->name,s2))q=q->next;
printf("\n姓名:
%s",q->name);/*输出原始定单*/
printf("\n身份证号码:
%s",q->ID);
printf("\n航班号:
%s",q->planeNo);
printf("\n订票数量:
%d",q->tamount);
printf("\n\n真的要退订吗?
(Y/N)\n");
if(getch()=='y')
{
q->tamount=q->tamount-m;
printf("\n姓名:
%s",q->name);/*打印新的定单*/
printf("\n身份证号码:
%s",q->ID);
printf("\n航班号:
%s",q->planeNo);
printf("\n订票数量:
%d",q->tamount);
if(!
q->tamount)
{q=q->next;
while(r!
=q)
{r->no--;
r=r->next;
}
}
printf("\n\n退票成功!
\n\n");
}
printf("是否继续?
y/n");
if('n'==getch()||'N'==getch())break;
}
save1(head);
save2(glist);
}
}
}
}
退票函数流程图
图6退票函数流程图
6)显示信息函数模块:
print()
{
structPlane*p;
p=head->next;
system(“cls”);
if(!
p)
{
puts("\nNOanydata...");
printf("\n请按任意键返回");
getch();
return;
}
printf("\n航班号起飞时间抵达时间出发城市目的地价格折扣总票数剩余票数\n");
for(;p!
=NULL;p=p->next){printf("%s%s%s%s%s%d%s%d%d\n",p->planeNo,p->start,p->end_time,p->startplace,p->end_place,p->price,p->discount,p->total,p->start);
}
printf("\n请按任意键返回");
getch();