

新航线信息没存进去,虽然航线加一了但是内容是乱码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 7 //定义初始航线量的最大值(可改)
#define size 10
int t;
typedef struct ord_ros//已订票客户名单
{
char name[size];//客户姓名
int order_amount;//订票量
int IdNumber;//身份ID
struct ord_ros *next;
}linklist ,*Ordlist;
linklist *NEW,*p1,*head;
typedef struct Wait//候补队列乘客信息
{
char Wait_name[size];//姓名
int Wait_amount;//预定的票量
int Wait_IdNumber; //身份ID
struct Wait *next;
} WaitQNode, *PWait;
typedef struct Queue //候补队列
{
PWait front;//等候替补客户名单域的头指针
PWait rear;//等候替补客户名单域的尾指针
} LinkQueue;
typedef struct Waitp//用于候补客户出队时返回信息
{
char Waitp_name[size];//姓名
int Waitp_amount;//订票量
int Waitp_IdNumber; //身份ID
} Waitp;
typedef struct airline //结构体指针
{
char terminal_name[size];//终点站名
char air_Numer[size];//航班号
char plane_Numer[size];//飞机号
char day[100];//飞行日期
int ticket_price; //机票价格
int Sum_Ticket_Numer;//总位置
int ticket_sur;//余票量
airline *next;
linklist *order;//乘员名单域,指向乘员名单链表的头指针
LinkQueue waitQueue;//候补客户名单域,指向一个队列
}lineinfo,LINEINFO;
lineinfo *start;
int main();
void display(lineinfo *info)//打印每条航线的基本信息
{
printf("\n%6s\t\t%3s\t%s\t%s\t%5d\t\t%4d\t%4d",info->terminal_name,info->air_Numer,info->plane_Numer,info->day,info->ticket_price,info->Sum_Ticket_Numer,info->ticket_sur);
}
linklist *insertlink(linklist *head,int amount,char name[],int IdNumber)//增加订票乘员名单域的客户信息
{
linklist *p1,*NEW;
p1=head;
NEW=(linklist *)malloc(sizeof(linklist));
if(!NEW)
{
printf("\n错误!!\n");
return NULL;
}
strcpy(NEW->name,name);
NEW->order_amount=amount;
NEW->IdNumber=IdNumber;
NEW->next=NULL;
if(head==NULL) //若原无订票客户信息
{
head=NEW;
NEW->next=NULL;
}
else
head=NEW;
NEW->next=p1;
return head;
}
int InitQueue(LinkQueue &q) //初始化队列
{
WaitQNode *p;
p=(WaitQNode *)malloc(sizeof(WaitQNode));
if (p==NULL)
{
printf("内存不足\n");
return 0;
}
p->next=NULL;
q.front=q.rear=p;
return 1;
}
LinkQueue APPendQueue(LinkQueue &head,int amount,char name[],int IdNumber)//增加候补乘员名单域的客户信息
{
WaitQNode *NEW;
NEW=(WaitQNode *)malloc(sizeof(WaitQNode));
strcpy(NEW->Wait_name,name);
NEW->Wait_amount=amount;
NEW->Wait_IdNumber=IdNumber;
NEW->next=NULL;
if(head.front==NULL)
{
head.front=NEW;
head.rear=NEW;
head.front->next=NEW;
return head;
}
else
{
head.rear->next=NEW;
head.rear=NEW;
return head;
}
}
int QueueDelete(LinkQueue &q,Waitp &p)//出队函数
{
WaitQNode *t;
t=q.front->next;
if(q.front==NULL)//队列为空
{
return 0;
}
q.front->next=t->next;
if(q.front->next==NULL)//出队到队列为空
{
q.rear=q.front;
}
p.Waitp_amount=t->Wait_amount;
p.Waitp_IdNumber=t->Wait_IdNumber;
strcpy(p.Waitp_name,t->Wait_name);
free(t);
return 1;
}
struct airline *find()//根据系统提出的航班号查询并以指针形式返回
{
lineinfo *info;
char number[10];
int i=0;
info=start;
printf("请输入航班号:");
scanf("%s",number);
for(i=0; i<MAXSIZE; i++)
{
if(!strcmp(number,info->air_Numer))
return info;
info++;
}
printf("对不起,该航线末找到!\n");
return NULL;
}
void list(int t)//打印全部航线信息
{
lineinfo *info;
info=start;//指针对接赋值
int i;
printf("终点站名\t航班号\t飞机号\t\t飞行日期\t\t\t航班票价\t总位置\t余票量");
for(i=0; i<t+MAXSIZE; i++) //循环自增调用输出
display(info++);
printf("\n\n");
}
void prtlink()//打印订票乘员名单域的客户名单信息
{
linklist *p;//定义一个指向客户信息结构体的指针
struct airline *info;
info=find();//调用find函数得到关于用户所输入航线信息的指针
p=info->order;//将乘员名单域指向乘员名单链表的头指针和p对接
if(p!=NULL)//判断是否为空
{
printf("客户姓名 订票数额 身份ID\n");
while(p)//在p指空前循环输出
{
printf("%s\t\t%d\t%d\n",p->name,p->order_amount,p->IdNumber);
p=p->next;
}
}
else
printf("该航线没有客户信息!!\n");
}
void search()//根据客户提出的终点站名输出航线信息
{
struct airline *info,*find();
char name[10];
int i=0;
info=start;//指针对接
printf("请输入终点站名:");
scanf("%s",name);
while(i<MAXSIZE)
{
if(!strcmp(name,info->terminal_name)) //利用strcmp比较用户输入的站名和结构体数组中的站名是否一致
break;
info++;//若不相同则下一个,直至i>=MAXSIZE
i++;
}
if(i>=MAXSIZE)//若全部访问完无相应信息
printf("对不起,该航线未找到!\n");
else
{
printf("终点站名\t航班号\t飞机号\t\t飞行日期\t\t\t航班票价\t总位置\t余票量\n");
display(info);//调用输出
}
printf("\n");
}
void order()//办理订票业务
{
printf("当前航线信息如下:\n");
list(t);
struct airline *info;
int amount,IdNumber;
char name[10];
info=start;
if(!(info=find())) return;//根据客户提供的航班号进行查询如为空退出该模块
printf("请输入你所需要的订票数量:");
scanf("%d",&amount);
if(amount>info->Sum_Ticket_Numer)//若客户订票额超过乘员定票总额退出
{
printf("\n对不起您输入的票的数量已经超过乘员定额!");
return;
}
if(amount<=info->ticket_sur)//若客户订票额末超过余票量订票成功并等记信息
{
printf("请输入您的订票客户姓名:");
scanf("%s",name);
printf("请输入%s的电话号码:",name);
scanf("%d",&IdNumber);//利用整数最大值来进行加密操作代表ID
info->order=insertlink(info->order,amount,name,IdNumber);//在订票乘员名单域中添加客户信息
int i;
for(i=0; i<amount; i++) //依次输出该订票客户的座位号
printf("%s的座位号是:%d\n",name,info->Sum_Ticket_Numer-info->ticket_sur+i+1);
info->ticket_sur-=amount;//该航线的余票量应减掉该客户的订票量
printf("\n祝您乘坐愉快\n");
return;
}
if(amount!=0&&amount>info->ticket_sur)//余票量不足,询问是否改变计划或候补
{
printf("剩余票数不足,是否改变订票计划?(Y/N)\n");
char a;
getchar();
scanf("%c",&a);
if(a=='Y'||a=='y')//改变订票计划
{
order();
}
if(a=='N'||a=='n')//不改变订票计划
{
printf("已无多余票量,是否进行排队候补?(Y/N)\n");
char b;
getchar();
scanf("%c",&b);
if(b=='Y'||b=='y')//同意候补
{
printf("请输入姓名(候补):");
scanf("%s",name);
printf("请输入电话号码(候补):");
scanf("%d",&IdNumber);
info->waitQueue=APPendQueue(info->waitQueue,amount,name,IdNumber);
printf("\n候补成功!\n");
}
}
}
else
printf("\n欢迎您下次再次订购\n");
}
void return_tkt()//退票
{
struct airline *info;
linklist *p1,*p2,*head;
char cusname[10];
int num;
if(!(info=find())) //调用查询函数根据客户提供的航线进行搜索
return;
head=info->order;
p1=head;
printf("请输入退票客户的姓名:");
scanf("%s",cusname);
printf("请输入退票数量:");
scanf("%d",&num);
while(p1!=NULL)//根据客户提供的姓名到订票客户名单域进行查询
{
if(!strcmp(cusname,p1->name))
break;
p2=p1;
p1=p1->next;
}
if(p1==NULL)
{
printf("对不起你没有订过票!\n"); //若未找到退出本模块
return;
}
else//若信息查询成功删除订票客户名单域中的信息
{
if(num>p1->order_amount)//退票数量大于订票数量
{
printf("退票数量错误!");
return_tkt();
}
if(num==p1->order_amount)
{
p2->next=p1->next;
info->ticket_sur+=p1->order_amount;
free(p1);
printf("退票成功!!\n");
}
if(num<p1->order_amount)
{
p1->order_amount=p1->order_amount-num;
info->ticket_sur=info->ticket_sur+num;
printf("退票成功!!\n");
}
}
LinkQueue q=info->waitQueue;
Waitp p={0,0,0};
if(q.front!=NULL)
{
int m=1;
while(m)
{
int k;
if(q.front->Wait_amount<=info->ticket_sur&&info->ticket_sur>=0)
{
k=p.Waitp_amount;
QueueDelete(info->waitQueue,p);
int i;
for(i=0;i<p.Waitp_amount&&info->ticket_sur>0;i++)
{
printf("%s候补订票成功,座位号是%d\n",p.Waitp_name,(info->ticket_sur)-i);
info->ticket_sur=info->ticket_sur-1;
k=k-1;
}
//info->ticket_sur-=p.Waitp_amount;//余票量减少
info->order=insertlink(info->order,p.Waitp_amount,p.Waitp_name,p.Waitp_IdNumber);//增加已订票客户信息
}
if(k<=0)
m=0;
}
}
}
int check(lineinfo *line,char air_Numer[])
{
lineinfo *p=line;
while(p!=NULL)
{
if(!strcmp(air_Numer,p->air_Numer))
return 0;
p=p->next;
}
return 1;
}
int enter()//增加航班
{
//struct airline *Airline;
LINEINFO *q;//新航班结点指针的形参
lineinfo *p=start;
int m=1,t=1,i;
while(m!=0)
{
q=(LINEINFO *)malloc(sizeof(LINEINFO));
if(q==NULL)
return 0;
printf("请输入航班号:");
scanf("%s",q->air_Numer);
int s;
s=check(start,q->air_Numer);
if(s==0)
{
printf("该航班号已存在!");
continue;
}
printf("请输入飞行日期:");
scanf("%s",q->day);
printf("请输入终点站名:");
scanf("%s",q->terminal_name);
printf("请输入飞机号:");
scanf("%s",q->plane_Numer);
printf("请输入机票价格:");
scanf("%d",&q->ticket_price);
printf("请输入总位置:");
scanf("%d",&q->Sum_Ticket_Numer);
printf("请输入余票量:");
scanf("%d",&q->ticket_sur);
InitQueue(q->waitQueue);//初始化该航线的候补队列信息
q->next=p->next;
p->next=q;
printf("是否继续录入航线信息(输入除0外任意数字继续):");
scanf("%d",&m);
if(m!=0)
t++;
}
printf("终点站名\t航班号\t飞机号\t\t飞行日期\t\t\t航班票价\t总位置\t余票量");
for(i=0;i<t+MAXSIZE;i++)
{
display(p);
p++;
}
return t;
}
int menu_select()//菜单界面
{
int c;
printf("\n");
printf("\t\t航空客运订票系统\n");
printf("=============================================\n");
printf("=========== 1.浏览航线信息: ============\n");
printf("=========== 2.浏览已订票客户信息:============\n");
printf("=========== 3.查询航线 ============\n");
printf("=========== 4.办理订票业务: ============\n");
printf("=========== 5.办理退票业务: ============\n");
printf("=========== 6.增加航班信息: ============\n");
printf("=========== 7.退出系统 ============\n");
printf("=============================================\n");
do
{
printf("请选择:");
scanf("%d",&c);
}
while(c<0||c>7);
return c;
}
int main(void)
{
struct airline air_info[MAXSIZE]= //结构体数组指针(可增删)
{
{"北京","K12312","B8571"," 星期一 ",509,100,100},
{"上海","D24322","S1002"," 星期二 ",529,100,100},
{"伦敦","K35234","L1003"," 星期三 ",642,100,100},
{"杭州","D42414","B9571"," 星期四 ",322,100,100},
{"武汉","K12314","B3451"," 星期五 ",562,100,100},
{"广州","K64124","C3451"," 星期六 ",645,100,100},
{"美国","H12412","M3451"," 星期日 ",685,100,100}
};
start=air_info;
int t;
while(1)
{
switch(menu_select())
{
case 1:
list(t);
break;
case 2:
prtlink();
break;
case 3:
search();
break;
case 4:
order();
break;
case 5:
return_tkt();
break;
case 6:
t=enter();
printf("t值为%d",t);
break;
case 7:
printf("\n下次再见\n");
return 0;
}
}
}