📄 airbook.cpp
字号:
#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR 0
typedef int Status;
typedef struct ClientNode
{ //已订票客户结点
char name[20];
char ID[20]; //客户的身份证号
int booknum;
int grade;
ClientNode *next;
}ClientNode;
typedef struct
{ //已订票客户单链表(按ID有序)
ClientNode *client;
int length;
}ClientLink;
typedef struct WClientNode
{ //侍订票客户结点
char name[20];
char ID[20];
char phoneno[15];
int neednum;
WClientNode *next;
}WClientNode;
typedef struct
{ //侍订票客户链队列
WClientNode *front; //对头指针
WClientNode *rear; //队尾指针
}WClientQueue;
typedef struct flightnode
{ //航班结点
char *airline;
int number;
char *flight_no;
int weekday;
int total;
int remain;
flightnode *next;
ClientLink client;
WClientQueue nclient;
}flightnode;
typedef struct
{ //航班顺序线性表
flightnode *flight;
int length;
}SqFlight;
Status InitList_Sq(SqFlight &LF)
{
//构造一个空的线性表LF
LF.flight=(flightnode*)malloc(sizeof(flightnode)); //数组指针指向flight指向线性表的基地址
if(!LF.flight)
exit(ERROR);
LF.length=0;
LF.flight->next=NULL;
return(OK);
}
Status InitList_CL(ClientLink &CL)
{ //为客户链表建一个空链表
CL.client=(ClientNode*)malloc(sizeof(ClientNode));
if(!CL.client)
exit(ERROR);
CL.length=0;
CL.client->next=NULL;
return(OK);
}
Status InitList_WCQ(WClientQueue &WCQ)
{ //为待票客户建一个空的队列
WCQ.front=WCQ.rear=(WClientNode*)malloc(sizeof(WClientNode));
if(!WCQ.front)
exit(ERROR);
WCQ.front->next=NULL;
return(OK);
}
Status InitFlightNode(SqFlight &LF)
{ //对航线结点赋值并接到航班顺序表
flightnode *p,*q;
ClientLink CL1; //订票客户
InitList_CL(CL1);
WClientQueue WCQ1;
InitList_WCQ(WCQ1);
if(!LF.flight)
{
printf("无法找到指向航线结点的指针\n");
exit(ERROR);
}
LF.flight->airline="Xiamen--Tokyo"; //头结点赋值
LF.flight->client=CL1;
LF.flight->flight_no="FU127";
LF.flight->nclient=WCQ1;
LF.flight->number=8427;
LF.flight->remain=200;
LF.flight->total=200;
LF.flight->weekday=1;
p=(flightnode*)malloc(sizeof(flightnode));
if(!p)
{
printf("申请不到航线结点\n");
exit(ERROR);
}
LF.flight->next=p;
ClientLink CL2;
InitList_CL(CL2);
WClientQueue WCQ2;
InitList_WCQ(WCQ2);
p->airline="Xiamen--Tokyo"; //结点1赋值
p->client=CL2;
p->flight_no="BU127";
p->nclient=WCQ2;
p->number=8757;
p->remain=180;
p->total=180;
p->weekday=5;
q=p;
p=NULL;
p=(flightnode*)malloc(sizeof(flightnode));
if(!p)
{
printf("申请不到航线结点\n");
exit(ERROR);
}
q->next=p;
ClientLink CL3;
InitList_CL(CL3);
WClientQueue WCQ3;
InitList_WCQ(WCQ3);
p->airline="Fuzhou--Shenzhen"; //结点2赋值
p->client=CL3;
p->flight_no="FU786";
p->nclient=WCQ3;
p->number=3216;
p->remain=200;
p->total=200;
p->weekday=2;
q=p;
p=NULL;
p=(flightnode*)malloc(sizeof(flightnode));
if(!p)
{
printf("申请不到航线结点\n");
exit(ERROR);
}
q->next=p;
ClientLink CL4;
InitList_CL(CL4);
WClientQueue WCQ4;
InitList_WCQ(WCQ4);
p->airline="Fuzhou--Shenzhen"; //结点3赋值,有四个航班,共4个结点
p->client=CL4;
p->flight_no="FU236";
p->nclient=WCQ4;
p->number=5712;
p->remain=230;
p->total=230;
p->weekday=6;
p->next=NULL;
return(OK);
}
//-----------------------------------------------航线查询函数:lookup---------------------------------------
Status lookup(char *airline,SqFlight LF)
{ //查询系统
//形参指针airline指向查询时输入的航线的首地址
//引用航班顺序线性表LF
flightnode *p=LF.flight;
InitList_Sq(LF);
char *h,*q=airline;
int i=0;
while(p)
{
h=p->airline;
while(*airline==*h)
{ //查询航线是否与在LF的航班航线里有
if(*airline=='\0'||*h=='\0')
break;
airline++,h++;
}
if(*airline=='\0'&&*h=='\0')//若有该航线输出航线信息
{
i++;
printf("%s %s %d %d %d %d\n",p->airline,p->flight_no,p->number,p->remain,p->total,p->weekday);
}
airline=q;
p=p->next; //航班结点指针后移
}
if(i)
printf("有此航班%d条\n",i);
else
{ system("cls");
printf("输入有误,请核对后重新输入!\n");
}
return(OK);
}
//==============================按航班号查询飞机信息==============================
flightnode *search(int number,SqFlight LF)
{
//形参number查看时输入的航班号
//引用航班顺序线性表LF
flightnode *p=LF.flight;
while(p)
{
if(number==p->number)
break;//查看的航班号是否在LF的航班号里有
p=p->next;
}
return(p); //返回指向该航班结点的指针
}
//==============================按照ID查找客户============================
ClientNode *searchID(flightnode *p,char *ID)
{
//p是指向某个航班结点的指针
//ID是要查询的ID
ClientNode *h=p->client.client->next;
ClientNode *prior_h=NULL; //指向这个ID客户的前驱的指针
prior_h=p->client.client;
int i=0;
char *p_ID=ID;
char *h_ID=NULL;
while(h)
{
ID=p_ID;h_ID=h->ID;
while(*ID==*h_ID)
{ //查询的ID在已订客户链表中是否有
if(*ID=='\0'||*h_ID=='\0')break;
ID++,h_ID++;
}
if(*ID=='\0'&&*h_ID=='\0')
break;//若有结束循环
prior_h=prior_h->next;
h=h->next;
}
if(!h)
prior_h=NULL;
return(prior_h);//返回前驱指针
}
//===========================等待客户队列建立函数=================================
Status wbook(SqFlight LF,flightnode *p)
{ //待票客户队列
//引用航班顺序线性表LF
//p是指向某个航班结点的指针
WClientNode *h=NULL;
loop:
h=(WClientNode *)malloc(sizeof(WClientNode));
if(!h)
goto loop;
printf("请输入客户的名字:\n");
scanf("%s",h->name);
printf("请输入客户的ID:\n");
scanf("%s",h->ID);
printf("请输入客户的电话号码:\n");
scanf("%s",h->phoneno);
printf("请输入客户需要的票数:\n");
scanf("%d",&h->neednum);
h->next=NULL;
p->nclient.rear->next=h;
p->nclient.rear=h;
return(OK);
}
//=====================================替换航班查询====================================
Status find_oth(char *airline,SqFlight LF,int plannumber)//寻找相同航线其他飞机
{ //用地址搜索出
Status book(int number,SqFlight LF);
flightnode *p=LF.flight;
char *h,*q=airline;
int i=0;
int number;
while(p)
{
h=p->airline;
while(*airline==*h)
{ //查询航线是否与在LF的航班航线里有
if(*airline=='\0'||*h=='\0')
break;
airline++,h++;
}
if((*airline=='\0'&&*h=='\0')&&p->number!=plannumber&&p->remain!=0)//若有该航线输出航线信息
{
i++;
printf("\n第%d同航线不同飞机的飞机号为:%d\n",i,p->number);
}
airline=q;
p=p->next; //航班结点指针后移
}
if(i)
{
printf("请输入要预定的航班号:\n");
scanf("%d",&number);
book(number,LF);
return OK;
}
else
{
printf("对不起,没有相同航线的飞机有剩余机票!谢谢惠顾!");
return ERROR;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -