飞机订票系统.docx
《飞机订票系统.docx》由会员分享,可在线阅读,更多相关《飞机订票系统.docx(17页珍藏版)》请在冰点文库上搜索。
![飞机订票系统.docx](https://file1.bingdoc.com/fileroot1/2023-7/22/c7da8808-4518-4311-b04a-ec11408f924c/c7da8808-4518-4311-b04a-ec11408f924c1.gif)
飞机订票系统
#include
#include
#include
#include
#defineok1
typedefstructord_ros
{//单链表
charname[15];//已订票的客户姓名
intord_amt;//已订票数量
structord_ros*next1;
}ord_ros,*Link;
typedefstructwat_ros{//单链队
charname[15];//预订票的客户姓名
intwat_amt;//要订票数量
structwat_ros*next2;//下一个链队结点指针
}wat_ros,*Qptr;
typedefstruct{
Qptrfront;//单链队头结点
Qptrrear;//单链队尾结点
}linkQueue;
typedefstructairline{//创建一个航线的结构体
charair_num[15];//航班号
charsta_name[10];//起点站名
charter_name[10];//终点站名
chartff_time[10];//起飞时间
chardes_time[10];//下降时间
chardate[7];//航班日期(星期几)
intlevel;//仓位
intcheck;//票价
floatdisc;//折扣
inttkt_amt;//乘员定额
inttkt_sur;//余票
structairline*next;//指向下一个链结点的指针
structord_ros*order;//定义一个指向已订票客户的头结点指针
structwat_ros*bookqueue;//等候替补的客户名单域,分别指向排队等候名单队头队尾的指针
}airline,*Linklist;
structairline*L=NULL;//定义全局量
structord_ros*H;//为已订票客户链队来申请空间
linkQueueQ;//linkQueue类型的来申请空间
LinklistInitLinklist();//声明
intInsertLinklist(Linklisthead1);//声明
voidair_number();//通过航班号查询
voidter_place();//通过目的地查询
voidinput();//初始化录入功能
voidsearch();//查询功能
voidorder_tkt();//订票功能
voidreturn_tkt();//退票功能
voidmain()
{
intn;
H=(structord_ros*)malloc(sizeof(ord_ros));
Q.front=Q.rear=(Qptr)malloc(sizeof(wat_ros));
InitLinklist();
do{//打印主界面
printf("\t**********************************************************\n");
printf("\t*飞机订票系统*\n");
printf("\t*^^*\n");
printf("\t*;;;;*\n");
printf("\t*;;V;;1录入功能;;V;;*\n");
printf("\t*;;|;;;;|;;*\n");
printf("\t*;;;v;;;2查询功能;;;v;;;*\n");
printf("\t*;;;;*\n");
printf("\t*;;3订票功能;;*\n");
printf("\t*;;;;*\n");
printf("\t*;;||;;4退票功能;;||;;*\n");
printf("\t*;;;;;;;;;;;;*\n");
printf("\t*;;XX;;0退出系统;;XX;;*\n");
printf("\t*;;;;;;;;;;;;;;;;*\n");
printf("\t*;V;;V;*\n");
printf("\t*||||*\n");
printf("\t**********************************************************\n");
printf("\t请选择:
");
scanf("%d",&n);printf("\n");
switch(n)
{
case1:
input();//录入功能
break;
case2:
search();//查询功能
break;
case3:
order_tkt();//订票功能
break;
case4:
return_tkt();//退票功能
break;
case0:
//退出
printf("感谢你的使用,再见!
\n");
}
}while(n==1||n==2||n==3||n==4);
}
voidinput()//初始化的单链表*********************************************************录入功能
{
intj=1,m;
do{
if(!
InsertLinklist((Linklist)L))//向其中加入航班信息
{
printf("内存已满\n");exit(OVERFLOW);
}//向链表中加一结点
printf("\t是否要输入下一个航线记录?
\n");
printf("\t是请输入1\n");
printf("\t否请输入2\n\t");
scanf("%d",&m);//在这里依靠人来决定是否输入下一条航线记
}while(m==1);
}
LinklistInitLinklist()
{
L=(Linklist)malloc(sizeof(airline));
if(!
L)exit(OVERFLOW);
L->next=NULL;//建立一个带有头结点的单链表
return(L);
}
intInsertLinklist(LinklistL)//向航线链表添加新的结点
{
Linklistp;
p=(Linklist)malloc(sizeof(airline));//为一个新的结点分配空间
if(!
p)exit(OVERFLOW);
printf("\t请依次输入下面几项内容:
\n\n");//这里的输入采用一个个单独输入,避免了乱赋值的现象
printf("航班号\n");
scanf("%s",p->air_num);
printf("起点站\n");
scanf("%s",p->sta_name);
printf("终点站\n");
scanf("%s",p->ter_name);
printf("起飞时间\n");
scanf("%s",p->tff_time);
printf("下降时间\n");
scanf("%s",p->des_time);
printf("飞行日期\n");
scanf("%s",&p->date);
printf("舱位\n");
scanf("%d",&p->level);
printf("乘员定额\n");
scanf("%d",&p->tkt_amt);
printf("余票数\n");
scanf("%d",&p->tkt_sur);
printf("票价\n");
scanf("%d",&p->check);
printf("折扣\n");
scanf("%f",&p->disc);
p->order=(ord_ros*)malloc(sizeof(ord_ros));//为它申请空间
p->bookqueue=Q.front=Q.rear=(Qptr)malloc(sizeof(wat_ros));//为它申请空间
p->next=L->next;
L->next=p;//这二句是链表中的插入一个结点
return(ok);
}
voiddisplay(structairline*p)
{
printf("------------------------------------------------------------------------------\n");
printf("¦%-6s¦%-6s¦%-6s¦%-7s¦%-7s¦%-4s¦%-4d¦%-7f¦%-4d¦%-4d¦\n",p->air_num,p->sta_name,
p->ter_name,p->tff_time,p->des_time,p->date,p->check,p->disc,p->tkt_amt,p->tkt_sur);
printf("------------------------------------------------------------------------------\n");
}
voidsearch()//******************************************************************查询功能
{
intn;
printf("\n\t\t***************************************\n");
printf("\t\t*航班信息查询系统*\n");
printf("\t\t*/;*\n");
printf("\t\t*|ee|*\n");
printf("\t\t*1通过目的地|{}|查询*\n");
printf("\t\t*_______________;^^;________________*\n");
printf("\t\t*;中国||航空;*\n");
printf("\t\t*`========--------..---------========'*\n");
printf("\t\t*||||*\n");
printf("\t\t*||*\n");
printf("\t\t*查询||号班航过通2*\n");
printf("\t\t*||*\n");
printf("\t\t*,---||---,*\n");
printf("\t\t*0退出'---<>---'系统*\n");
printf("\t\t*****************************************\n");
printf("\t请选择:
\n");
scanf("%d",&n);
switch(n)
{
case1:
ter_place();
break;
case2:
air_number();
break;
case0:
exit(0);
printf("欢迎您下次再次使用!
\n");
}
}
voidter_place()//通过目的地查询
{
charc[15];
Linklistp=L;
intm;
printf("\t请输入要查询的目的地:
\n");
scanf("%s",c);
do{
p=p->next;
if(p)
{
if(strcmpi((*p).ter_name,c)==0)
{
printf("------------------------------------------------------------------------------\n");
printf("¦航班号¦起点站¦终点站¦起飞时间¦下降时间¦航班日期¦票价¦折扣¦限员¦余票¦\n");
display(p);//调用预览信息
return;
}
}
else{
printf("\t对不起没有您要找的目的地:
\n\n");
m=0;
}
}while(m!
=0);
}
voidair_number()//通过目的地查询
{
charc[15];
Linklistp=L;
intm;
printf("\t请输入要查询的航班号:
\n");
scanf("%s",c);
do{
p=p->next;
if(p)
{
if(strcmpi((*p).air_num,c)==0)
{
printf("------------------------------------------------------------------------------\n");
printf("¦航班号¦起点站¦终点站¦起飞时间¦下降时间¦航班日期¦票价¦折扣¦限员¦余票¦\n");
display(p);//调用预览信息
return;
}
}
else
{//如果不匹配的话就做
printf("\t对不起没有你要找的航班号:
\n");m=0;
}
}while(m!
=0);
}
voidorder_tkt()//***************************************************************订票功能
{
Linklistp=L;//Linklist类型的L来指向链表头
ord_ros*h=H,*h1;//ord_ros定义客户的结点,方便插入与删除
linkQueueq=Q;//linkQueue类型的来,方便插入与删除
structwat_ros*q3;
charc[15];
intm=1,amount,n;
intydpiao=0,yd=0;
printf("请输入终点站名:
\n");
scanf("%s",c);
p=L->next;
if(p){
do{//查找一下,是否有这个航班
if(!
p)
{
printf("对不起,没有你要找的航班:
\n\n");
}
m=strcmpi(p->ter_name,c);
//通过比较来判定
if(m==0)
{
printf("------------------------------------------------------------------------------\n");
printf("¦航班号¦起点站¦终点站¦起飞时间¦下降时间¦航班日期¦票价¦折扣¦限员¦余票¦\n");
display(p);//调用预览信息
}
else
p=p->next;
}while(m!
=0);
if(m==0)
{//当有该航班时,进行订票
do{
printf("\n请输入你要订的票数:
\n");
scanf("%d",&amount);
if(amount<=p->tkt_sur)
{
h=p->order;
if(h)
{inti;
floatj;
j=amount*(p->disc*p->check);
h1=h;
h=h->next1;
h=(structord_ros*)malloc(sizeof(ord_ros));
printf("请输入你的名字:
\n");
scanf("%s",h->name);
h->ord_amt=amount;
h->next1=h1->next1;
h1->next1=h;
p->tkt_sur-=amount;//该航线的余票量应减掉该客户的订票量
for(i=0;iprintf("%s的座位号是:
%d\n",h->name,p->tkt_amt-p->tkt_sur+i);
printf("订票成功!
您需要支付%.2f元\n",j);
printf("\n祝您乘坐愉快!
\n");
}
}
else//余票量不足时
{
printf("余票量:
%d\n",p->tkt_sur);
printf("对不起,余票%d张不足,不能完成订票\n",p->tkt_sur);
printf("是否要重新订票?
\n");
printf("需要请输入1否则请按2预订请输入3:
\n");
scanf("%d",&m);
while(m==3)
{
printf("对不起,该航班的票已售完\n");
return;
q.front=p->bookqueue;
if(q.front==q.rear)
printf("没有人预订票,是否要预订?
\n");
elseif(q.front!
=q.rear)
printf("已有人预订票,是否要预订?
\n");
printf("预订请输入1否则输入2:
\n");
scanf("%d",&n);
if(n==1)
{
q3=(Qptr)malloc(sizeof(wat_ros));
printf("请输入你的姓名\n");
scanf("%s",q3->name);
printf("请输入订票数\n");
scanf("%d",&q3->wat_amt);
q3->next2=NULL;
q.rear->next2=q3;
q.rear=q3;
printf("你已经预订了!
\n");
return;
}
}
}
}while(m==1);
}
}
}
voidreturn_tkt()//***************************************************************退票功能
{
Linklistp=L;
ord_ros*h=H,*h1,*h2;
linkQueueq=Q;
charc[15],name1[15];
intm=1,piao,n;//定义相应变量
printf("请输入航班号:
\n");
scanf("%s",c);
p=L->next;
if(p)
{
do{//使用dowhile来查找是否有此航班
if(!
p)
{//如果是到了表尾且没有匹配,
printf("\n对不起,没有你要找的航班:
\n");
return;
}
if(strcmpi(p->air_num,c)==0)//比较航班号输出信息
{
printf("------------------------------------------------------------------------------\n");
printf("¦航班号¦起点站¦终点站¦起飞时间¦下降时间¦航班日期¦票价¦折扣¦限员¦余票¦\n");
display(p);//调用预览信息
m=0;
}
elsep=p->next;
}while(m!
=0);
if(m==0)
{//如果找到了,就来给他退票
do{
h=p->order;
if(h)
{
printf("请输入你的姓名:
\n");
scanf("%s",name1);
printf("请输入你订的票数:
\n");
scanf("%d",&piao);
h1=h;
h=h->next1;
if(strcmpi(h->name,name1)==0&&h->ord_amt==piao)//如果名字和订的票数相等,则就给他取消订票
{
structwat_ros*q3;
p->tkt_sur+=h->ord_amt;
h2=h;
h1->next1=h->next1;
free(h2);
printf("你取消订票成功\n");
return;
q.front=p->bookqueue;
if(q.front==q.rear)
{
printf("没有人预订票:
\n");
}
if((p->tkt_sur)>=(q.front->next2->wat_amt))
{
h2=(ord_ros*)malloc(sizeof(ord_ros));
strcpy(h2->name,q.front->next2->name);
h2->ord_amt=q.front->next2->wat_amt;
n=p->tkt_sur-q.front->next2->wat_amt;
p->tkt_sur=n;
q3=q.front->next2;
q.front->next2=q3->next2;//这二语句来删除结点
if(q.rear==q3)
q.rear=q.front;
free(q3);//释放空间
printf("链队中删除成功\n");
h2->next1=h->next1;
h->next1=h2;//为之插入进已订票客户链表中
printf("为预订的客户订票成功\n");
}
elseprintf("余票数不够,不能为预订客户订票!
\n");
}
else
{//如果没有找到,即系统中没有该人的信息,提示是否来重新查找
printf("对不起,该航班没有人订票或者是你没有订该航班的票\n");
printf("是否要重新查找并取消订票?
\n");
printf("需要请输入1否则请按2\n");
scanf("%d",&m);
}
}
}while(m==1);
}
}