全是自己手搓的,没有加错误提示,有问题请大家指正。
#include<iostream>
#include<string>
using namespace std;
int flag;
//此链表存储已订票的客户名单
typedef struct already
{
char name[10];
struct already *next;
}already,*touzhizhen;
//此链表存储预约登记的客户名单
typedef struct wait
{
char name[10];
struct wait *next;
}wait,*touzhizhen1;
typedef struct {
char start[20]; //起始站点
char end[20]; //终点站点
int flight; //航班号
int date; //飞行日期
int limit; //乘员定额
int margin; //余额量
already * user1; //指向已经订票客户链表的头指针
wait * user2; //指向预约登记链表的头指针
}Airport;
//顺序表定义
typedef struct List{
Airport *Base;//存储顺序表基地址
int MAX;//存储顺序表最长字节
int length;//当前顺序表长度
int move;//顺序表可操作字节
}list;
//初始化顺序表,返回值为基地址
Airport * List_init(list & t)
{
Airport * Base;
Base= new Airport[t.MAX];//创建十个
t.length=0;//此时还是空表
for(int i=0;i<10;i++)
{
Base[i].flight=0;//用来表示是否被插入数据
}
return Base;
}
//初始化一个链表头结点
already* lianbiao_init(void)
{
already *L; // 链表头指针
L=(touzhizhen)malloc(sizeof(already));
L->next=NULL;
L->name[0]='\0';
return L;
}
//初始化一个链表头结点
wait* lianbiao_init1(void)
{
wait * L; // 链表头指针
L=(touzhizhen1)malloc(sizeof(wait));
L->next=NULL;
L->name[0]='\0';
return L;
}
void output(Airport * base)
{
cout<<"航班起始站点:"<<base->start<<endl;
cout<<"航班终点站点:"<<base->end<<endl;
cout<<"航班起飞日期:"<<base->date<<endl;
cout<<"航班号:"<<base->flight<<endl;
cout<<"当前余票:"<<base->margin<<endl;
}
already * insert(already * x1,char name1[15])
{
//此时我们要将name1插入链表(以首字母排序)
already * p=x1;//p指向首地址
already * p1=x1;
if(p->name[0]=='\0')//解决第一次插入的问题
{
strcpy(p->name,name1);//把name1赋值给name域
}
else//第一个元素已经被插入
{
already * s=(touzhizhen)malloc(sizeof(already));//此时s指向待插入的结点
strcpy(s->name,name1);//把name1赋值给name域
s->next=NULL;
//p1->next!=NULL和strcmp(p1->next->name,s->name)<0的先后顺序(空指针)
while(strcmp(p1->name,s->name)<0 && p1->next!=NULL && strcmp(p1->next->name,s->name)<0 )//p1指针向后移动的条件 s比p1和p1后的元素都要大
{
//此时p1要向后移动
p1=p1->next;
}
if(p1->next==NULL && strcmp(p1->name,s->name)<0)//字符串比任何一个都大
{
p1->next=s;
s->next=NULL;
}
else if(strcmp(p1->name,s->name)>0)//第一个都比s指向的结点大直接头插法
{
s->next=p1;
x1=s;
}
//
//上述已经解决完两个极端情况,接下来普通情况,此时p1指向待插入的前一个
/
else if(strcmp(p1->name,s->name)<0 && p1->next!=NULL && strcmp(p1->next->name,s->name)>0)
{
s->next=p1->next;
p1->next=s;
}
}
return x1;
}
already * search(already * x1,char name1[15])
{
already * p=x1;
already * p1=x1;
if(strcmp(x1->name,name1)==0)//当所要寻找的是第一个
{
p=p->next;
cout<<"我们已找到你的名字且删除"<<endl;
flag=1;
return p;
}
while(p!=NULL)
{
if(strcmp(p->name,name1)==0)
{
//找到元素
p1->next=p1->next->next;
cout<<"我们已找到你的名字且删除"<<endl;
flag=1;
return x1;
}
p1=p;//p用来存储p1的上一个
p=p->next;
}
if(p==NULL)
{
cout<<"我们未能找到你的名字,请您再次确认"<<endl;
flag=0;
}
}
wait * search1(wait * x1,char name1[15])
{
wait * p=x1;
wait * p1=x1;
if(strcmp(x1->name,name1)==0)//当所要寻找的是第一个
{
p=p->next;
cout<<"我们已找到你的名字且删除"<<endl;
flag=1;
return p;
}
while(p!=NULL)
{
if(strcmp(p->name,name1)==0)
{
//找到元素
p1->next=p1->next->next;
cout<<"我们已找到你的名字且删除"<<endl;
flag=1;
return x1;
}
p1=p;
p=p->next;
}
if(p==NULL)
{
cout<<"我们未能找到你的名字,请您再次确认"<<endl;
flag=0;
}
}
wait * insert1(wait * x1,char name3[15])
{
//必须使用尾插法
wait * p=x1;
wait * p1=x1;//定义一个尾指针
wait * s;
while(p1->next!=NULL)
p1=p1->next;
if(p->name[0]=='\0')
{
strcpy(p->name,name3);
}
else
{
s=(touzhizhen1)malloc(sizeof(wait));
strcpy(s->name,name3);
p1->next=s;
s->next=NULL;
}
return x1;
}
//打印链表
void printv(already * x1)
{
while(x1!=NULL)
{
cout<<x1->name<<endl;
x1=x1->next;
}
}
void printv1(wait * x1)
{
while(x1!=NULL)
{
cout<<x1->name<<endl;
x1=x1->next;
}
}
int main()
{
char inpu[10];
char com[10]="YES";
char com1[10]="NO";
char name4[15];
char name5[15];
int date2;
int date4;
int flight4;
int flight5;
int date5;
int num1;
int num4;
char name1[15];
char name[15];
char name3[15];
char name7[15];
int num;
int flight1;
int flight2;
int date1;
char arr[10];
char a[10]="end";
char b[10]="continue";
char pos[10];
char pos1[10];
int mode;
int mode1;
int mode2;
int mode3;
wait * wait1;
char end1[15];
Airport * base1;
//声明一个线性表
list t;
t.MAX=10;
t.move=10;
//t.Base指向线性表
t.Base=List_init(t);
Airport * base=t.Base;
while(1)
{
cout<<"您是工作人员还是乘客(输入0为工作人员,输入1为乘客):";
cin>>mode;
if(mode==0)//工作人员
{
cout<<"请输入您要进行的操作(输入0增加航班信息,输入1查看航班乘客信息):";
cin>>mode1;
if(mode1==0)
{
while(strcmp(arr,a)!=0)
{
while(base->flight!=0)
{
base++;//指针后移
}
//此时base已经移动到待插入位置
cout<<"起始站点:";//不要加空格
cin>>base->start;
cout<<"终点站名:";
cin>>base->end;
//
getchar();
//
cout<<"航班号:";
cin>>base->flight;
cout<<"飞机日期:";
cin>>base->date;
cout<<"乘员定额:";
cin>>base->limit;
base->margin=base->limit;//初始化余额和定额一样
//接下来创建两个链表
base->user1=lianbiao_init();
base->user2=lianbiao_init1();
cout<<"请输入下一步操作(continue or end)"<<endl;
scanf("%s", arr); //输入字符串,可以加&也可以不加&
while(strcmp(arr,a)!=0 && strcmp(arr,b)!=0)
{
cout<<"输入违法请重新输入"<<endl;
scanf("%s", arr);
}
}
arr[0]='\0';
}
if(mode1==1)
{
cout<<"请输入所要查询航班的日期"<<endl;
cin>>date2;
cout<<"请输入所要查询航班的航班号"<<endl;
cin>>flight2;
//以下开始检索
base=t.Base;//重新指向基地址
while(base->flight!=0)
{
if(date2==base->date&&flight2==base->flight)
break;
base++;//指针后移
}
if(base->flight==0)
{cout<<"未找到该航班"<<endl;}
else
{
//此时base指向工作人员所需要的航班信息
cout<<"下面已订票的乘客名单"<<endl;
printv(base->user1);
cout<<"下面是预约登记的乘客名单"<<endl;
printv1(base->user2);
}
}
if(mode1!=0 && mode1!=1)
cout<<"输入违法"<<endl;
}
if(mode==1)//乘客
{
cout<<"尊敬的客户,您好!请输入您要进行的操作(输入0为查询航线,输入1为订票,输入2为退票,输入3为退出预约序列)";
cin>>mode2;
if(mode2==0)
{
cout<<"请输入您的起始站点:";
scanf("%s", pos); //输入字符串,可以加&也可以不加&
cout<<"请输入您的抵达站点:";
scanf("%s", pos1); //输入字符串,可以加&也可以不加&
//以下开始检索
base=t.Base;//重新指向基地址
while(base->flight!=0)
{
if(strcmp(base->start,pos)==0 && strcmp(base->end,pos1)==0)//起始站点和用户输入一样
output(base);
base++;//指针后移
}
}
if(mode2==1)
{
cout<<"请您输入日期:";
cin>>date1;//用户出发日期
cout<<"请您输入航班号:";
cin>>flight1;
cout<<"请您输入订票数额:";
cin>>num;
//以下开始检索
base=t.Base;//重新指向基地址
while(base->flight!=0)
{
if(date1==base->date&&flight1==base->flight)
break;
base++;//指针后移
}
//此时base指向用户所需要的航班信息
//以下代码判断是否还有余额
int left;
left=base->margin-num;
if(left>=0)//此时还有余额
{
cout<<"请依次输入购票名:";
for(int k=0;k<num;k++)
{
scanf("%s", name1);
//将名字加入链表
base->user1=insert(base->user1,name1);
}
cout<<"您的座位号依次为:"<<endl;
for(int j=0;j<num;j++)
{
cout<<base->limit-base->margin+j;
}
cout<<endl;
base->margin-=num;
cout<<"当前余额"<<base->margin<<endl;
}
else//此时没有余额
{
cout<<"当前余票不能满足您的要求,请您选择下一步操作(输入0:继续购票进入预约队列,输入1:不订票,输入3:为您推荐其他航线)";
cin>>mode3;
base1=base;
if(mode3==0)//继续购票进入预约队列
{
cout<<"请输入您的名字以便当有空位时我们能及时通知您"<<endl;
scanf("%s", name3);
base->user2=insert1(base->user2,name3);
}
if(mode3==3)
{
cout<<"请输入您的目的地:"<<endl;
scanf("%s",end1);
while(base->flight!=0)
{
if(strcmp(base->end,end1)==0 && base!=base1)
{
output(base);
}
base++;//指针后移
}
}
}
}
if(mode2==2)
{
cout<<"请输入您的姓名:";
cin>>name4;
//接下来是退票操作
cout<<"请您输入日期:";
cin>>date4;//用户出发日期
cout<<"请您输入航班号:";
cin>>flight4;
cout<<"请您输入退票数额:";
cin>>num1;
//以下开始检索
base=t.Base;//重新指向基地址
while(base->flight!=0)
{
if(date4==base->date&&flight4==base->flight)
break;
base++;//指针后移
}
//此时base指向用户所需要的航班信息
//在user1链表找到name4
base->user1=search(base->user1,name4);
wait1=base->user2;
while(wait1!=NULL && wait1->name[0]!='\0' && flag==1)
{
base->margin+=num1;//更新余额
cout<<"请"<<wait1->name<<"注意"<<"当前余票还有"<<base->margin<<"你是否还要购票(输入YES或NO)"<<endl;
scanf("%s",inpu);
if(strcmp(com,inpu)==0)//yes
{
cout<<"请您输入订票数额:";
cin>>num4;
cout<<"请依次输入购票名:";
for(int k=0;k<num4;k++)
{
scanf("%s", name7);
//将名字加入链表
base->user1=insert(base->user1,name7);
}
base->user2=search1(base->user2,wait1->name);
break;
}
else if(strcmp(com1,inpu)==0)//no
{
wait1=wait1->next;
}
}
flag=0;
}
if(mode2==3)//退出预约序列
{
cout<<"请输入您的姓名:";
scanf("%s", name5);
//接下来是退票操作
cout<<"请您输入日期:";
cin>>date5;//用户出发日期
cout<<"请您输入航班号:";
cin>>flight5;
//以下开始检索
base=t.Base;//重新指向基地址
while(base->flight!=0)
{
if(date5==base->date&&flight5==base->flight)
break;
base++;//指针后移
}
base->user2=search1(base->user2,name5);
}
if( mode2!=0 && mode2!=1 && mode2!=2 && mode2!=3)
cout<<"输入违法请重新输入"<<endl;
}
}
}