数据结构课程设计航班订票系统.docx
《数据结构课程设计航班订票系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计航班订票系统.docx(26页珍藏版)》请在冰豆网上搜索。
数据结构课程设计航班订票系统
东华大学
课程设计报告
目录
◆航空订票系统1
一、实验内容3
二、实验目的3
三、实验思路4
四、源程序4
运行结果12
◆哈希表查找的设计17
一、问题描述17
二、源程序17
运行结果19
航空订票系统
一、实验内容
Ø任务:
航空客运定票的业务活动包括:
查询航线、客票预定和办理退票等。
试设计一个航空客运定票系统,以使上述业务可以借助计算机来完成。
Ø功能要求:
1)录入:
可以录入航班情况
2)查询:
可以查询某个航线的情况(如输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;
3)订票:
(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;
4)退票:
可退票,退票后修改相关数据文件;
5)客户资料:
有姓名,证件号,订票数量及航班情况,订单要有编号;
6)修改航班信息:
当航班信息改变可以修改航班数据文件。
二、实验目的
上机实习是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。
实习题是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧以至一整套软件工作规范的训练和科学作风的培养。
希望通过本次课程设计,使学生能够独立地完成从问题分析到文档撰写一整套的软件设计过程,达到学以致用的目的。
三、实验思路
1)采用带头结点的线性链表储存航班信息
2)同样采用带头结点的线性链表储存订单信息
四、源程序
#include
#include
#include
a)定义结构体
/*定义Flight结构体链表,用于储存航班信息。
*/
typedefstructFlight{
charnumber[10];//航班号
charstaplace[10];//出发城市
charendplace[10];//到达城市
charstatime[10];//出发时间
charendtime[10];//到达时间
floatprice;//价格
floatdiscount;//折扣
intsum;//总票数
intrest;//余票数
structFlight*next;//指向下一个
}Flight,*Flightlist;
/*定义ticket结构体链表,用于储存订票信息以及客户资料*/
typedefstructticket{
intordernum;//订单号
charname[10];//客户姓名
charpassport[10];//客户证件号
intnum;//订票数量
Flightlistair;//航班信息
structticket*next;
}ticket,*ticketlist;
b)定义相关调用函数
/*录入航班信息(“FF”是带头结点的)*/
voidListInsert_F(Flightlist&FF)
{
inti;
Flightlistp=FF,s;
for(;p->next!
=NULL;p=p->next);//让“p”指向最后一个结点
printf("所需输入航班数:
");
scanf("%d",&i);
while(i<=0)//航班数必须为正整数,否则重新输入航班数
{
printf("所属航班数必须为正整数!
请重新输入:
");
scanf("%d",&i);
}
printf("请输入航班信息:
\n(航班号出发地点到达地点出发时间到达时间价格折扣总票数余票)\n");
while(i>0)//先将航班信息录入“s”中,然后插在“p”后面,循环至录完所有航班
{
s=(Flightlist)malloc(sizeof(Flight));
scanf("%s%s%s%s%s%f%f%d%d",s->number,s->staplace,s->endplace,s->statime,s->endtime,&s->price,&s->discount,&s->sum,&s->rest);
p->next=s;
p=p->next;
i--;
}
p->next=NULL;//以便以后顺利找到尾结点
printf("录入完成!
按回车键返回主菜单。
");
getchar();getchar();//让主菜单不至于太快出现
printf("\n\n\n");
}
/*查找航班信息*/
voidSearch_F(FlightlistFF)
{
intx=0;
chari,number[10],staplace[10],endplace[10];
Flightlistp=FF->next;//让“p”指向第一组航班
printf("按航班号查询请输入“1”;按始终点查询请输入“2”。
请选择:
");
scanf("\n%c",&i);
while(i!
='1'&&i!
='2'){//当选择不正确时,提示重新输入
printf("选择有误!
请重新选择:
");
scanf("\n%c",&i);
}
if(i=='1')//按航班号查询
{
printf("请输入需查询的航班号:
");
scanf("%s",number);
while
(1){
if(!
strcmp(p->number,number)){
printf("所查询航班信息:
\n航班号:
%s\n出发城市:
%s\n到达城市:
%s\n出发时间:
%s\n到达时间:
%s\n价格:
%f\n折扣率:
%f\n",p->number,p->staplace,p->endplace,p->statime,p->endtime,p->price,p->discount);
if(p->rest!
=0)printf("航班未满员,余票为:
%d\n",p->rest);
elseprintf("该航班已满员!
\n");
break;
}
elsep=p->next;
if(p==NULL){printf("没有该航班的信息!
");break;}//p==NULL时,即将所有航班都查询了但没有找到
}
}
elseif(i='2')//按出发、到达城市查询
{
printf("请输入出发城市:
");scanf("%s",staplace);
printf("请输入到达城市:
");scanf("%s",endplace);
while
(1){
if(!
strcmp(p->staplace,staplace)&&!
strcmp(p->endplace,endplace)){
printf("所查询到的航班信息:
\n(%d)\n航班号:
%s\n出发城市:
%s\n到达城市:
%s\n出发时间:
%s\n到达时间:
%s\n价格:
%f\n折扣率:
%f\n",x+1,p->number,p->staplace,p->endplace,p->statime,p->endtime,p->price,p->discount);
if(p->rest!
=0)printf("航班未满员,余票为:
%d\n",p->rest);
elseprintf("该航班已满员!
");
x++;//用“x”记录查询满足条件的航班数
}
p=p->next;
if(p==NULL)break;
}
if(x==0)printf("没有查到相关航班!
");
}
printf("按回车键返回主菜单。
");
getchar();getchar();
printf("\n\n\n");
}
/*订票并生成订单。
考虑到订票时需改变相应航班的余票数,同时在其他地方调用航班结构体时又不影响结构体变化,因此同时*/
voidBooking_F(FlightF,FlightlistL,ticketlist&T)
{
inti=0,j,r,x=1;
charnumber[10],staplace[10],endplace[10];
Flightlistf=&F,k=L->next;
Flightlisth,p,q,s=f->next;
ticketlistt,u;
printf("按航班订票请输入“1”;按始终点订票请输入“2”。
请选择:
");
scanf("%d",&r);
while(r!
=1&&r!
=2){
printf("选择有误!
请重新选择:
");
scanf("%d",&r);
}
if(r==1)
{
q=f->next;
printf("请输入航班号:
");
scanf("%s",number);
while(strcmp(q->number,number)!
=0)//根据航班号寻找航班
{
if(q->next==NULL)//航班未找到
{
printf("未搜到相关航班的信息。
");
x=0;//记录未找到航班
break;
}
q=q->next;
}
if(q->rest<=0&&x!
=0)//找到航班但没有余票,提供始终点相同的航班供选择
{
p=(Flightlist)malloc(sizeof(Flight));//“p”用来暂时储存供选择的航班信息
h=p;
printf("该航班已满员,请选择其它航班。
\n可供选择的航班\n");
while
(1)
{/*将所有始终相同的航班都提出来*/
if(!
strcmp(s->staplace,q->staplace)&&!
strcmp(s->endplace,q->endplace))
if(s->rest>0){
printf("(%d)\n航班号:
%s\n出发城市:
%s\n到达城市:
%s\n出发时间:
%s\n到达时间:
%s\n价格:
%f\n折扣率:
%f\n余票:
%d\n",i+1,s->number,s->staplace,s->endplace,s->statime,s->endtime,s->price,s->discount,s->rest);
h->next=s;h=h->next;i++;//用“i”记录供选择的航班数
}
s=s->next;
if(s==NULL)break;//查询完毕,跳出循环
}
if(i!
=0){//“i==0”表示未搜到可供选择的航班
printf("请选择:
");
scanf("%d",&j);
while(j>i||j<=0)
{
printf("输入有误,请重新选择:
");
scanf("%d",&j);
}
for(;j>0;j--)p=p->next;//让“p”指向客户需预订的航班
}else{printf("未搜到有余票的航班。
");x=0;}
}
elseif(x!
=0)
{
p=q;
printf("航班信息如下:
\n航班号:
%s\n出发城市:
%s\n到达城市:
%s\n出发时间:
%s\n到达时间:
%s\n价格:
%f\n折扣率:
%f\n余票:
%d\n",q->number,q->staplace,q->endplace,q->statime,q->endtime,q->price,q->discount,q->rest);
}
}
elseif(r==2)
{
p=(Flightlist)malloc(sizeof(Flight));h=p;//“p”用来暂时储存供选择的航班信息
printf("请输入出发城市:
");
scanf("%s",staplace);
printf("请输入到达城市:
");
scanf("%s",endplace);
printf("所查询到有余票的航班信息:
\n");
while
(1){
if(!
strcmp(s->staplace,staplace)&&!
strcmp(s->endplace,endplace))
if(s->rest!
=0)
{
printf("(%d)\n航班号:
%s\n出发城市:
%s\n到达城市:
%s\n出发时间:
%s\n到达时间:
%s\n价格:
%f\n折扣率:
%f\n余票:
%d\n",i+1,s->number,s->staplace,s->endplace,s->statime,s->endtime,s->price,s->discount,s->rest);
h->next=s;h=h->next;i++;
}
s=s->next;
if(s==NULL)break;//查询完毕,跳出循环
}
if(i!
=0){
printf("请选择:
");
scanf("%d",&i);
for(;i>0;i--)p=p->next;//让“p”指向客户需预订的航班
}else{printf("未搜到有余票的航班。
");x=0;}
}
if(x!
=0){
t=T;
if(t->next==NULL)t->ordernum=0;//当订单链表为空时,使头结点订单号为零,以便后面操作
for(;t->next!
=NULL;t=t->next);//让“t”指向尾结点
u=(ticketlist)malloc(sizeof(ticket));//分配动态储存空间,存储输入的订单信息
printf("请输入姓名:
");
scanf("%s",u->name);
printf("请输入证件号:
");
scanf("%s",u->passport);
printf("订票数量:
");
scanf("%d",&u->num);
if(u->num<=p->rest)//订票数不可以大于航班余票,否则订票失败
{
u->air=p;
u->ordernum=t->ordernum+1;//“新订单号”=“前一订单号”+1
t->next=u;//让新订单接着后面
u->next=NULL;//仍然使尾结点的next不指向任何
for(;k->number!
=p->number;k=k->next);
k->rest=(k->rest)-(u->num);//减少相应余票数量
printf("订票成功!
\n您的订单为:
\n");
printf("订单号\t姓名\t证件号\t\t订票数\t航班\n");
printf("%d\t%s\t%s\t%d\t%s\n",u->ordernum,u->name,u->passport,u->num,u->air->number);
}
elseprintf("订票失败,票数不足!
");
printf("\n按回车键返回主菜单");
getchar();getchar();
printf("\n\n\n");
}
}
/*退票,删除相应订单,并增加相应航班余票数*/
voidreturn_F(FlightlistL,ticketlistT)
{
intordernum,x=1,y=1,r;
Flightlistp=L->next;
ticketlistt=T->next,h=T;
printf("请输入订单号:
");
scanf("%d",&ordernum);
while(t->ordernum!
=ordernum){//查询订单位置
if(t->next==NULL)
{printf("没有查询到该订单!
");x=0;break;}
h=t;t=t->next;//让“h”指向所查订单的前一位置,“t”指向所查订单位置
}
if(x!
=0){
printf("订单信息:
\n订单号:
%d\n姓名:
%s\n证件号:
%s\n航班号:
%s\n出发城市:
%s\n到达城市:
%s\n",t->ordernum,t->name,t->passport,t->air->number,t->air->staplace,
t->air->endplace);
printf("是否确定退票?
(1)是
(2)否");
printf("\n请选择:
");
scanf("%d",&r);
while(r!
=1&&r!
=2){
printf("输入有误!
请重新输入:
");
scanf("%d",&r);
}
if(r==1){
for(;strcmp(p->number,t->air->number);p=p->next);
p->rest++;//增加相应航班余票数
h->next=t->next;//删除订单
free(t);
printf("退票成功!
");
}
elseif(r==2){printf("取消成功!
");}
}
printf("\n请按回车键返回主菜单");
getchar();getchar();
printf("\n\n\n");
}
voidcustomer(ticketT)
{
ticketlistt=&T,s=t->next;
printf("订单号\t姓名\t证件号\t\t订票数\t航班号\n");
while(s!
=NULL){
printf("%d\t%s\t%s\t%d\t%s\n",s->ordernum,s->name,s->passport,s->num,s->air->number);
s=s->next;
}
printf("\n请按回车键返回主菜单");
getchar();getchar();
printf("\n\n\n");
}
voidchange_F(FlightlistF)
{
intx=1;
charnumber[10];
Flightlistf;
printf("请输入需修改航班的航班号:
");
do{
scanf("%s",number);
f=F->next;
while(strcmp(f->number,number)!
=0){
if(f->next==NULL){
printf("未查询到该航班。
请重新输入:
");
x=0;break;
}
f=f->next;
}}while(x==0);
printf("请输入修改后的信息(出发地点到达地点出发时间到达时间价格折扣总票数余票):
\n");
scanf("%s%s%s%s%f%f%d%d",f->staplace,f->endplace,f->statime,f->endtime,&f->price,&f->discount,&f->sum,&f->rest);
printf("修改成功。
请按回车键返回主菜单");
getchar();getchar();
}
c)主函数
intmain()
{
intk,x,z=1;
FlightlistFF;FlightF;
ticketlistGG;ticketG;
FF=&F;GG=&G;
FF->next=NULL;GG->next=NULL;
while(z==1){
printf("***********************************************************\n********\t航班订票系统\t***************************\n*********************
**************************************\n");
printf("菜单:
\t1)录入\n\t2)查询\n\t3)订票\n\t4)退票\n\t5)查看客户资料\n\t6)修改航班信息\n\t7)退出\n");
printf("***********************************************************\n");
printf("请选择所需操作:
");
do{
x=1;
scanf("%d",&k);
switch(k)
{
case1:
ListInsert_F(FF);break;
case2:
Search_F(FF);break;
case3:
Booking_F(F,FF,GG);break;
case4:
return_F(FF,GG);break;
case5:
customer(G);break;
case6:
change_F(FF);break;
case7:
z=0;break;
default:
printf("输入错误!
请重新选择:
");x=0;
}
}while(x==0);
}
return0;
}
●运行结果
主菜单:
i.录入航班信息
ii.查询航班信息
按航班号查询
按始终点查询
iii.订票
按航班号订票
按始终点订票
还有一组客户就不展示了
iv.查看客户资料
v.退票
退票后客户资料为
vi.修改航班信息
修改后查询该航班信息为
vii.退出
哈希表查找的设计
一、问题描述
设哈希表长为20,用除留余数法构造一个哈希函数,以开放定址法中的线性探测再散列法作为解决冲突的方法,编程实现哈希表查找、插入和建立算法。
二、源程序
#include
#include
#defineSIZE20
#defineM13
#defineNULLKEY0
1.定义结构体储存哈希表
typedefstruct{
intelem[SIZE];
intcount;//哈希表中已有关键字个数
}Hashtable;
2.定义需调用函数
/*定义哈希表建立、插入函数*/
vo