题目:航空订票系统
班级:电信0912 姓名:胡德春 学号:090901217 需求分析
1.演示程序以用户和计算机对话的方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。
2.程序执行的命令包括
(1)录入航班情况(2)查询航线情况(3)订票(4)订票(5)客户资料(6)修改航班信息
3.测试数据
(1) choose 1
airline 225 plane 18 destination China data 2010-10-26 choose2
choose 2(choose1)
destination China
choose 3
destination China book 2 choose3(choose1)
name Rambo book 3
choose 4
airline 225 name Rambo book 3
(2)choose 1
airline 265 plane 20 destination USA data 2010-10-01 choose2
choose 2(choose2)
airline 265
choose 3
destination USA book -2 name Rambo
choose 4
airline 265 name Rambo book -2
choose 5
二.概要设计
为了实现上述程序功能,应有单链
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
单链队和含六个信息的结构体
1.表的存储结构
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
2.队的存储结构
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode , *QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;
3.结构体定义
typedef struct
{
………….
};
4.程序模块
(1) 主程序
void main(){
do{
………
}
switch()
{
………
}
while()
}
(2) 单链表结构
(3) 单链队结构
(4) 含六个信息的结构体
(5) 调用关系
主函数调用其他结构
三.详细设计
#include
#include
#include
#include
#include
#include
#include //overflow
#define ok 1
typedef struct Yidingkehu{//单链表
char name[15];//已订票的客户姓名
int dingpiaoshu;//已订票数量
struct Yidingkehu *next1;//
}Yidingkehu,*Link;
typedef struct Weidingkehu{//单链队
char name[15];//预订票的客户姓名
int yudingpiao;// 要订票数量
struct Weidingkehu *next2;//下一个链队结点指针
}Weidingkehu,*Qptr;
typedef struct {
Qptr front;//单链队头结点
Qptr rear;//单链队尾结点
}linkQueue;
typedef struct Hangxian{//创建一个含有六个信息的结构体
char hangbanhao[15];//航班号-
char feijihao[15];//飞机号
int feixingriqi;//起飞时间
int chenkerenshu;//座位数
int yupiao;//余票
char zhongdianzhai[15];//降落城市
struct Hangxian *next;//指向下一个链结点的指针
struct Yidingkehu *yiding;//定义一个指向已订票客户的头结点指针
struct Weidingkehu *yudingqueue;
}Hangxian,*Linklist;
struct Hangxian *L=NULL;//
struct Yidingkehu *H;//为已订票客户链队来申请空间
linkQueue Q;//linkQueue类型的来申请空间
Linklist InitLinklist();//01
int InsertLinklist(Linklist &head1);//02
void hbhchaxun();//通过航班号查询
void mddchaxun();//通过目的地查询
void lurugongneng();//初始化录入功能
void chaxungongnen();//查询功能
void dingpiaogongnen();//订票功能
void tuipiaogongnen();//退票功能
void main()
{
H=(struct Yidingkehu*)malloc(sizeof(Yidingkehu));
Q.front=Q.rear=(Qptr)malloc(sizeof(Weidingkehu));
InitLinklist();
int n;
do{ //打印主界面
printf("\t 欢迎使用航空客运订票系统\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t==>1. 录入功能 ==\n");
printf("\t==>2. 查询功能 ==\n");
printf("\t==>3. 订票功能 ==\n");
printf("\t==>4. 退票功能 ==\n");
printf("\t==>5. 退出 ==\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t请选择:");
scanf("%d",&n);printf("\n");
switch(n)
{
case 1: lurugongneng();//录入功能
break;
case 2: chaxungongnen();//查询功能
break;
case 3: dingpiaogongnen();//订票功能
break;
case 4:tuipiaogongnen();//退票功能
break;
default :exit(0);//退出
}
}while(n==1||n==2||n==3||n==4);
}
void lurugongneng()//初始化的单链表*********************************************************录入功能
{
int j=1,m;
do{
if(!InsertLinklist((Linklist) L)) //向其中加入航班信息
{
printf("内存已满\n"); exit(OVERFLOW);
}//向链表中加一结点
printf("\t是否要输入下一个航线记录?\n");
printf("\t是请输入1\n");
printf("\t否请输入2\n\t");
scanf("%d",&m); //在这里依靠人来决定是否输入下一条航线记
}while(m==1);
}
Linklist InitLinklist(){//01
L=(Linklist)malloc(sizeof(Hangxian));
if(!L) exit(OVERFLOW);
L->next=NULL;//建立一个带有头结点的单链表
return (L);
}
int InsertLinklist(Linklist &L)//02向航线链表添加新的结点
{
Linklist p;
//int m,n;
p=(Linklist)malloc(sizeof(Hangxian));//为一个新的结点分配空间
if(!p) exit(OVERFLOW);
printf("\t请依次输入下面几项内容:\n\n");//这里的输入采用一个个单独输入,避免了乱赋值的现象
printf("航班号\n");
gets(p->hangbanhao);//这里的二个gets主要是因为在回车键的输入,其中的第一个是来接收上次的回车
gets(p->hangbanhao);
printf("飞机号\n");
gets(p->feijihao);
printf("终点站\n");
gets(p->zhongdianzhai);
printf("飞行日期\n");
scanf("%d",&p->feixingriqi);
printf("乘客总数\n");
scanf("%d",&p->chenkerenshu);
printf("余票数\n");
scanf("%d",&p->yupiao);
p->yiding=(struct Yidingkehu*)malloc(sizeof(Yidingkehu));//为它申请空间
p->yudingqueue=Q.front=Q.rear=(Qptr)malloc(sizeof(Weidingkehu));//为它申请空间
p->next=L->next;//
L->next=p;//这二句是链表中的头插法插入一个结点
return (ok);
}
void chaxungongnen()//******************************************************************查询功能
{
int n;
printf("\t 查 找 航 线 信 息 \n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t==>1. 通过目的地查询 ==\n");
printf("\t==>2. 通过航班号查询 ==\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t请选择:");
scanf("%d",&n);
printf("\n");//格式化
switch(n)
{
case 1:mddchaxun();
break;
case 2:hbhchaxun();
break;
default :break;
}
}
void mddchaxun()//通过目的地查询
{
char c[15];
int m;
Linklist p=L;
printf("\t请输入要查询的目的地:");
gets(c);
gets(c);//原因同上
do{
p=p->next;
if(p)
{
m=strcmpi((*p).zhongdianzhai,c);//如果==的话则m=0;
if(m==0)
{
printf("\t航班信息:\n");
printf("\t航班号:%s\n",p->hangbanhao);
printf("\t飞机号:%s\n",p->feijihao);
printf("\t飞行时间:周%d\n",p->feixingriqi);
printf("\t余票量:%d\n",p->yupiao);
}
}
else
{//如果不匹配的话就做
printf("\t对不起没有你要找的目的地:\n\n"); m=0;
}
}while(m!=0);
}
void hbhchaxun()//通过目的地查询
{
char c[15];
int m;
Linklist p=L;
printf("\t请输入要查询的航班号:");
gets(c); gets(c);printf("\n");
do{
p=p->next;
if(p)
{
m=strcmpi((*p).hangbanhao,c);//如果==的话则m=0;这里的(*p).与p->的作用是一样的
if(m==0)
{
printf("\t航班信息:\n");
printf("\t航班号:%s\n",p->hangbanhao);
printf("\t飞机号:%s\n",p->feijihao);
printf("\t飞行时间:周%d\n",p->feixingriqi);
printf("\t余票量:%d\n\n",p->yupiao);
}
}
else
{//如果不匹配的话就做
printf("\t对不起没有你要找的航班号:\n"); m=0;
}
}while(m!=0);
}
void dingpiaogongnen()//***************************************************************订票功能
{
Linklist p=L;//Linklist类型的L来指向链表头
Yidingkehu *h=H,*h1;//Yidingkehu 定义客户的结点,方便插入与删除
linkQueue q=Q;//linkQueue类型的来 ,方便插入与删除
char c[15];
int m=1,piao,ydpiao=0,yd=0,n;//
gets(c);
printf("请输入终点站名:"); gets(c); printf("\n");
p=L->next;
if(p) {
do{//查找一下,是否有这个航班
if(!p)
{
printf("对不起,没有你要找的航班:\n\n");
goto loop1;
}
m=strcmpi(p->zhongdianzhai,c);
if(m==0)
{
printf("航班信息:\n");
printf("航班号:%s\n",p->hangbanhao);
printf("飞机号:%s\n",p->feijihao);
printf("飞行时间:周%d\n",p->feixingriqi);
printf("余票量:%d\n",p->yupiao);}
else p=p->next;
}while(m!=0);
if(m==0)
{
do{
printf("\n请输入你要订的票数:"); scanf("%d",&piao);
if(piao<=p->yupiao)
{
h=p->yiding;
if(h)
{
h1=h;
h=h->next1;
h=(struct Yidingkehu*)malloc(sizeof(Yidingkehu));
printf("请输入你的名字:");
gets(h->name);gets(h->name);
h->dingpiaoshu=piao;
h->next1=h1->next1;
h1->next1=h;
p->yupiao=p->yupiao-piao;
printf("订票成功:\n"); m=2;
}
}
else
{ printf("余票量:%d\n",p->yupiao);
printf("对不起,余票 %d 张不足,不能完成订票\n\n",p->yupiao);
printf(" 是否要重新订票?\n");
printf("需要请输入1 否则请按2 预订请输入3 : ");
scanf("%d",&m);
printf("\n");
if(m==3) goto loop3;
}
}while(m==1);
}
}
else if(!p) {
loop3: struct Weidingkehu *q3;
printf("对不起,该航班的票已售完\n");
q.front=p->yudingqueue;
if(q.front==q.rear) printf("没有人预订票,是否要预订?\n");
else if(q.front!=q.rear) printf("已有人预订票,是否要预订?\n");
printf("预订请输入1 否则输入2 : ");
scanf("%d",&n);
printf("\n");
if(n==1)
{
q3=(Qptr)malloc(sizeof(Weidingkehu));
printf("请输入你的姓名"); gets(q3->name); gets(q3->name);//q3不能指向name???
printf("请输入订票数"); scanf("%d",&q3->yudingpiao);
q3->next2=NULL;
q.rear->next2=q3;
q.rear=q3;
printf(" 你已经预订了 !\n");
}
}
loop1:;
}
void tuipiaogongnen()//***************************************************************退票功能
{
Linklist p=L;
Yidingkehu *h=H,*h1,*h2;
linkQueue q=Q;
char c[15],name1[15];
int m=1,piao,n;//
gets(c);
printf("请输入航班号:"); gets(c);
p=L;//->next;
if(p)
{
do{ //使用do while来查找是否有此航班
if(!p)
{//如果是到了表尾且没有匹配,goto至再输入航班号
printf("\n对不起,没有你要找的航班:\n");
goto loop1;
}
m=strcmpi(p->hangbanhao,c);//如果匹配的话,m=0
if(m==0)
{
printf("\t航班信息:\n");
printf("航班号:%s\n",p->hangbanhao);
printf("飞机号:%s\n",p->feijihao);
printf("飞行时间:周%d\n",p->feixingriqi);
printf("余票量:%d\n",p->yupiao);}
else p=p->next;
}while(m!=0);
if(m==0)
{//如果找到了,就来给他退票
do{
h=p->yiding;
if(h)
{
printf("请输入你的姓名:");
gets(name1);//gets(name1);
printf("请输入你订的票数:");
scanf("%d",&piao);
printf("\n");
h1=h;
h=h->next1;
if(strcmpi(h->name,name1)==0&&h->dingpiaoshu==piao)//如果名字和订的票数相等,则就给他取消订票
{
p->yupiao+=h->dingpiaoshu;
h2=h;
h1->next1=h->next1;
free(h2);
printf("你取消订票成功:\n\n");
struct Weidingkehu *q3;
q.front=p->yudingqueue;
if(q.front==q.rear) {printf("没有人预订票:\n"); goto loop1;}
if((p->yupiao)>=(q.front->next2->yudingpiao))
{
h2=(struct Yidingkehu*)malloc(sizeof(Yidingkehu));
strcpy(h2->name,q.front->next2->name);
h2->dingpiaoshu=q.front->next2->yudingpiao;
n=p->yupiao-q.front->next2->yudingpiao;
p->yupiao=n;
q3=Q.front->next2;//
q.front->next2=q3->next2;//这二语句来删除结点
if(q.rear==q3) q.rear=q.front;
free(q3);//释放空间
printf("链队中删除成功\n");
h2->next1=h->next1;
h->next1=h2;//为之插入进已订票客户链表中
printf("为预订的客户订票成功\n");
}
else printf("余票数不够,不能为预订客户订票!\n");
}
else
{ //如果没有找到,即系统中没有该人的信息,提示是否来重新查找
printf("对不起,该航班没有人订票或者是你没有订该航班的票\n");
printf("是否要重新查找并取消订票?\n");
printf("需要请输入1 否则请按2 ");
scanf("%d",&m);
printf("\n");
}
}
}while(m==1);
}
}
loop1: ;
}
四.调试分析
1程序中的余票数是个bug,始终为负数
2本题中算法时间复杂度O(n).
5. 测试结果