📄 hkdpxt.cpp
字号:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
#define MAX 100
typedef struct Bookcustomer //创建已订票客户信息
{
char name[15];
int number; //已订票数量
int rank; //舱位等级
struct Bookcustomer *next1;
}Bookcustomer,*Link;
typedef struct Preorder //创建预订票客户信息
{
char name[15];
int amount; // 要订票数量
struct Preorder *next2; //下一个链队结点指针
}Preorder,*Qptr;
typedef struct
{
Qptr front;
Qptr rear;
}linkQueue;
typedef struct Flight{ //创建航线信息
char Flightnum[15]; //航班号
char Planenum[15]; //飞机号
int Flightdata; //飞机周日
int Customernum; //乘员定额
int Freeamount; //余票量
char Addname[15]; //终点站名
struct Flight *next;
struct Bookcustomer *Bookname;//订票的客户名单
struct Preorder *Prename; //等候替补的客户名单
}Flight,*Linklist;
struct Flight *L=NULL;
struct Bookcustomer *H; //为已订票客户链队来申请空间
linkQueue Q;
Linklist InitLinklist() //初始化航班信息链
{
L=(Linklist)malloc(sizeof(Flight));
if(!L) exit(0);
L->next=NULL; //建立一个带有头结点的单链表
return (L);
}
int InsertLinklist(Linklist &); //函数声明不需要&一定加个(变量)标识符
void Input() //录入功能
{
int j=1,m;
do{
if(!InsertLinklist((Linklist)L)) //向其中加入航班信息
//由于此处用到InsertLinklist()函数所以上面要声明一下
{
printf("内存已满\n"); exit(0);
}
printf("\t是否要输入下一个航线记录?\n");
printf("\t是请输入1\n");
printf("\t否请输入2\n\t");
scanf("%d",&m);
}while(m==1);
}
int InsertLinklist(Linklist &L)//向航线链表添加新的结点 引用的用法保证对其操作
{
Linklist p;
p=(Linklist)malloc(sizeof(Flight)); //为一个新的结点分配空间
if(!p) exit(0);
printf("\t请依次输入以下内容:\n\n");
printf("航班号\n");
getchar();
gets(p->Flightnum);
printf("飞机号\n");
gets(p->Planenum);
printf("终点站\n");
gets(p->Addname);
printf("飞行日期\n");
scanf("%d",&p->Flightdata);
printf("乘员定额\n");
scanf("%d",&p->Customernum);
printf("余票量\n");
scanf("%d",&p->Freeamount);
p->Bookname=(struct Bookcustomer*)malloc(sizeof(Bookcustomer));
p->Prename=Q.front=Q.rear=(Qptr)malloc(sizeof(Preorder));
p->next=L->next;
L->next=p; //L只做头结点不做信息存储
//这二句是链表中的头插法插入一个结点
return (1);
}
void Search_Flightnum(); //通过航班号查询
void Search_Addname(); //通过目的地查询
void Search(); //查询功能
void Booking(); //订票功能
void Refund(); //退票功能
void main()
{
H=(struct Bookcustomer*)malloc(sizeof(Bookcustomer));
Q.front=Q.rear=(Qptr)malloc(sizeof(Preorder));
InitLinklist();
int n;
do{ //打印主界面
printf("\t 欢迎使用航空客运订票系统\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t==>1. 录入功能 ==\n");
printf("\t==>2. 查询功能 ==\n");
printf("\t==>3. 订票功能 ==\n");
printf("\t==>4. 退票功能 ==\n");
printf("\t==>5. 退出 ==\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t请选择:");
scanf("%d",&n);
printf("\n");
switch(n)
{
case 1: Input();
break;
case 2: Search();
break;
case 3: Booking();
break;
case 4:Refund();
break;
default :exit(0);//退出
}
}while(n==1||n==2||n==3||n==4);
}
void Search() //查询功能
{
int n;
printf("\t 查询航线信息 \n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t==>1. 通过终点站查询 ==\n");
printf("\t==>2. 通过航班号查询 ==\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t请选择:");
scanf("%d",&n);
printf("\n");
switch(n)
{
case 1:Search_Addname();
break;
case 2:Search_Flightnum();
break;
default :break;
}
}
void Search_Addname() //通过终点站查询
{
char c[15];
int m;
Linklist p=L;
printf("\t请输入要查询的终点站:");
gets(c);
gets(c);
do{
p=p->next; //第一次取头结点后的第一个记录
if(p) //到最后信息了自然会跳出循环
{
m=strcmpi((*p).Addname,c);
if(m==0)
{
printf("\t航班信息:\n");
printf("\t航班号:%s\n",p->Flightnum);
printf("\t飞机号:%s\n",p->Planenum);
printf("\t飞机周日:周%d\n",p->Flightdata);
printf("\t余票量:%d\n",p->Freeamount);
}
}
else
{
printf("\t对不起,没有你要找的目的地!\n\n");
m=0;
}
}while(m!=0);
}
void Search_Flightnum() //通过航班号查询
{
char c[15];
int m;
Linklist p=L;
printf("\t请输入要查询的航班号:");
gets(c);
gets(c);
printf("\n");
do{
p=p->next;
if(p)
{
m=strcmpi((*p).Flightnum,c);
if(m==0)
{
printf("\t航班信息:\n");
printf("\t飞机号:%s\n",p->Planenum);
printf("\t飞机周日:周%d\n",p->Flightdata);
printf("\t余票量:%d\n\n",p->Freeamount);
}
}
else
{
printf("\t对不起,没有你要找的航班号!\n");
m=0;
}
}while(m!=0);
}
void Booking() //订票功能
{
Linklist p=L; //Linklist类型的L来指向链表头
Bookcustomer *h=H,*h1;
linkQueue q=Q;
char c[15];
int m=1,ticket,number=0,n,rank;
printf("请输入要定的航班的终点站名:");
gets(c);
gets(c);
printf("\n");
p=L->next;
if(p)
{
do{
if(!p)
{
printf("对不起,没有您要找的航班:\n\n");
goto loop1;
}
m=strcmpi(p->Addname,c);
if(m==0) //找到此航班输出其信息
{
printf("航班信息:\n");
printf("航班号:%s\n",p->Flightnum);
printf("飞机号:%s\n",p->Planenum);
printf("飞机周日:周%d\n",p->Flightdata);
printf("余票量:%d\n",p->Freeamount);
}
else
p=p->next;
}while(m!=0);
if(m==0) //找到进行订票
{
do
{
printf("\n请选择舱位等级:");
scanf("%d",&rank);
if(rank>3)
printf("\n选择错误,请重新输入:");
scanf("%d",&rank);
printf("\n请输入您要订的票数:");
scanf("%d",&ticket);
if(ticket<=p->Freeamount)
{
h=p->Bookname;
if(h)
{
h1=h;
h=h->next1;
h=(struct Bookcustomer*)malloc(sizeof(Bookcustomer));
printf("请输入您的姓名:");
gets(h->name);
gets(h->name);
h->number=ticket;
h->next1=h1->next1;
h1->next1=h;
p->Freeamount=p->Freeamount-ticket;
printf("订票成功:\n"); m=2;
}
}
else
{
printf("余票量:%d\n",p->Freeamount);
printf("对不起,余票 %d 张不足,不能完成订票\n\n",p->Freeamount);
printf(" 是否要重新订票?\n");
printf("需要请输入1 否则请按2 预订请输入3 : ");
scanf("%d",&m);
printf("\n");
if(m==3) goto loop3;
}
}while(m==1);
}
}
else
if(!p)
{
loop3: struct Preorder *q3;
printf("对不起,该航班的票已售完\n");
q.front=p->Prename;
if(q.front==q.rear) printf("没有人预订票,是否要预订?\n");
else
if(q.front!=q.rear) printf("已有人预订票,是否继续预订?\n");
printf("预订请输入1 否则输入2 : ");
scanf("%d",&n);
printf("\n");
if(n==1)
{
q3=(Qptr)malloc(sizeof(Preorder));
printf("请输入您的姓名");
gets(q3->name);
printf("请输入订票数");
scanf("%d",&q3->amount);
q3->next2=NULL;
q.rear->next2=q3;
q.rear=q3;
printf(" 你已经预订了 !\n");
}
}
loop1:;
}
void Refund() //退票功能
{
Linklist p=L;
Bookcustomer *h=H,*h1,*h2;
//linkQueue q=Q;
char c[15],name1[15];
int m=1,ticket,tick;
gets(c);
printf("请输入航班号:");
gets(c);
p=L;
if(p)
{
do
{ //使用do while来查找是否有此航班
if(!p)
{ //如果是到了表尾且没有匹配,goto至再输入航班号
printf("\n对不起,没有你要找的航班:\n");
goto loop1;
}
m=strcmpi(p->Flightnum,c);//如果匹配的话,m=0
if(m==0)
{
printf("\t航班信息:\n");
printf("航班号:%s\n",p->Flightnum);
printf("飞机号:%s\n",p->Planenum);
printf("飞机周日:周%d\n",p->Flightdata);
printf("余票量:%d\n",p->Freeamount);}
else
p=p->next;
}while(m!=0);
if(m==0)
{ //如果找到了,就来给他退票
do{
h=p->Bookname;
if(h)
{
printf("请输入您的姓名:");
gets(name1); //gets(name1); 可允许多次退票只要操作合法!
printf("请输入您已订的票数:");
scanf("%d",&ticket);
printf("请输入您要退票的票数:");
scanf("%d",&tick);
printf("\n");
h1=h;
h=h->next1;
if(strcmpi(h->name,name1)==0&&h->number==ticket&&tick<=ticket)
//如果名字和订的票数相等,则就给他取消订票
{
p->Freeamount+=tick;
h->number =h->number -tick;
if(tick==ticket)
{
h2=h;
h1->next1=h->next1;
free(h2);
}
printf("您已成功退票!\n\n");
}
else if(strcmpi(h->name,name1)!=0)
{ //如果没有找到,即系统中没有该人的信息,提示是否来重新查找
printf("对不起,该航班没有人订票或者是你没有订该航班的票\n");
printf("是否要重新查找并取消订票?\n");
printf("需要重新退票请输入1 否则请按2 ");
scanf("%d",&m);
printf("\n");
}
}
}while(m==1);
}
}
else
{printf("票已售空或是目前没有航班信息记录!\n");}
loop1: ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -