数据结构课程设计
课程名称 数据结构
学 院 计算机学院
专业班级 网络工程( 4 )班
学 号 3107007079
姓 名 陈天真
联系方式 13760641570
2009 年 06 月 22 日
题目:航空客运订票系统
一. 需求分析
(1) 用结构体 FlyLine 来表示航线的信息,本系统共有 20 条航线,每条航线上包
含了几部分的信息:途经站点名,航班号,飞机代号,飞机的飞行日期(星
期几),本次航班固有的座位情况,剩余座位情况以及一些指向客户链表的
指针。
(2) 航线的信息保存在文件中,在程序刚开始运行的时候系统自动读取对应的文
件,初始化每一条航线的信息。
(3) 本系统支持自动订票功能,即当当前不能满足客户的要求时,可以选择把客
户信息放入等候队列当中,当有人退票时,再逐一检查等候队列的客户,自
动为满足要求的客户订票。
(4) 每条航线都配有一个已购票客户信息链表和一个等候客户信息队列,在系统
结束前可以选择保存此次操作的结果,这样,已购票客户的信息便会单独保
存进一个文件中,下次程序运行时系统会自动读取。但等候队列不会保存。
同时系统也会即时更新航线的信息并写回文件。
(5) 本系统共包含了三大模块,分别为查询模块,订票模块和退票模块。
二. 概要设计
1. 设定航线的抽象数据类型定义:
typedef struct FlyLine
{
char passName[3][10];//途经站点名称
int lineNum;//航班号
char planeNum[5];//飞机号
int day;//飞行日期,取值为 0-6,分别对应星期日,星期一......
int totalSeats[4];//0 放总的座位数,1-3 分别存放 1、2、3 舱位数
int leaveSeats[4];//0 放总余票量,1-3 分别存放 1、2、3 舱位的余票量
LinkList userHead;//链表指针,指向已订票的客户链表
LinkQueue userWaitHead,userWaitRear;//队列头、尾指针,指向等候替//
补客户名单
};//共有 LINENUM 条航线
2. 设定已购票客户的抽象数据类型定义
typedef struct User
{
int lineNum;//航班号
char name[10];//游客姓名
int totalTickets;//游客所有订票量
int seatGradeNum[3];//分别存放 1、2、3 号舱位的订票量
}*UserPtr;
typedef User ElemType;
typedef struct UserNode//已订票用户节点
{
ElemType e;
UserNode * next;
}*LinkList;
//InitList 的调用函数,把客户插入到对应航线的初始已购票客户链表上.
void InsertUser(LinkList & head,ElemType e);
//初始化已购买票的客户的链表,即把客户分配到对应航线链表上.
void InitList(FlyLine * fl, UserPtr up , int & n);
//判断链表是否为空,是的话返回 true,否则返回 false.
bool ListEmpty(LinkList & head);
//获取给定客户姓名的链表指针,若查找成功,返回指向该客户的结点指针,否则返回 null.
//另外,pre 指针值为所找客户的前一结点的指针.
LinkList GetElem(LinkList & head, char * namePtr, LinkList & pre);
//在表头插入元素
void AddElem(LinkList & head, ElemType e);
//把用户插入对应航线的已定票用户链表当中,若购票失败,则返回 false,否则返回 true.
bool InsertElem(FlyLine * fl,ElemType e);
//删除给定客户,由于客户的退票而引起
bool DelElem(FlyLine * fl, char * namePtr);
//打印输出所有航线中已购票的客户信息
void ShowFlyLineUserInfo(FlyLine * fl);
3. 设定等候客户的抽象数据类型定义
typedef struct UserWait
{
int lineNum;//航班号
char name[10];//游客姓名
int gradeNum;//舱位号
int count; //所需票数
}*UserWaitPtr;
typedef struct UserWaitNode//等候客户节点
{
UserWait userWait;
UserWaitNode * next;
}*LinkQueue;
//插入一个数据到队尾中
void addUserWait(FlyLine *fl ,UserWait uw);
//从等候队列中取出一个客户
LinkQueue PopUserWait(FlyLine * fl);
//遍历输出等候队列客户的信息
void WaitUserTraverse(FlyLine * fl);//fl 为需要遍历的航线的指针
4. 本程序包含四个模块
(1) 主程序模块:
int main()
{
初始化:
while()
{
初始化:
switch()
{
功能选择……
}
}
}
(2) 查询模块
(3) 订票模块
(4) 退票模块
各模块之间的关系如下
说明:从 main 函数中可以进入到各个子模块当中,从每个子模块当中又可以返回到 main
模块当中,然后再进入到别的子模块当中。
三.详细设计
1.航线初始化
//从 flyLineInfo.txt 文件中读取数据初始化航线信息
bool InitLineData(FlyLine * fl);
//把新的航线信息写回 flyLineInfo.txt 文件中
bool WriteLineData(FlyLine * fl);
main
查 询 模
块 /*
插 入 一 个
数 据 到 队
尾中
*/
void
addUserWa
it(FlyLine
*fl ,UserW
ait uw);
/*
从 等 候 队
列 中 取 出
一个客户
*/
LinkQueue
PopUserWa
it(FlyLine
* fl);
/*
遍 历 输 出
等 候 队 列
客 户 的 信
息
*/
void
WaitUserTr
averse(Fly
Line *
fl);//fl 为需
要 遍 历 的
航 线 的 指
针 /*
插 入 一 个
数 据 到 队
尾中
*/
void
addUserWa
it(FlyLine
*fl ,UserW
ait uw);
/*
从 等 候 队
列 中 取 出
一个客户
*/
LinkQueue
PopUserWa
it(FlyLine
* fl);
/*
遍 历 输 出
等 候 队 列
客 户 的 信
息
*/
void
WaitUserTr
averse(Fly
Line *
fl);//fl 为需
要 遍 历 的
航 线 的 指
针
订票模块
插 入 一 个
数 据 到 队
尾中
*/
void
addUserWa
it(FlyLine
*fl ,UserW
ait uw);
/*
从 等 候 队
列 中 取 出
一个客户
*/
LinkQueue
PopUserWa
it(FlyLine
* fl);
/*
遍 历 输 出
等 候 队 列
客 户 的 信
息
*/
void
WaitUserTr
averse(Fly
Line *
fl);//fl 为需
要 遍 历 的
航 线 的 指
针 /*
插 入 一 个
数 据 到 队
尾中
*/
void
addUserWa
it(FlyLine
*fl ,UserW
ait uw);
/*
从 等 候 队
列 中 取 出
一个客户
*/
LinkQueue
PopUserWa
it(FlyLine
* fl);
/*
遍 历 输 出
等 候 队 列
客 户 的 信
息
*/
void
WaitUserTr
averse(Fly
Line *
fl);//fl 为需
要 遍 历 的
航 线 的 指
针
退 票 模
块 /*
插 入 一 个
数 据 到 队
尾中
*/
void
addUserWa
it(FlyLine
*fl ,UserW
ait uw);
/*
从 等 候 队
列 中 取 出
一个客户
*/
LinkQueue
PopUserWa
it(FlyLine
* fl);
/*
遍 历 输 出
等 候 队 列
客 户 的 信
息
*/
void
WaitUserTr
averse(Fly
Line *
fl);//fl 为需
要 遍 历 的
航 线 的 指
针 /*
插 入 一 个
数 据 到 队
尾中
*/
void
addUserWa
it(FlyLine
*fl ,UserW
ait uw);
/*
从 等 候 队
列 中 取 出
一个客户
*/
LinkQueue
PopUserWa
it(FlyLine
* fl);
/*
遍 历 输 出
等 候 队 列
客 户 的 信
息
*/
void
WaitUserTr
averse(Fly
Line *
fl);//fl 为需
要 遍 历 的
航 线 的 指
针
//从 userInfo.txt 中读取已订票的客户信息
bool LoadUserInfo(UserPtr up, int & n);//n 用来返回共有多少客户信息存档
//把已购票用户信息写入 userInfo.txt,n 从 0 算起,所以最后一个客户的索引值应为 n-1.
bool WriteUserInfo(FlyLine * fl);
步骤操作代码如下
//辅助函数,把一个客户名用' '填满至九个字符大小
void FillName(char* name)
{
int i;
for(i=0; i<9; i++)
if(name[i]=='\0')
break;
for(int j=i; j<9; j++)
name[j]=' ';
name[9]='\0';
}
/***************************************/
bool InitLineData(FlyLine * fl)
{
FILE* fp;
int i;
if((fp=fopen("flyLineInfo.txt","r"))==NULL)
{
printf("can't find the init file...\n");
return false;
}
for(i=0; i<LINENUM; i++)//LINENUM 在 flyLines.h 中定义
if(fread(&fl[i],sizeof(FlyLine),1,fp)!=1)
{
printf("init file data occur error!!!");
fclose(fp);
return false;
}
fclose(fp);
//把所有航线中的指针值修改为 NULL
for(int j=0; j<LINENUM; j++)
{
fl[j].userHead = NULL;
fl[j].userWaitHead = NULL;
fl[j].userWaitRear = NULL;
}
查 询 模
块 /*
插 入 一 个
数 据 到 队
尾中
*/
void
addUserWa
it(FlyLine
*fl ,UserW
ait uw);
/*
从 等 候 队
列 中 取 出
一个客户
*/
LinkQueue
PopUserWa
it(FlyLine
* fl);
/*
遍 历 输 出
等 候 队 列
客 户 的 信
息
*/
void
WaitUserTr
averse(Fly
Line *
fl);//fl 为需
要 遍 历 的
航 线 的 指
针 /*
插 入 一 个
数 据 到 队
尾中
*/
void
addUserWa
it(FlyLine
*fl ,UserW
ait uw);
/*
从 等 候 队
列 中 取 出
一个客户
*/
LinkQueue
PopUserWa
it(FlyLine
* fl);
/*
遍 历 输 出
等 候 队 列
客 户 的 信
息
*/
void
WaitUserTr
averse(Fly
Line *
fl);//fl 为需
要 遍 历 的
航 线 的 指
针
订票模块
插 入 一 个
数 据 到 队
尾中
*/
void
addUserWa
it(FlyLine
*fl ,UserW
ait uw);
/*
从 等 候 队
列 中 取 出
一个客户
*/
LinkQueue
PopUserWa
it(FlyLine
* fl);
/*
遍 历 输 出
等 候 队 列
客 户 的 信
息
*/
void
WaitUserTr
averse(Fly
Line *
fl);//fl 为需
要 遍 历 的
航 线 的 指
针 /*
插 入 一 个
数 据 到 队
尾中
*/
void
addUserWa
it(FlyLine
*fl ,UserW
ait uw);
/*
从 等 候 队
列 中 取 出
一个客户
*/
LinkQueue
PopUserWa
it(FlyLine
* fl);
/*
遍 历 输 出
等 候 队 列
客 户 的 信
息
*/
void
WaitUserTr
averse(Fly
Line *
fl);//fl 为需
要 遍 历 的
航 线 的 指
针
退 票 模
块 /*
插 入 一 个
数 据 到 队
尾中
*/
void
addUserWa
it(FlyLine
*fl ,UserW
ait uw);
/*
从 等 候 队
列 中 取 出
一个客户
*/
LinkQueue
PopUserWa
it(FlyLine
* fl);
/*
遍 历 输 出
等 候 队 列
客 户 的 信
息
*/
void
WaitUserTr
averse(Fly
Line *
fl);//fl 为需
要 遍 历 的
航 线 的 指
针 /*
插 入 一 个
数 据 到 队
尾中
*/
void
addUserWa
it(FlyLine
*fl ,UserW
ait uw);
/*
从 等 候 队
列 中 取 出
一个客户
*/
LinkQueue
PopUserWa
it(FlyLine
* fl);
/*
遍 历 输 出
等 候 队 列
客 户 的 信
息
*/
void
WaitUserTr
averse(Fly
Line *
fl);//fl 为需
要 遍 历 的
航 线 的 指
针