⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 航班信息的查询与检索.cpp

📁 这是我第一次上传文件
💻 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 + -