📄 flight.cpp
字号:
/*航班信息的查询与检索*/
#include<iostream.h>
#include<string.h>
#include<stdio.h>
#define N 100 //航班数
//航班信息
typedef struct flight
{
char flight_number[10]; //航班号
char start_address[10]; //起飞站
char arrived_address[10]; //终点站
char work_date[10]; //班期
char start_time[6]; //起飞时间
char arrived_time[6]; //到达时间
char FlightType[4]; //机型
int fare; //票价
}DataType;
struct flight Flight[N];
//-----------按航班号进行基数排序-----------
typedef char KeyType;
#define D 7 // D为排序码的最大位数
#define R 'a' // R为基数,这里为小于字母'a'代表的整型值
struct Node; //单链表结点类型
typedef struct Node RadixNode;
struct Node
{
KeyType key[D]; //关键字
DataType info; //数据信息
RadixNode *next;
};
typedef RadixNode * RadixList;
typedef struct QueueNode
{
RadixNode *f; //对列的头指针
RadixNode *e; //对列的尾指针
}Queue;
Queue queue[R];
//初始化航班信息
struct Node element[N+1]={0};
int count;
void radixSort(RadixList * plist, int d, int r)
{
int i,j,k;
RadixNode *p, *head;
head=(*plist)->next;
for(j=d-1; j>=0; j--) //进行d次分配和收集
{
p=head;
for(i=0; i<r; i++)
{
queue[i].f=NULL; queue[i].e=NULL; //清队列
}
while(p!=NULL)
{
k=p->key[j]; //按排序码的第j个分量进行分配
if(queue[k].f==NULL)
queue[k].f=p; // 若第k个堆为空,则当前记录为队头
else (queue[k].e)->next=p; // 否则当前记录链接到第k队的队尾
queue[k].e=p;
p=p->next;
}
i=0;
while(queue[i].f==NULL) i++; // 从r个队列中找出第一个非空的队列
p=queue[i].e; head=queue[i].f; //head为收集链表的头指针
for(i++; i<r; i++)
if(queue[i].f!=NULL)
{
p->next=queue[i].f;
p=queue[i].e;
} // 收集非空队列
p->next=NULL;
}
(*plist)->next=head;
}
//------------信 息 显 示------------
//按表的格式输出某个航班信息
//显示头部信息
void Cout_info1()
{
cout<<" ****************************************\n"<<endl;
cout<<" * 航 班 信 息 表 *\n"<<endl;
cout<<" ****************************************\n"<<endl;
cout<<" 航班号 起飞时间 到达时间 起飞站 终点站 班期 机型 票价\n"<<endl;
}
void input()
{
char cho;
count = 0;
while(1)
{
count++;
if(count >= N)
{
return;
}
fflush(stdin);
cout<<"航班号 起点站 终点站 班期 起飞时间 到达时间 飞机型号 票价"<<endl;
cin>>element[count].info.flight_number>>element[count].info.start_address>>element[count].info.arrived_address>>element[count].info.work_date>>element[count].info.start_time>>element[count].info.arrived_time>>element[count].info.FlightType>>element[count].info.fare;
printf("继续输入吗?(y/n):");
fflush(stdin);
cho = getchar();
if(cho == 'n' || cho == 'N')
break;
}
}
//显示主体信息
void Cout_info2_1(Node p[])//方式一
{
cout<<" "<<p->info.flight_number;
cout<<" "<<p->info.start_time;
cout<<" "<<p->info.arrived_time;
cout<<" "<<p->info.start_address;
cout<<" "<<p->info.arrived_address;
cout<<" "<<p->info.work_date;
cout<<" "<<p->info.FlightType;
cout<<" "<<p->info.fare<<"元"<<endl;
}
void Cout_info2_2(flight F[],int i)//方式二
{
cout<<" "<<F[i].flight_number;
cout<<" "<<F[i].start_time;
cout<<" "<<F[i].arrived_time;
cout<<" "<<F[i].start_address;
cout<<" "<<F[i].arrived_address;
cout<<" "<<F[i].work_date;
cout<<" "<<F[i].FlightType;
cout<<" "<<F[i].fare<<"元"<<endl;
}
//显示所有航班信息
void output_ALL_info1(Node element[]) //方式一
{
RadixList p=element;
Cout_info1();
p=p->next;
while(p!=NULL)
{
Cout_info2_1(p);
p=p->next;
}
cout<<endl;
}
void output_ALL_info2(flight F[]) //方式二
{
Cout_info1();
for(int i=0;i<count;i++)
{
Cout_info2_2(F,i);
}
cout<<endl;
}
//--------------信 息 复 制----------------
//将排好的序列(链表)转化成顺序表存储形式
void copy(flight F[],Node element[])
{
RadixList p=element;
p=p->next;
int i;
for(i=0;i<count && p!=NULL;i++)
{
strcpy(F[i].flight_number,p->info.flight_number);
strcpy(F[i].start_time,p->info.start_time);
strcpy(F[i].arrived_time,p->info.arrived_time);
strcpy(F[i].start_address,p->info.start_address);
strcpy(F[i].arrived_address,p->info.arrived_address);
strcpy(F[i].work_date,p->info.work_date);
strcpy(F[i].FlightType,p->info.FlightType);
F[i].fare=p->info.fare;
p=p->next;
}
}
//---------------服 务 菜 单--------------
void F_By_Time(flight F[],int);
void F_By_Address(flight F[],int);
void F_By_FN(flight F[]);
//主菜单
void mainmenu()
{
cout<<" 主菜单\n"<<endl;
cout<<" ===========================================================\n"<<endl;
cout<<" Please choose: (input the number)(输入查询/排序命令)\n"<<endl;
cout<<" 1. Find by flight number(按航班号查询)\n"<<endl;
cout<<" 2. Find by start time(按起飞时间查询)\n"<<endl;
cout<<" 3. Find by arrived time(按到达时间查询)\n"<<endl;
cout<<" 4. Find by start address(按起飞地点查询)\n"<<endl;
cout<<" 5. Find by arrived address(按目的地点查询)\n"<<endl;
cout<<" 0. exit"<<endl;
cout<<" ===========================================================\n"<<endl;
}
//--------------查 询 系 统--------------
//通过航班号实现二分查找法查找
void F_By_FN(flight F[])
{
int low=0,high=count - 1,mid;
char Num[10];
cout<<"请输入您要查询的航班号:";
cin>>Num;
Cout_info1();
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(Num,F[mid].flight_number)==0)
{
Cout_info2_2(F,mid);break;
}
else if(strcmp(Num,F[mid].flight_number)>0)
high=mid-1;
else
low=mid+1;
}
}
//通过起飞/到达时间查询
void F_By_Time(flight F[],int Time)
{
int i;
char T[6];
cout<<"请输入您要查询的航班的起飞/抵达时间(eg: 16:45 show as 1645):";
cin>>T;
Cout_info1();
for(i=0;i<count;i++)
{
if(Time==1) //按起飞时间查询
{
if(strcmp(T,F[i].start_time))
Cout_info2_2(F,i);
}
if(Time==2) //按抵达时间查询
{
if(strcmp(T,F[i].arrived_time))
Cout_info2_2(F,i);
}
}
}
//通过站点查询
void F_By_Address(flight F[],int AD)
{
char str[10];
cout<<"请输入您要查询的航班的起飞/抵达地址:";
cin>>str;
Cout_info1();
for(int i=0;i<count;i++)
{
if(AD==1) //按起点站查询
{
if(strcmp(str,F[i].start_address)==0)
Cout_info2_2(F,i);
}
if(AD==2) //按目的站查询
{
if(strcmp(str,F[i].arrived_address)==0)
Cout_info2_2(F,i);
}
}
}
//--------------主 函 数----------------
void main()
{
char ch,y;
cout<<"请输入航班信息:"<<endl;
input();
RadixList p=element;
for(int i=0;i<count;i++)
element[i].next=&element[i+1];
element[10].next=NULL;
radixSort(&p, D, R); //基数排序
output_ALL_info1(element); //输出排序后的有序序列(航班信息)
copy(Flight,element); //另存储排序后的航班信息
while(1)
{
mainmenu(); //给出主菜单
cout<<"请输入服务命令:";
fflush(stdin);
cin>>y;
switch(y)
{
case '1':F_By_FN(Flight);break;
case '2':F_By_Time(Flight,1);break;
case '3':F_By_Time(Flight,2);break;
case '4':F_By_Address(Flight,1);break;
case '5':F_By_Address(Flight,2);break;
case '0':cout<<"谢谢惠顾!"<<endl;return;
default :cout<<"选项错误!"<<endl;break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -