《数据结构与算法》
课程设计报告
题目:航空订票管理系统
学期: 20##春
班号:
学号:
姓名:
成绩:
哈尔滨华德学院电子与信息工程学院
20##年7月
一、课程设计的目的与要求(注:正文为宋体,五号字,为单倍行距)
(一)课程设计目的(不少于100字)
1.数据结构课程设计是综合运用数据结构课程中学到的几种典型数据结构,以及程序设计语言(C语言),自行实现一个较为完整的应用系统。 2.通过课程设计,自己通过系统分析、系统设计、编程调试,写实验报告等环节,进一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解典型数据结构在软件开发中的应用。
3. 学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力。具体的有:
(1)熟练掌握链表存储结构及其建立过程和常用操作;
(2)熟练掌握队列的建立过程和常用操作;
(3)学会自己调试程序的方法并掌握一定的技巧。
(二)题目要求(不少于100字)
1.每条航线所涉及的信息有:终点站名、航班号、飞机号、飞机周日(星期几)、乘员定额、余票量、订定票的客户名单(包括姓名、订票量、舱位等级1,2或3)以及等候替补的客户名单(包括姓名和所需数量)。 2.系统能实现的操作和功能如下:
(1)查询航线:根据客户提出的终点站名输出如下信息:航班号、飞机号、星期几飞行和余票额;
(2)承办订票业务:根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,输出座位号;若已满员或余票量少余订票额,则需重新询问客户要求。若需要,可登记排队候补;
(3)承办退票业务:根据客户提出的情况(日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其它排队候补的客户。
二、实训环境配置
Windows 7 32位系统
Interl Pentium Dual CPU 2.20Ghz,内存2.0GB
CodeBlocks10.x
三、设计正文
1.需求分析
本订票系统能够实现全部航线信息的浏览功能、订票客户信息的查询功能、单条航线查询功能、订票功能和退票功能 。
具体分析如下:
a) 全部航线信息的浏览功能 浏览全部系统预设的航线信息,每条航线包含的信息有:终点站名、航班号、飞机号、飞行周日(星期几飞行)、乘员定额和余票量。
b) 订票客户信息的查询功能 …..。
c) 单条航线查询功能 ……。
d) 订票功能 ……。
e) 退票功能 ……。
2.数据结构设计
经需求分析可知航班表、客户信息表、订单表均为典型的线性结构,在存储结构方面订单表变动较多,采用链式存储,其他采用顺序存储。
3个主要的类设计如下:
1) 航班表类
class AirLine{……};
2) 客户信息表类
3) 订单表类
3.算法设计
(1) 浏览航线模块:定义void display( struct airline *info),用info指向结构体struct airline中的每一个成员;调用list()函数输出全部航线信息。
(2) 浏览订票客户信息模块:定义订票客户信息的结构体ord_ros,根据输入航班号调用find()函数寻找客户信息。
(3) 查询航线模块:顺着单链表查找,如果与航班号(航线)一致,输出相关信息,否则,查询不成功。
bool Search_AirLine(int id){
……
}
(4) 订票模块:查找乘客要订的航班号,判断此航班是否有空位,有则输入乘客有关信息,订票成功, 否则失败。
(5) 退票模块:输入要退票的乘客姓名,查找乘客资料的链表中是否有这位乘客,有则删去此节点,并在空位上加1,无则退票失败。如果此时余票额大于等于候补客户的订票数量,那么候补客户订票成功。
void Cancel(){
… …
}
4.界面设计
运行主界面
图2 运行界面
5.系统测试
订票测试
图3 订票测试
退票测试
图4 退票测试
四、小组成员分工说明
独立完成
五、总结
1.算法改进设想:
(1)在算法效率上,由于此课程设计所用的是线性表的建立、查找、插入、删除、和队列的建立、插入、删除,所涉及的是查找和排序问题,所以在建立插入时按照客户姓名进行有序,查找时采用分块查找,因此对订票客户信息的存储应采用指针数组存储。
(2)在函数重组,把处理不同问题相同算法思想(如线性表的插入、删除、查找等等)写在一个函数中,其它函数要用到这种操作时只需调用这些函数,这样会减少整个程序的代码量,方便理解、阅读和使用。
2.课程设计期间的主要收获:
看着简单,做着难,我自己眼高收低,心太急,不过敢想敢写感尝试,努力付出还真有蛮多收获。
(1)学与做:做了这次课程设计,我觉得课程设计这种形式真的是我们需要的,可以让我们学到很多,包括书上的、书外的。理论永远不等于实际。 我在调试时出现了很多的问题,下面列举几个:程序中定义了一个字符串“new”,但在C-Free中“new"不是以未定义的形式存在,所以把“new”改写成“NEW”就可以了;C-Free中“getchar”表示读取下一个字符的含义,而“getch”不表示,出现“getch”时系统会报错;在编写退票模块的代码时,设计先输入退票数然后进行退票,调试时发现舱位等级的输出出现了混乱,后来经仔细分析才知道,原来“grade=p1->grade;”放在了if()大循环的后面,而在if循环里p1已经释放,所以把“grade=p1->grade;”放在第一个“free(p1);”之前就可以了。真正会了这些算法,理论和实际永远 差那么一点,不去做是体会不出来的。坐在电脑前才真正知道自己会不会,眼高手低是要不得的。
(2)C与算法描述:在学数据结构的时候总是分不清算法与C语言的区别,总觉得算法就是程序了,通过这两周的课程设计总算是把它们之间的关系搞透彻了。其实算法是解决问题的步骤;程序是算法的代码实现;算法要依靠程序来完成功能;程序需要算法作为灵魂。两者是相互联系密不可分的。
(3)小收获:摸索着做完课程设计,增强了自己的自学能力,这应该是最有用的吧,语言会过时,学习的能力却不会过时。构造结构体;定义清晰明确的各种变量;主函数、子函数的声明及定义。另外:对函数调用,参数传递很有体会。
(4)遇到的问题与感受:这次课程设计面临的大问题就是——选择的余地太大,头脑不好受。连续几天的思考,我都不能决定攻克哪个,好几个都是考虑了一部分又放弃了,以至前功尽弃。这使我认识到认定干一件事就必须将它干到底,以使自己的思想连续。我也开始考虑当事情有重叠时,如何去应对,虽然最后的抉择不一定是对的。我也在这段时间内好好地看了一遍书,对书中的算法思想有一个更深的了解,虽然在应用中显得不是很自如,可我通过这次课设体验到可视化编程的乐趣。这也给我以后编程莫大的激励,因为我认为所谓算法通过老师的传授每个人都会一点点,而课外的东西则是通过自己的学习获得的。写程序是一种乐趣,特别是当我看到程序运行成功时,我会感到无比的喜悦。而数据结构是任何程序的基础,没有数据结构的支持,就没有程序的存在,至少说不会存在有价值的程序。有了数据结构的知识,再加上程序设计技术,这对以后的深入学习应该会有很大的帮助
第二篇:数据结构课程设计报告—迷宫求解问题
课题设计1:迷宫求解
一. 需求分析:
本程序是利用非递归的方法求出一条走出迷宫的路径,并将路径输出。
首先由用户输入一组二维数组来组成迷宫,确认后程序自动运行,当迷宫有完整路径可以通过时,以0和1所组成的迷宫形式输出,标记所走过的路径结束程序;当迷宫无路径时,提示输入错误结束程序。
二、 概要设计:
1.抽象数据类型定义:
ADT Find{
数据对象:D={ai?ai ∈ElemSet,i=1,2,…,n,n≥0}
数据关系:R1={<ai-1,ai>?ai-1, ai∈D }
基本操作:
find (&S)
初始条件:已初始化栈S,且栈为空
操作结果:从栈S中找出相对应的数据关系,并输出结果
}ADT Find
2. 主程序的流程以及各程序模块之间的调用关系:
(1).定义变量i、j、w、z为整形变量
(2).输入迷宫二维数组maze(0:m,0:n)
(3).调用子程序find ()
(4).结束程序
三、相应的源程序如下:
#include<stdio.h>
#include<stdlib.h>
typedef enum { ERROR, OK } Status;
typedef struct
{
int row, line;
}PosType;
typedef struct
{
int di, ord;
PosType seat;
}SElemType;
typedef struct
{
SElemType * base;
SElemType * top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S);
Status Push(SqStack &S,SElemType &a);
Status Pop(SqStack &S,SElemType &a);
Status StackEmpty(SqStack S);
Status MazePath(int maze[12][12],SqStack &S, PosType start, PosType end);
void Initmaze(int maze[12][12],int size);
void printmaze(int maze[12][12],int size);
Status Pass(int maze[12][12],PosType CurPos);
void Markfoot(int maze[12][12], PosType CurPos);
PosType NextPos(PosType CurPos, int Dir);
void printpath(int maze[12][12],SqStack S,int size);
void main (void)
{
SqStack S;
int size,maze[12][12];
for(int n=0;n<10;n++)
{
printf("创建一个正方形迷宫,请输入迷宫尺寸(注意不要大于50):\n");
scanf("%d",&size);if(size<1 || size>10){printf("输入错误!");return;}
Initmaze(maze,size);
printmaze(maze,size);
PosType start,end;
printf("输入入口行坐标和列坐标:");scanf("%d",&start.row);scanf("%d",&start.line);
printf("输入出口行坐标和列坐标:");scanf("%d",&end.row);scanf("%d",&end.line);
if(MazePath(maze,S,start,end))
printpath(maze,S,size);
else printf("找不到通路!\n\n");
}
}
Status MazePath(int maze[12][12],SqStack &S, PosType start, PosType end)
{
PosType curpos;
int curstep;
SElemType e;
InitStack(S);
curpos = start;
curstep = 1;
do {
if (Pass(maze,curpos))
{
Markfoot(maze,curpos);
e.di =1;
e.ord = curstep;
e.seat= curpos;
Push(S,e);
if (curpos.row==end.row && curpos.line==end.line)
return OK;
curpos = NextPos(curpos, 1);
curstep++;
}
else
{
if (!StackEmpty(S))
{
Pop(S,e);
while (e.di==4 && !StackEmpty(S))
{
Markfoot(maze,e.seat);
Pop(S,e);
}
if (e.di<4)
{
e.di++;
Push(S, e);
curpos = NextPos(e.seat, e.di);
}
}
}
} while (!StackEmpty(S));
return ERROR;
}
void Initmaze(int maze[12][12],int size)
{
char select;
printf("选择创建方式 A:自动生成 B:手动创建\n");
label:scanf("%c",&select);
if(select=='a'||select=='A')
{
for(int i=0;i<size+2;i++)maze[0][i]=1;
for( i=1;i<size+1;i++)
{
maze[i][0]=1;
for(int j=1;j<size+1;j++)
maze[i][j]=rand()%2;
maze[i][size+1]=1;
}
for(i=0;i<size+2;i++)maze[size+1][i]=1;
}
else if(select=='b'||select=='B')
{
printf("按行输入%d*%d数据,0代表可通,1代表不可通(每行以Enter结束):\n",size,size);
for(int i=0;i<size+2;i++)maze[0][i]=1;
for( i=1;i<size+1;i++)
{
maze[i][0]=1;
for(int j=1;j<size+1;j++)
scanf("%d",&maze[i][j]);
maze[i][size+1]=1;
}
for(i=0;i<size+2;i++)maze[size+1][i]=1;
}
else if(select=='\n')goto label;
else printf("输入错误!");
}
void printmaze(int maze[12][12],int size)
{
printf("\n\n");
printf("显示所建的迷宫(#表示外面的墙):\n");
for(int i=0;i<size+2;i++)printf("%c ",'#');printf("\n");
for(i=1;i<size+1;i++)
{
printf("%c ",'#');
for(int j=1;j<size+1;j++)
{
printf("%d ",maze[i][j]);
}
printf("%c",'#');
printf("\n");
}
for(i=0;i<size+2;i++)printf("%c ",'#');printf("\n");
}
void printpath(int maze[12][12],SqStack S,int size)
{
printf("\n\n通路路径为:\n");
SElemType * p=S.base;
while(p!=S.top)
{
maze[p->seat.row][p->seat.line]=2;
p++;
}
for(int i=0;i<size+2;i++)printf("%c ",'#');printf("\n");
for(i=1;i<size+1;i++)
{
printf("%c ",'#');
for(int j=1;j<size+1;j++)
{
if(maze[i][j]==2) printf("%c ",'0');
else printf(" ");
}
printf("%c",'#');
printf("\n");
}
for(i=0;i<size+2;i++)printf("%c ",'#');printf("\n\n");
}
Status Pass(int maze[12][12],PosType CurPos)
{
if (maze[CurPos.row][CurPos.line]==0)
return OK;
else return ERROR;
}
void Markfoot(int maze[12][12],PosType CurPos)
{
maze[CurPos.row][CurPos.line]=1;
}
PosType NextPos(PosType CurPos, int Dir)
{
PosType ReturnPos;
switch (Dir)
{
case 1:
ReturnPos.row=CurPos.row;
ReturnPos.line=CurPos.line+1;
break;
case 2:
ReturnPos.row=CurPos.row+1;
ReturnPos.line=CurPos.line;
break;
case 3:
ReturnPos.row=CurPos.row;
ReturnPos.line=CurPos.line-1;
break;
case 4:
ReturnPos.row=CurPos.row-1;
ReturnPos.line=CurPos.line;
break;
}
return ReturnPos;
}
Status InitStack(SqStack &S)
{
S.base=(SElemType *)malloc(100*sizeof(SElemType));
if(!S.base)return ERROR;
S.top=S.base;
S.stacksize=100;
return OK;
}
Status Push(SqStack &S,SElemType &a)
{
*S.top++=a;
return OK;
}
Status Pop(SqStack &S,SElemType &a)
{
if(S.top==S.base)return ERROR;
a=*--S.top;
return OK;
}
Status StackEmpty(SqStack S)
{
if(S.top==S.base)return OK;
return ERROR;
}
以下为测试数据:
输入一个矩阵,例如:1 0 0 1 1
0 0 1 1 1
1 0 0 0 1
0 1 0 1 1
1 1 0 0 0
输入入口行坐标和列坐标:1 2
输入出口行坐标和列坐标:5 5
通路路径为:
课题设计3:joseph环
一. 需求分析:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。首先创建一个空链表,初始化链表,构造出一个只有头结点的空链表,建立好一个约瑟夫环。
1. 输入的形式和输入值的范围
本程序中,输入报数上限值m和人数上限l,密码,均限定为正整数,输入的形式为一个以“回车符”为结束标志的正整数。
2. 输出的形式
从屏幕显示出列顺序。
3. 程序功能
提供用户从键盘输入,Joseph约瑟夫环的必要数据,并显示出列顺序。
二、 概要设计
以单向循环链表实现该结构。
1. 抽象数据类型的定义为:
ADT LNode
{
数据对象:D={ai | ai∈CharSet,i= 1,2,…,n,n≥0}
数据关系:R1={< ai-1 ,ai > | ai ∈D, I=2,…,n}
三.源程序:#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int key;//每个人持有的密码
int num;//这个人的编号
struct Node *next;//指向下一个节点
}Node,*Link;
void InitList(Link &L) //创建一个空的链表
{
L=(Node *)malloc(sizeof(Node));
if(!L) exit(1);
L->key=0;
L->num=0;
L->next=L;
}
void Creater(int n,Link &L) //初始化链表
{
Link p,q;
q=L;
for(int i=1;i<=n;i++)
{
p=(Node *)malloc(sizeof(Node));
if(!p) exit(1);
printf("the key_%d is:",i);
scanf("%d",&p->key);
p->num=i;
L->next=p;
L=p;
}
L->next=q->next;
free(q);
}
void main()
{
Link L,p,q;
int n,x;
L=NULL;
InitList(L);//构造出一个只有头结点的空链表
printf("please input the totle number of people:");
scanf("%d",&n);//总共的人数n
printf("the start key is:");
scanf("%d",&x);//初始密码为x
Creater(n,L);//建立好一个约瑟夫环
p=L;
for(int i=1;i<=n;i++)
{
for(int j=1;j<x;j++)
p=p->next;
q=p->next;
x=q->key;
printf("%d ",q->num);
p->next=q->next;
free(q);
}
}
四、测试数据:
m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4
输出:6 7 4 1 5 3 2
课题设计4:商品货架管理
1、需求分析:设计一个算法,每一次上货后始终保持生产日期越近的商品越靠近栈底。求货架上剩余货物M、每天销售件数N、员工每天上货工作时间T,三者之间有何关系及T的最小值。
2、源程序:#include<iostream.h>
#include"string.h"
#include"stdio.h"
const int maxsize=100;
const int k=10;
#define elemtype char
typedef struct
{
int Month;
int Day;
int Year;
}DATE;
typedef struct
{
int num;
DATE date;
} Node;
class seqstack
{
public:
Node stack[maxsize];
int top;
void inistack()
{
top=0;
}
void push(int x,int day,int month,int year)
{
if(top==maxsize)
cout<<"货架已满"<<endl;
else
{
top++;
stack[top].num=x;
stack[top].date.Day=day;
stack[top].date.Month=month;
stack[top].date.Year=year;
}
}
void pop()
{
if(top==0)
cout<<"货架已空"<<endl;
else
top--;
}
elemtype gettop()
{
if(top==0)
cout<<"货架已空"<<endl;
else
return top;}
bool empty()
{
return top==0;
}
};
void main()
{
seqstack c[k+1]; //存放k种商品的数组,用c[0]来做中介货架
int Txq[k+1]; //第i种取货用的时间
int Txs[k+1]; //第i种上货用的时间
int Nx[k+1]; //第i种每天的销售数量
int N=0; //每天销售总量
int Tx[k+1]; //第i种每天上货的总时间
int T=0; //每天上货用的总时间
char yn='Y';
for(int i=1;i<=k;i++)
{
cout<<" ******************************"<<endl;
cout<<" 商品货架管理系统"<<endl;
cout<<" ******************************"<<endl;
Node store[20];
char year,month;
int count; //货架上第i种商品的数目
int x,d,m,y; //x为第i种商品的序号
cout<<"请输入货架上第"<<i<<"种货物的详细信息:"<<endl;
cout<<"(序号,生产日期(年、月、日如2006.2.13),现在货架上的存货数目,上货用时和取货用时)"<<endl;
cin>>x>>y>>year>>m>>month>>d>>count>>Txs[i]>>Txq[i];
Nx[i]=maxsize-count;
cout<<"货架上还需上"<<i<<"货物"<<Nx[i]<<"件"<<endl;
Tx[k]=Txs[i]*(maxsize+count)+2*Txq[i]*count;
cout<<"该货架满货需要用时"<<Tx[k]<<endl;
cout<<"是否要上货?(Y/N)"<<endl;
cin>>yn;
if(yn=='Y'||yn=='y')
{
int numbers,nian,yue,ri;
cout<<"请输入要上货物的数目及生产日期(年、月、日)"<<endl; //上的是同一日期生产的货物
cin>>numbers>>nian>>yue>>ri;
if(numbers>maxsize-count)
{
cout<<"要上的货物数目超出了货架的最大容量,请重新输入"<<endl;
cin>>numbers>>nian>>yue>>ri;
}
for(int j=1;j<=numbers;j++)
{
}
}
N+=Nx[i];
T+=Tx[i];
}
cout<<"每天销售总量为:"<<N<<endl;
cout<<"每天上货用的总时间为:"<<T<<endl;
}
3、测试结果:
五、课程设计5:航空客运订票系统
1、需求分析:
对于本设计,可采用基数排序法对于一组具有结构特点的飞机航班号进行排序,利用二分查找法对排好序的航班记录按航班号实现快递查找,按其他次关键字的查找可采用最简单的顺序查找方法进行,因为它们用的较少。
2、源程序:#include <stdio.h>
#include <string.h>
#define maxspace 100
#define keylen 7
#define radix_n 10
#define radix_c 26
typedef char keytype;
typedef struct
{
char start[6];
char end[6];
char sche[10];
char time1[5];
char time2[5];
char model[4];
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];
void distribute(slnode *sl,int i,arrtype_n f,arrtype_n e)
{
int j,p;
for(j=0;j<radix_n;j++)
{
f[j]=e[j]=0;
}
for(p=sl[0].next;p;p=sl[p].next)
{
j=sl[p].keys[i]%48;
if(!f[j])
f[j]=p;
else
sl[e[j]].next=p;
e[j]=p;
}
}
void collect(slnode *sl,int i,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<radix_n-1)
{
for(j=j+1;j<radix_n-1&&!f[j];j++);
if(f[j])
{
sl[t].next=f[j];
t=e[j];
}
}
sl[t].next=0;
}
void distribute_c(slnode *sl,int i,arrtype_c f,arrtype_c e)
{
int j,p;
for(j=0;j<radix_c;j++)
{
f[j]=e[j]=0;
}
for(p=sl[0].next;p;p=sl[p].next)
{
j=sl[p].keys[i]%65;
if(!f[j])
f[j]=p;
else
sl[e[j]].next=p;
e[j]=p;
}
}
void collect_c(slnode *sl,int i,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<radix_c-1)
{
for(j=j+1;j<radix_c-1&&!f[j];j++);
if(f[j])
{
sl[t].next=f[j];
t=e[j];
}
}
sl[t].next=0;
}
void radixsort(sllist &l)//链式
{
int i;
arrtype_n fn,en;
arrtype_c fc,ec;
for(i=0;i<l.length;i++)
l.sl[i].next=i+1;
l.sl[l.length].next=0;
for(i=l.keynum-1;i>=2;i--)
{
distribute(l.sl,i,fn,en);
collect(l.sl,i,fn,en);
}
for(i=1;i>=0;i--)
{
distribute_c(l.sl,i,fc,ec);
collect_c(l.sl,i,fc,ec);
}
}
void arrange(sllist &l)//重新整理
{
int p,q,i;
slnode temp;
p=l.sl[0].next;
for(i=1;i<l.length;i++)
{
while(p<i)
p=l.sl[p].next;
q=l.sl[p].next;
if(p!=i)
{
temp=l.sl[p];
l.sl[p]=l.sl[i];
l.sl[i]=temp;
l.sl[i].next=p;
}
p=q;
}
}
int binsearch(sllist l,keytype key[])
{
int low,high,mid;
low=1;
high=l.length;
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(key,l.sl[mid].keys)==0)
return mid;
else if(strcmp(key,l.sl[mid].keys)<0)
high=mid-1;
else
low=mid+1;
}
return 0;
}
void seqsearch(sllist l,keytype key[],int i)
{
int j,k,m=0;
printf("*************************************************************\n");
printf("* 航班号 起点站 终点站 航班期 起飞时间 到达时间 机型 票价 *\n");
for(j=1;j<=l.length;j++)
{
switch(i)
{
case 2:k=strcmp(key,l.sl[j].others.start);break;
case 3:k=strcmp(key,l.sl[j].others.end);break;
case 4:k=strcmp(key,l.sl[j].others.time1);break;
case 5:k=strcmp(key,l.sl[j].others.time2);break;
}
if(k==0)
{
m=1;
printf("* %-8s%-7s%-6s%-11s%-9s%-7s%-5s%4d *\n",l.sl[j].keys,l.sl[j].others.start,l.sl[j].others.end,l.sl[j].others.sche,l.sl[j].others.time1,l.sl[j].others.time2,l.sl[j].others.model,l.sl[j].others.price);
}
}
if(m==0)
printf("* 无此航班信息,可能是输入错误! *\n");
printf("*************************************************************\n");
}
void searchcon(sllist l)
{
keytype key[keylen];
int i=1,k;
while(i>=1&&i<=5)
{
printf("\n ********************\n");
printf(" * 航班信息查询系统 *\n");
printf(" ********************\n");
printf(" * 1.航 班 号 *\n");
printf(" * 2.起 点 站 *\n");
printf(" * 3.终 点 站 *\n");
printf(" * 4.起飞时间 *\n");
printf(" * 5.到达时间 *\n");
printf(" * 0.退出系统 *\n");
printf(" ********************\n");
printf(" 请选择(0-5):");
scanf("%d",&i);
printf("\n");
switch(i)
{
case 1:printf("输入要查询的航班号(字母要大写):");
scanf("%s",key);
k=binsearch(l,key);
printf("*************************************************************\n");
if(k==0)
printf("* 无此航班信息,可能是输入错误! *\n");
else
{
printf("* 航班号 起点站 终点站 航班期 起飞时间 到达时间 机型 票价 *\n");
printf("* %-8s%-7s%-6s%-11s%-9s%-7s%-5s%4d *\n",l.sl[k].keys,l.sl[k].others.start,l.sl[k].others.end,l.sl[k].others.sche,l.sl[k].others.time1,l.sl[k].others.time2,l.sl[k].others.model,l.sl[k].others.price);
}
printf("*************************************************************\n");
break;
case 2:printf("输入要查询的航班起点站名:");
scanf("%s",key);
seqsearch(l,key,i);
break;
case 3:printf("输入要查询的航班终点站名:");
scanf("%s",key);
seqsearch(l,key,i);
break;
case 4:printf("输入要查询的航班起飞时间:");
scanf("%s",key);
seqsearch(l,key,i);
break;
case 5:printf("输入要查询的航班到达时间:");
scanf("%s",key);
seqsearch(l,key,i);
break;
case 0:printf("\n\n\n 再 见\n\n\n");
}
}
}
void inputdata(sllist &l)
{
int i=++l.length;
char yn='y';
while(yn=='y'||yn=='Y')
{
printf("航班号 起点站 终点站 航班期 起飞时间 到达时间 机型 票价\n");
scanf("%s%s%s%s%s%s%s%d",l.sl[i].keys,l.sl[i].others.start,l.sl[i].others.end,l.sl[i].others.sche,l.sl[i].others.time1,l.sl[i].others.time2,l.sl[i].others.model,&l.sl[i].others.price);
++i; getchar();
radixsort(l);
arrange(l);
printf("继续输入吗?y/n:");
scanf("%c",&yn);
}
l.length=i-1;
}
void main()
{
sllist l;
l.keynum=6;
l.length=0;
inputdata(l);
searchcon(l);
}
3、测试结果:
航班信息:航班号 起点站 终点站 航班期 起飞时间 到达时间 机型 票价
输入:CA1544 合肥 北京 1.2.4.5 1055 1240 733 960
提示:继续输入吗?y/n:y
显示:航班号 起点站 终点站 航班期 起飞时间 到达时间 机型 票价
MU5341 上海 广州 每日 1420 1615 M90 1280
提示:继续输入吗?y/n:y
……
提示:继续输入吗?y/n:n