北京化工大学数据结构课程设计报告.docx
《北京化工大学数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《北京化工大学数据结构课程设计报告.docx(52页珍藏版)》请在冰豆网上搜索。
北京化工大学数据结构课程设计报告
程序的设计与实现
——数据结构课程设计
小组成员名单
序号
班级
学号
姓名
完成功能简述
成绩
1
计科1103班
2011014257
朱楠
2
计科1103班
2011014272
高华超
北京化工大学
信息科学与技术学院计算机科学与技术专业
2012.1
一、功能描述
1.1系统实现的目的和意义:
1.数据结构课程设计是综合运用数据结构课程中学到的几种典型数据结构,以及程序设计语言(C语言),自行实现一个较为完整的应用系统的设计与开发。
2.通过课程设计,自己通过系统分析、系统设计、编程调试,写实验报告等环节,进一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解典型数据结构在软件开发中的应用。
3.学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力。
航空空订票系统:
(1)熟练掌握链表存储结构及其建立过程和常用操作;
(2)熟练掌握队列的建立过程和常用操作;
(3)学会自己调试程序的方法并掌握一定的技巧。
1.2系统实现的功能:
航空客运订票的业务活动包括:
查询航线、客票预订和办理退票等。
设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。
1.3系统开发的环境:
C类,开发软件为DEVC++
二、总体结构
2.1文件清单(按文件系统树型方式排列)
浏览航线信息读入文件(airplane.txt)
浏览已订票客户信息按航班号查找
主
按终点站查询
菜查询航线
按航班号查询
单
办理订票业务
办理退票业务
退出系统
2.2系统功能结构图
2.3系统的总流程图
Y
N
Y
N
Y
N
Y
N
Y
N
Y
N
三、详细设计(均需注释)
3.1数据结构
订票跟退票的模块均用到了链表跟队列的知识。
以退票模块为例:
(退票模块涉及到两方面,一是客户将定完的票推掉,二是将客户退掉的票安排给排队的客户)
voidreturn_tkt()
/*退票模块*/
{structairline*info;
qnode*t,*back,*f,*r;
intgrade;
linklist*p1,*p2,*head;
charcusname[10];
if(!
(info=find()))
return;/*调用查询函数,根据客户提供的航线进行搜索*/
head=info->order;
p1=head;
printf("请输入你的姓名(退票客户):
");
scanf("%s",cusname);
while(p1!
=NULL)
{/*根据客户提供的姓名到订票客户名单域进行查询*/
if(!
strcmp(cusname,p1->name))
break;
p2=p1;
p1=p1->next;
}
if(p1==NULL)
{
printf("对不起,你没有订过票!
\n");
return;
}/*若未找到,退出本模块*/
else
{/*若信息查询成功,删除订票客户名单域中的信息*/
if(p1==head)head=p1->next;
elsep2->next=p1->next;
info->tkt_sur+=p1->ord_amt;
grade=p1->grade;
printf("%s成功退票!
\n",p1->name);
free(p1);
}
info->order=head;/*重新将航线名单域指向订票单链表的头指针*/
f=(info->wait).front;/*f指向排队等候名单队列的头结点*/
r=(info->wait).rear;/*r指向排队等候名单队列的尾结点*/
t=f;/*t为当前满点条件的排队候补名单域*/
while(t)
{
if(info->tkt_sur>=info->wait.front->req_amt)
{/*若满足条件者为头结点*/
inti;
info->wait.front=t->next;
printf("%s订票成功!
\n",t->name);
for(i=0;ireq_amt;i++)/*输出座位号*/
printf("%s的座位号是:
%d\n",t->name,(info->tkt_sur)-i);
info->tkt_sur-=t->req_amt;
info->order=insertlink(info->order,t->req_amt,t->name,grade);/*插入到订票客户名单链表中*/
free(t);
break;
}
back=t;
t=t->next;
if((info->tkt_sur)>=(t->req_amt)&&t!
=NULL)/*若满足条件者不为头结点*/
{
inti;
back->next=t->next;
printf("%s订票成功!
\n",t->name);
for(i=0;ireq_amt;i++)/*输出座位号*/
printf("<%s>'sseatnumberis:
%d\n",t->name,(info->tkt_sur)-i);
info->tkt_sur-=t->req_amt;
info->order=insertlink(info->order,t->req_amt,t->name,grade);/*插入到订票客户名单链表中*/
free(t);
break;
}
if(f==r)
break;
}
}
3.2各模块(或算法)流程图(标明函数名)
(1)显示已初始化的全部航线信息
(2)查询航线
a.按终点站查询
b.按航班号查询
(3)浏览已订票客户信息
(4)订票
(5)办理退票业务
四、系统实现
4.1模块一:
初始化
intreadrecord(structairlineair[])
{
FILE*fp;
structairlinea;
if((fp=fopen("airplane.txt","r"))!
=NULL)
{
while(!
feof(fp))
{
fscanf(fp,"%s%s%s%s%d%d",a.ter_name,a.air_num,a.plane_num,a.day,&a.tkt_amt,&a.tkt_sur);
strcpy(air[length].ter_name,a.ter_name);
strcpy(air[length].air_num,a.air_num);
strcpy(air[length].plane_num,a.plane_num);
strcpy(air[length].day,a.day);
air[length].tkt_amt=a.tkt_amt;
air[length].tkt_sur=a.tkt_sur;
length++;
}
air[length].ter_name[0]='\0';
}
else
{
printf("Cannotopenthisfile!
\n");
exit(0);
}
returnlength;
}
4.2模块二:
显示每条航线信息
voiddisplay(structairline*info)
/*输出每条航线的基本信息*/
{
printf("%8s\t%3s\t%s\t%4s\t\t%3d\t%10d\n",info->ter_name,info->air_num,info->plane_num,info->day,info->tkt_amt,info->tkt_sur);
}
4.3模块三:
打印全部航线信息
voidlist()
{
structairline*info;
inti=0;
info=start;
printf("终点站名\t航班号\t飞机号\t飞行周日\t乘员定额\t余票量\n");
while(i{
display(info);
info++;
i++;
}
printf("\n\n");
}
4.4模块四:
根据客户提出的终点站名输出航线信息
voidsearch()
{
intfindHao();
intfindZhong();
structairline*find();
printf("1......按终点站查询\n2......按航班号查询\n");
switch(getch())
{
case'1':
findHao();
break;
case'2':
findZhong();
break;
default:
;
}
}
4.5模块五:
根据客户提出的终点站名输出航线信息
intfindHao()
{
structairline*info;
charname[10];
inti=0;
info=start;
printf("请输入终点站名:
");
scanf("%s",name);
while(i{
if(!
strcmp(name,info->ter_name))break;//字符串比较
info++;
i++;
}
if(i>=length)
printf("对不起,该航线未找到!
\n");
else
{
printf("终点站名\t航班号\t飞机号\t飞行周日\t乘员定额\t余票量\n");
display(info);
}
}
4.6模块六:
根据系统提出的航班号查询并以指针形式返回
intfindZhong()
{
structairline*info;
charnumber[10];
inti=0;
info=start;
printf("请输入航班号:
");
scanf("%s",number);
while(i{
if(!
strcmp(number,info->air_num))
break;
info++;
i++;
}
if(i>=length)
printf("对不起,该航线未找到!
\n");
else
{
printf("终点站名\t航班号\t飞机号\t飞行周日\t乘员定额\t余票量\n");
display(info);
}
returnNULL;
}
4.7模块七:
根据系统提出的航班号查询并以指针形式返回
structairline*find()
{
structairline*info;
charnumber[10];
inti=0;
info=start;
printf("请输入航班号:
");
scanf("%s",number);
while(i{
if(!
strcmp(number,info->air_num))
returninfo;
info++;
i++;
}
if(i>=length)
printf("对不起,该航线未找到!
\n");
else
{
printf("终点站名\t航班号\t飞机号\t飞行周日\t乘员定额\t余票量\n");
display(info);
}
returnNULL;
}
4.8模块八:
打印订票乘员名单域的客户名单信息
voidprtlink()
{linklist*p;
structairline*info;
info=find();
p=info->order;
if(p!
=NULL)
{
printf("客户姓名订票数额舱位等级\n");
while(p)
{
printf("%s\t\t%d\t%d\n",p->name,p->ord_amt,p->grade);
p=p->next;
}
}
else
printf("该航线没有客户信息!
!
\n");
}
4.9模块九:
增加订票乘员名单域的客户信息
linklist*insertlink(linklist*head,intamount,charname[],intgrade)
{
linklist*p1,*n;
p1=head;
n=(linklist*)malloc(sizeof(linklist));
if(!
n)
{
printf("\nOutofmemory!
!
\n");
returnNULL;
}
strcpy(n->name,name);
n->ord_amt=amount;
n->grade=grade;
n->next=NULL;
if(head==NULL)/*若原无订票客户信息*/
{
head=n;
n->next=NULL;
}
else
head=n;
n->next=p1;
returnhead;
}
4.10模块十:
增加排队等候的客户名单域
linkqueueappendqueue(linkqueueq,charname[],intamount)
{qptrn;
n=(qptr)malloc(sizeof(qnode));
strcpy(n->name,name);
n->req_amt=amount;
n->next=NULL;
if(q.front==NULL)/*若原排队等候客户名单域为空*/
q.front=n;
else
q.rear->next=n;
q.rear=n;
returnq;
}
4.11模块十一:
订票业务
voidorder()
/*办理订票业务*/
{structairline*info;
intamount,grade;
charname[10];
info=start;
if(!
(info=find()))
return;/*根据客户提供的航班号进行查询,如为空,退出该模块*/
printf("请输入你订票所需要的数量:
");
scanf("%d",&amount);
if(amount>info->tkt_amt)/*若客户订票额超过乘员定票总额,退出*/
{
printf("\n对不起,您输入的票的数量已经超过乘员定额!
");
return;
}
if(amount<=info->tkt_sur)/*若客户订票额末超过余票量,订票成功并等记信息*/
{
inti;
printf("请输入您的姓名(订票客户):
");
scanf("%s",name);
printf("请输入您需订购的机票的舱位等级:
",grade);
scanf("%d",&grade);
info->order=insertlink(info->order,amount,name,grade);/*在订票乘员名单域中添加客户信息*/
for(i=0;iprintf("%s的座位号是:
%d\n",name,info->tkt_amt-info->tkt_sur+i+1);
info->tkt_sur-=amount;/*该航线的余票量应减掉该客户的订票量*/
printf("\n祝您乘坐愉快!
\n");
}
else/*若满员或余票额少于订票额,询问客户是否需要进行排队等候*/
{
charr;
printf("\n已经没有更多的票,您需要排队等候吗?
(Y/N)");
r=getch();
printf("%c",r);
if(r=='Y'||r=='y')
{
printf("\n请输入您的姓名(排队订票客户):
");
scanf("%s",name);
info->wait=appendqueue(info->wait,name,amount);/*在排队等候乘员名单域中添加客户信息*/
printf("\n添加成功!
\n");
}
elseprintf("\n欢迎您下次订购!
\n");
}
}
4.12模块十二:
退票业务
voidreturn_tkt()
/*退票模块*/
{structairline*info;
qnode*t,*back,*f,*r;
intgrade;
linklist*p1,*p2,*head;
charcusname[10];
if(!
(info=find()))
return;/*调用查询函数,根据客户提供的航线进行搜索*/
head=info->order;
p1=head;
printf("请输入你的姓名(退票客户):
");
scanf("%s",cusname);
while(p1!
=NULL)
{/*根据客户提供的姓名到订票客户名单域进行查询*/
if(!
strcmp(cusname,p1->name))
break;
p2=p1;
p1=p1->next;
}
if(p1==NULL)
{
printf("对不起,你没有订过票!
\n");
return;
}/*若未找到,退出本模块*/
else
{/*若信息查询成功,删除订票客户名单域中的信息*/
if(p1==head)head=p1->next;
elsep2->next=p1->next;
info->tkt_sur+=p1->ord_amt;
grade=p1->grade;
printf("%s成功退票!
\n",p1->name);
free(p1);
}
info->order=head;/*重新将航线名单域指向订票单链表的头指针*/
f=(info->wait).front;/*f指向排队等候名单队列的头结点*/
r=(info->wait).rear;/*r指向排队等候名单队列的尾结点*/
t=f;/*t为当前满点条件的排队候补名单域*/
while(t)
{
if(info->tkt_sur>=info->wait.front->req_amt)
{/*若满足条件者为头结点*/
inti;
info->wait.front=t->next;
printf("%s订票成功!
\n",t->name);
for(i=0;ireq_amt;i++)/*输出座位号*/
printf("%s的座位号是:
%d\n",t->name,(info->tkt_sur)-i);
info->tkt_sur-=t->req_amt;
info->order=insertlink(info->order,t->req_amt,t->name,grade);/*插入到订票客户名单链表中*/
free(t);
break;
}
back=t;
t=t->next;
if((info->tkt_sur)>=(t->req_amt)&&t!
=NULL)/*若满足条件者不为头结点*/
{
inti;
back->next=t->next;
printf("%s订票成功!
\n",t->name);
for(i=0;ireq_amt;i++)/*输出座位号*/
printf("<%s>'sseatnumberis:
%d\n",t->name,(info->tkt_sur)-i);
info->tkt_sur-=t->req_amt;
info->order=insertlink(info->order,t->req_amt,t->name,grade);/*插入到订票客户名单链表中*/
free(t);
break;
}
if(f==r)
break;
}
}
4.13模块十三:
主菜单
intmenu_select()
/*菜单界面*/
{intc;
chars[20];
printf("\n\t\t航空客运订票系统\n");
printf("******************************************\n");
printf("1.浏览航线信息:
\n");
printf("2.浏览已订票客户信息:
\n");
printf("3.查询航线\n");
printf("4.办理订票业务:
\n");
printf("5.办理退票业务:
\n");
printf("6.退出系统\n");
printf("*******************************************\n");
do{
printf("请选择:
");
scanf("%s",s);
c=atoi(s);//convertstringtoint
}while(c<0||c>7);
returnc;
}
4.14模块十四:
主函数
intmain()
{/*structairlineair[MAXSIZE]={{"beijing","1","B8571","SUN",3,3},
{"shanghai","2","S1002","MON",2,2},
{"london","3","L1003","FRI",1,1}};/*初始化航线信息*/
/*clrscr();*/
readrecord(air);
start=air;
for(;;){
switch(menu_select()){
case1:
list();break;
case2:
prtlink();break;
case3:
search();break;
case4:
order();break;
case5:
return_tkt();break;
case6:
printf("\n欢迎使用本系统,再见!
\n");exit(0);
}
printf("\nPressanykeytocontinue!
\n");
getch();
}
}
五、程序的过程展示
5.1程序运行过程展示
主界面
浏览航线信息
浏览已订票客户信息
查询航线
办理订票业务
办理退票业务
5.2程