题目:航班信息的查询与检索
设计一个实用的航班信息查询和检索系统,要求能对飞机航班信息进行排
序和查询。可按航班的航班号、起点站、到达站、起飞时间以及到达时间等信
息进行查询。
一、 模型分析
当今乘飞机旅行的人越来越多,人们需要关心了解各类航班的班次、时间、价格及机型
等信息。因此设计此航班信息查询系统。
本算法可对飞机航班信息进行录入、排序和查找,可按航班的航班号、起点站、终点站、
起飞时间和到达时间信息进行查询。
(1) 输入的形式:选择功能时,应输入与所选功能对应的一个整型数据;输入航班信
息包括航班号(由 2 位大写字母和 4 位数字组成)、起点站(1~6 位字符)、终点站(1~6 位
字符)、班期(1~7 位字符)、起飞时间(1~4 位字符)、到达时间(1~4 位字符)、机型(1~3
位字符)和票价(整型数字)。
(2)输出的形式:提示用户输入功能代号;提示用户输入要查询的航班信息;显示给
航班记录的相关信息,包括航班号、起点站、终点站、班期、起飞时间、到达时间、机型和
票价信息。
(3)算法所采用的数据结构:用链式基数排序算法对航班号进行排序,按链表对各条
记录进行有序化运算;用二分查找算法检索航班号信息,用顺序查找算法检索其他信息,显
示查询结果。
(4)测试数据:
A.航班信息输入。
CA1544 合肥 北京 1.2.4.5 1055 1240 733 960
B.航班信息查询。
选择按航班号查询:1
输入待查询的航班号:CA1544
输入效验成功时,若查找到,即会显示该航班记录的相关信息:
CA1544 合肥 北京 1.2.4.5 1055 1240 733 960
若未查找到,即会显示:
“很抱歉,无此航班信息。”
验证失败时,即会显示:
“错误信息:航班号须由 2 位大写字母和 4 位数字组成。”
然后结束此次操作。
二、 算法设计
(1)为了实现上述程序功能,采用链式基数排序算法对航班号进行排序,然后便能用
二分查找算法高效地检索航班号信息,其他信息的检索功能采用顺序查找算法实现。
(2)算法用到的抽象数据类型定义:
ADT SInfor{
数据对象:D={ei|ei∈StructSet, i=1,2,…,n,n>=0}
数据关系:R1={|ei-1,ei∈D,i=1,…,n}
基本操作:
CreateSInfor(&L)
操作结果:构造一个存储航班信息的链表。
DestroySInfor(&L)
初始条件:L 已存在。
操作结果:销毁 L。
AddSInfor(&L)
初始条件:L 已存在。
操作结果:添加航班信息。
SearchSInfor(L)
初始条件:L 已存在。
操作结果:查询航班信息。
DisplaySInfor(&L)
初始条件:L 已存在。
操作结果:显示航班信息。
}ADT Sinfor
(3)主程序的流程:
int main(void)
{
初始化;
显示用户界面;
信息录入,并作输入效验;
执行查询;
退出系统;
}
(4)各程序模块之间的调用关系:
main()调用 Prompt(),InputData(),searchcon()
InputData()调用 Check_HangBanHao(),RadixSort() , Arrange()
searchcon()调用 BinSearch(),SeqSearch(),Display(),Prompt()
RadixSort()调用 Distribute(),Collect(),Distribute_c(),Collect_c()
(5)函数调用关系图:
main()
InputData()
Check_HangBanHao()
Arrange()
RadixSort()
Prompt()
searchcon()
Distribute()
Distribute()
Distribute()
BinSearch()
SeqSearch()
Display()
三、源程序 :
#include
#include
#include
#include
#define MaxSpace 100
#define keylen 6
#define RADIX_n 10
#define RADIX_c 26
#define SHOW_MSG_ERROR "\n 错误信息:航班号须由 2 位大写字母和 4 位数字组成。
\n 输入数据错误,程序终止执行!\n"
using namespace std;
typedef char KeyType;
typedef struct {
//起点
//终点
//班期
char start[6];
char end[6];
char sche[6];
char time1[4]; //起飞时间
char time2[4]; //到达时间
char model[3];//机型
int price;
//票价
}InfoType;
typedef struct {
//航班记录类型
KeyType keys[keylen];
InfoType others;
int next;
}SLNode;
typedef struct {
SLNode sl[MaxSpace];
int keynum;
int length;
}SLList;
typedef int ArrType_n[RADIX_n];
typedef int ArrType_c[RADIX_c];
//关键字(航班号)
//静态链表结点类型
//静态链表
//关键字字符数
//表长
//静态链表类型
KeyType key[keylen],kl[4];
/*====================函数声明*/
void Distribute(SLNode *sl, int i, ArrType_n &f, ArrType_n &e);
void Collect(SLNode *sl, int i, ArrType_n f, ArrType_n e);
void Distribute_c(SLNode *sl, int i, ArrType_c &f, ArrType_c &e);
void Collect_c(SLNode *sl, int i, ArrType_c f, ArrType_c e);
void RadixSort(SLList &L);
void Arrange(SLList &L);
int BinSearch(SLList L, KeyType key[]);
void SeqSearch(SLList L, KeyType key[],int i);
void DisplayStyle(int i, char *s);
void Display(SLList L, int i);
void Quit(void);
void searchcon(SLList L);
void Prompt(void);
bool InputData(SLList &L);
bool Check_HangBanHao(char *HangBanHao);
/*----------------------------- 数字字符分配函数 */
void Distribute(SLNode *sl, int i, ArrType_n &f, ArrType_n &e)
{
int j,p;
for(j=0;j
f[j]=p;
else
sl[e[j]].next=p;
e[j]=p;
//|
//| 将 p 指向的结点插入到第 j 个子表中
//|
//--------------------------------//
}
}
/*----------------------------- 数字字符收集函数 */
void Collect(SLNode *sl, ArrType_n f, ArrType_n e)
{
int j,t;
for(j=0;!f[j];j++);
sl[0].next=f[j];
t=e[j];
while(j
void Collect_c(SLNode *sl, ArrType_c f, ArrType_c e)
{
int j,t;
for(j=0;!f[j]; j++);
sl[0].next=f[j];t=e[j];
while(j=2;i--)
{
//对低四位数字部分进行分配和收集
Distribute(L.sl,i,fn,en);
Collect(L.sl,fn,en);
}
for(i=1;i>=0;i--)
{
//对高位的 2 位字母进行分配和收集
Distribute_c(L.sl,i,fc,ec);
Collect_c(L.sl,fc,ec);
}
}/*RAdixSort*/
/*----------------------------- 按指针链整理线性表 */
void Arrange(SLList &L)
{
int p,q,i;
SLNode temp;
p=L.sl[0].next;
//p 指向第一个结点
for(i=1;i
}
}
if(m==0)
printf("很抱歉,无此航班信息。\n");
}
/*打印班次信息函数*/
void Display(SLList L, int i)
{
printf("航班号 起点站 终点站 航班期 起飞时间 到达时间 机型 票价
DisplayStyle(6, L.sl[i].keys);DisplayStyle(7, L.sl[i].others.start);
DisplayStyle(7, L.sl[i].others.end);DisplayStyle(7, L.sl[i].others.sche);
DisplayStyle(9, L.sl[i].others.time1);DisplayStyle(9, L.sl[i].others.time2);
DisplayStyle(5, L.sl[i].others.model);printf("%6d\n",L.sl[i].others.price);
printf("\n");
\n");
}
/*调整对齐格式函数*/
void DisplayStyle(int i, char *s)
{
int j;
i -= strlen(s);
for(j=0; j=1 && i<=6){
printf("\n 请选择命令代号(0----6):
");