📄 03061078 李静静 航空定票系统.c
字号:
/*航空客运订票系统*/
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"malloc.h"
#define MAX 1
#define num1 2
int num2;/*替补客户人数*/
int sum;
/*清屏函数*/
void clearscreen()
{
getchar();
system("cls");
}
struct custom1
{
char name[11];
int booknum;/*订票量*/
struct custom1 *next11;
};
struct custom2
{
char name[11];
int neednum;/*所需票量*/
struct custom2 *next22;
};
struct airline
{
char destination[10];/*终点站名*/
char linenumber[11];/*航班号*/
char airnum[10];/*飞机号*/
char time[3];/*飞行周日(星期几)*/
int totalnum;/*成员定额*/
int extranum;/*余票量*/
struct custom1 *next1;/*已订票的客户名单(包括姓名、订票量)*/
struct custom2 *next2;/*等候替补的客户名单(包括姓名、所需票量)*/
}airline[MAX];
struct custom1 *tail;
struct custom2 *front,*rear;
/*所有数据存放在文件中*/
/*查询航线*/
/*根据旅客提出的终点站名输出下列信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票量*/
/*承办订票业务*/
/*根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若尚有余额,则为客户办理订票手续,输出座位号;若已满员或余票额少于订票额,则需要重新询问客户要求。若需要,可登记排队候补*/
/*承办退票业务*/
/*根据客户提供的情况(日期、航班),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其他排队候补的客户*/
/*录入信息*/
int input_message()
{
struct custom1 *p1;
int i=0,j=0,k=0;
do
{
clearscreen();
printf("录入航线信息(最多%d个)\n",MAX); /*各条航线之间呈线性关系*/
printf(" \n 第%d条航线",i+1);
printf("\n 终点站名:");
scanf("%s",airline[i].destination);
printf("\n 航班号:");
scanf("%s",airline[i].linenumber);
printf("\n 飞机号:");
scanf("%s",airline[i].airnum);
printf("\n 飞行周日(星期几):");
scanf("%s",airline[i].time);
printf("\n 成员定额:");
scanf("%d",&airline[i].totalnum);
printf("\n 余票量:");
scanf("%d",&airline[i].extranum);
airline[i].next1=NULL;
airline[i].next2=NULL;
/*订票客户用线性表存储,链表实现*/
for(j=1;j<=num1;j++)
{
if(j==1)
airline[i].next1=tail=p1=(struct custom1 *)malloc(sizeof(struct custom1));
else
p1=(struct custom1 *)malloc(sizeof(struct custom1));
printf("请输入订票客户姓名 订票量\n");
scanf("%s%d",p1->name,&p1->booknum);
p1->next11=NULL;
tail->next11=p1;
tail=p1;
}
/*等候替补客户之间用队列存储,链表实现*/
front=rear=NULL;/*替补队列初始化*/
/* for(j=1;j<=num2;j++)
{
if(j==1)
{
airline[i].next2=front=rear=p=(struct custom2 *)malloc(sizeof(struct custom2));
printf("请输入替补姓名 订票量\n");
scanf("%s%d",p->name,&p->neednum);
p->next22=NULL;
}
else
{
p=(struct custom2 *)malloc(sizeof(struct custom2));
printf("请输入替补姓名 订票量\n");
scanf("%s%d",p->name,&p->neednum);
p->next22=NULL;
rear->next22=p;
rear=p;
}
} */
printf("\n"); /********一条航线信息输完后换行*********/
i++;
k++;
}while(i<MAX);
printf("\n ---%d个航线信息输入完毕!--\n",i);
printf(" \n 按回车键返回主菜单!\n");
getchar(); /*接受回车*/
sum=k+sum;
return i;
}
/*航线信息浏览*/
output_message()
{
int i;
struct custom1 *p1;
struct custom2 *p2;
clearscreen();
printf("\n\n ----航线信息---- \n\n");
printf("终点站名-航班号-飞机号-星期几-成员定额-余票量\n");
for(i=0;i<MAX;i++)
{
p1=airline[i].next1;
p2=airline[i].next2;
printf("%-4s %-5s %6s %6s %10d %10d\n",airline[i].destination,airline[i].linenumber,airline[i].airnum,airline[i].time,airline[i].totalnum,airline[i].extranum);
printf("已订票的客户名单:\n");
while(p1!=NULL)
{
printf("%s,%d\n",p1->name,p1->booknum);
p1=p1->next11;
}
printf("\n");
printf("等候替补的客户名单:\n");
while(p2!=NULL)
{
printf("%s,%d\n",p2->name,p2->neednum);
p2=p2->next22;
}
printf("\n");
}
return 0;
}
/*根据终点站名查询航线*/
void find_message()
{
char findname[10];
int i,j;
printf("请输入要查询的终点站名:\n");
scanf("%s",findname);
for(i=0;i<sum;i++)
{
if(strcmp(airline[i].destination,findname)==0)
{
printf("\n --%s的信息--\n",airline[i].destination);
printf("终点站名-航班号-飞机号-星期几-余票量\n");
printf("%-4s %-5s %6s %6s %10d",airline[i].destination,airline[i].linenumber,airline[i].airnum,airline[i].time,airline[i].extranum);
}
else
j++;
}
if(j==sum) /*j用来控制查找范围*/
printf("\n\n 该航线不存在!");
}
/*承办订票业务*/
void book()
{
char name[10],des[10];
int ch;
int number;
int i,j;
struct custom1 *p1;
struct custom2 *p2;
printf("请输入此人姓名 终点站名和票额数:\n");
scanf("%s%s%d",name,des,&number);
for(i=0;i<MAX;i++)
{
if(strcmp(airline[i].destination,des)==0)
{
if(airline[i].extranum>=number)
{
printf("可以办理此业务!\n");
airline[i].extranum-=number;
printf("座位号为:\n");
for(j=1;j<=number;j++)
printf("%-3d",airline[i].totalnum-airline[i].extranum+j);/*输出座位号*/
p1=(struct custom1 *)malloc(sizeof(struct custom1));
strcpy(p1->name,name);/*赋值*/
p1->booknum=number;
p1->next11=NULL;
tail->next11=p1; /*入栈 将此人接在订票栈顶*/
tail=p1;
}
else
{
printf("询问客户需求(1/2)\n");
scanf("%d",&ch);
switch(ch)
{
case 1: printf("需排队候补!\n");
if(front==NULL) /*接在替补队列尾*/
{
airline[i].next2=front=rear=p2=(struct custom2 *)malloc(sizeof(struct custom2));
strcpy(p2->name,name);
p2->neednum=number;
p2->next22=NULL;
}
else
{
p2=(struct custom2 *)malloc(sizeof(struct custom2));
strcpy(p2->name,name);
p2->neednum=number;
p2->next22=NULL;
rear->next22=p2;
rear=p2;
}
break;
case 2:
printf("无法办理此业务!\n");
}
}
}
}
}
/*退票*/
reticket()
{
int i,z=0,k=0;
struct custom1 *p1,*p2,*r;
struct custom2 *q1,*q2;
char rname[10],dest[10];
printf("请输入要退票的人的姓名 终点站名!\n");
scanf("%s %s",rname,dest);
for(i=0;i<MAX;i++)
if(strcmp(airline[i].destination,dest)==0)/*找到退票人的终点站名*/
{
p1=airline[i].next1;
while(strcmp(p1->name,rname)!=0)/*找到此人姓名*/
{
p2=p1;
p1=p1->next11;
z++;
}
airline[i].extranum+=p1->booknum;/*余票量加*/
if(z==0)
{
airline[i].next1=p1->next11;
free(p1);
}
else
{
p2->next11=p1->next11;/*将此节点从订票线性表中删除*/
free(p1);
z=0;
}
q1=airline[i].next2;
while(airline[i].extranum<q1->neednum)
{
q2=q1;
q1=q1->next22;
k++;
}
airline[i].extranum-=q1->neednum;/*余票量减*/
if(k==0)
{
r=(struct custom1 *)malloc(sizeof(struct custom1));
strcpy(r->name,q1->name);
r->booknum=q1->neednum;
r->next11=NULL;
airline[i].next2=q1->next22;
free(q1);
}
else
{
r=(struct custom1 *)malloc(sizeof(struct custom1));
strcpy(r->name,q1->name);
r->booknum=q1->neednum;
r->next11=NULL;
q2->next22=q1->next22; /*从替补队列中删除*/
free(q2);
z=0;
}
tail->next11=r; /*接在订票线性表之后*/
tail=r;
}
}
int main()
{
int choice;
do
{
printf("\n\n\n *****************************航线信息*************************\n\n");
printf(" 1.信息录入;\n\n");
printf(" 2.信息浏览;\n\n");
printf(" 3.信息查询;\n\n");
printf(" 4.订票;\n\n");
printf(" 5.退票;\n\n");
printf(" 0.退出系统.\n\n");
printf(" 请选择(0--5):");
scanf("%d",&choice);
switch(choice)
{
case 1: input_message();break;
case 2: output_message();break;
case 3: find_message();break;
case 4: book();break;
case 5: reticket();break;
case 0:{
getchar();
return 0;
break;
}
}
}while(choice!=0);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -