📄 航班信息的查询与检索.cpp
字号:
#include<iostream.h>
#include<string.h>
#include<stdio.h>
#define N 8 //航班数
//航班信息
typedef struct flight
{
char flight_number[10]; //航班号
char start_address[10]; //起飞站
char arrived_address[10]; //终点站
char work_date[10]; //班期
int start_time; //起飞时间
int arrived_time; //到达时间
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];
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;
}
//初始化航班信息
struct Node element[N+1]={
" "," "," "," "," ",0,0," ",0,NULL,//表头
"CA1544","CA1544","合肥","北京","1245",1055,1240,"733",960,NULL,
"MU5341","MU5341","上海","广州","每日",1420,1615,"M90",1280,NULL,
"CZ3869","CZ3869","重庆","深圳","246",855,1035,"733",1010,NULL,
"MU3682","MU3682","桂林","南京","23467",2050,2215,"M90",1380,NULL,
"HU1836","HU1836","上海","北京","每日",940,1120,"738",1250,NULL,
"CZ3528","CZ3528","成都","厦门","13457",1510,1650,"CRJ",1060,NULL,
"MU4594"," MU4594","昆明","西安","1356",1015,1014,"328",1160,NULL,
"SC7425"," SC7425","青岛","海口","136",1920,2120,"DH4",1630,NULL,
};
//------------信 息 显 示------------
//按表的格式输出某个航班信息
//显示头部信息
void Cout_info1()
{
cout<<" ****************************************\n"<<endl;
cout<<" * 航 班 信 息 表 *\n"<<endl;
cout<<" ****************************************\n"<<endl;
cout<<" 航班号 起飞时间 到达时间 起飞站 终点站 班期 机型 票价\n"<<endl;
}
//显示主体信息
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<N;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<N && p!=NULL;i++)
{
strcpy(F[i].flight_number,p->info.flight_number);
F[i].start_time=p->info.start_time;
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_fare(flight F[]);
void F_By_FN(flight F[]);
//主菜单
void mainmenu()
{
char ch;
int y;
cout<<" 主菜单\n"<<endl;
cout<<" ===========================================================\n"<<endl;
cout<<" Please choose: (input the number)(输入查询/排序命令)\n"<<endl;
cout<<" 0. show the mainmenu (显示主菜单)\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<<" 6. Find by the fare(按票价范围查询)\n"<<endl;
cout<<" ----其他键退出"<<endl;
cout<<" ===========================================================\n"<<endl;
while(1)
{
cout<<"请输入服务命令:";
cin>>y;
switch(y)
{
case 0: mainmenu();break;
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 6:F_By_fare(Flight);break;
default :cout<<"谢谢惠顾!"<<endl;break;
}
cout<<"是否退出?(Y/N):";
cin>>ch;
if(ch=='Y'||ch=='y') break;
}
}
//--------------查 询 系 统--------------
//通过航班号实现二分查找法查找
void F_By_FN(flight F[])
{
int low=0,high=N,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 T,i;
cout<<"请输入您要查询的航班的起飞/抵达时间(eg: 16:45 show as 1645):";
cin>>T;
Cout_info1();
for(i=0;i<N;i++)
{
if(Time==1) //按起飞时间查询
{
if(T==F[i].start_time) Cout_info2_2(F,i);
}
if(Time==2) //按抵达时间查询
{
if(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<N;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 F_By_fare(flight F[])
{
int T1,T2,i;
cout<<"请输入您要查询的航班的最低票价(单位:元):";
cin>>T1;
cout<<"请输入您要查询的航班的最高票价(单位:元):";
cin>>T2;
Cout_info1();
for(i=0;i<N;i++)
{
if(T1<=F[i].fare && T2>=F[i].fare) Cout_info2_2(F,i);
}
}
//--------------主 函 数----------------
int main()
{
RadixList p=element;
for(int i=0;i<N;i++)
element[i].next=&element[i+1];
element[10].next=NULL;
radixSort(&p, D, R); //基数排序
output_ALL_info1(element); //输出排序后的有序序列(航班信息)
copy(Flight,element); //另存储排序后的航班信息
mainmenu(); //给出主菜单
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -