数据结构报告.docx
《数据结构报告.docx》由会员分享,可在线阅读,更多相关《数据结构报告.docx(34页珍藏版)》请在冰豆网上搜索。
数据结构报告
成都理工大学工程技术学院
课程设计报告
设计名称:
数据结构课程设计
姓名:
赵磊学号:
201320201112
专业班级:
计算机科学与技术
系(院):
电子信息与计算机工程系
设计时间:
2013.05.04
设计地点:
成都理工大学工程技术学院
指导教师评语:
签名:
年月日
目录
一.需求分析3
二.概要设计4
三.详细设计5
四.运行结果14
五.总结16
致谢17
参考文献18
附录:
19
一.需求分析
要实现本项目的功能,需要熟练掌握链表和队列。
要求实现的基本功能比较简单,只有查询航线,订票和退票业务,以及余票不足等待,这些功能都是数据结构中的内容。
制作该系统还要熟练掌握C语言的语法知识,尤其是对结构体,字符串,指针以及函数的所有操作。
二.概要设计
因为,要对航班进行管理,首先要对航线进行初始化,这样才能够实现对订票和退票进行相应的操作。
这个程序里面包括有多个结构体,其功能主要是服务数据结构的各个算法。
定义实现功能的主要函数有:
打印每条航线的基本信息的函数display();打印全部航线信息的函数list();增加排队等候的客户名单域的结构体类型函数appendqueue();根据客户提出的终点站名输出航线信的函数ter();根据系统提出的航班号查询并以指针形式返回的结构体类型的指针函数*find();打印订票乘员名单域的客户名单信的函数prtlink();订票系统函数order()和退票系统函数return_tkt()是本系统的重点;之后按要求有按剩余票数排序的函数voidsort_tkt();之后就是主界面,选择要进行的相应的操作函数sort_tkt();
在进行订票和退票时,采用链式存储的形式,运用链表,订票中每个元素的存储位置都能计算到,方便的增加节点个数,在进行退票时就是对链表节点的删除。
链表的插入删除相对于线性表来说更简单,更方便。
本系统会频繁的对节点进行插入和删除,所以采用链表是最优选择。
当余票量不足以满足购票人的需求时,本程序就运用队列进行排队等候。
3.详细设计
1.结构图
2.定义结构体
structclient_list//客户名单
{
charclient_name[20];//客户姓名
intbook_the_ticket_num;//订票数量
intgrade;//舱位等级
structclient_list*next;
};
typedefstructwait_liat
{
charwait_name[20];
intreq_amt;
structwait_liat*next;
}qnode,*qptr;
structlinkqueue
{
qptrfront;//等候替补客户名单域的头指针
qptrrear;//等候替补客户名单域的属指针
};
structairline
{
charter_name[10];//终点站名
charflight[10];//航班号
charplane_num[10];//飞机号
chardate[7];//飞行日期(星期几)
inttkt_amt;//乘员定额
intseats;//余票量
chartime[15];//飞行时长
intair_fare;//机票价格
chartake_off_time[10];//起飞时间
structclient_list*order;//乘员名单域,指向乘员名单链表的头指针
structlinkqueuewait;//等候替补的客户名单域,分别指向排队等候名单队头队尾的指针
}lineinfo;
structlinkqueueappendqueue(structlinkqueueq,charname[],intamount)
//增加排队等候的客户名单域
{
qptrnew1;
new1=(qptr)malloc(sizeof(qnode));
strcpy(new1->wait_name,name);
new1->req_amt=amount;
new1->next=NULL;
if(q.front==NULL)//若原排队等候客户名单域为空
q.front=new1;
else
q.rear->next=new1;
q.rear=new1;
returnq;
}
这些结构体的作用,一是用来让本系统中不同的数据类型一同使用时更加方便,另一方面也是为了运用上数据结构,让数据结构中的算法运到笨系统中来,这个主要运用数据结构中的链表和队列这两种结构。
3.主函数设计:
voidmain()
{
intc;
start=air;
while
(1)
{
change();
printf("请选择:
");
scanf("%d",&c);
switch(c)//选择相关的功能
{
case1:
list();break;
case2:
prtlink();break;
case3:
ter();break;
case4:
order();break;
case5:
return_tkt();break;
case6:
sort_tkt();break;
case0:
printf("\n欢迎再次使用本系统,再见!
\n");
exit(0);
default:
printf("输入有误,请重新输入!
!
!
\n");
}
getchar();
}
}
函数的主要功能是作为程序运行的接口,进行相应的选择,进行具体的各项操作。
4.打印基本航线信息的函数:
voiddisplay(structairline*info)//打印每条航线的基本信息
{
printf("%8s%3s%s%4s%6d%5d%8s%5d%s\n",
info->ter_name,info->flight,info->plane_num,info->date,info->tkt_amt,info->seats,info->time,info->air_fare,info->take_off_time);
}
该函数主要是打印航线的基本消息,该函数在整个程序中使用的频率最高,所以把它单独用函数的形式写出来,目地是不要重复累赘,
5.打印全部航线信息的函数:
voidlist()//打印全部航线信息
{
structairline*info;
inti=0;
info=start;
printf("终点站名**航班号**飞机号**飞行日期**乘员定额**余票量**飞行时间**票价**起飞时间\n");
while(i<6)
{
display(info);
info++;
i++;
}
printf("\n\n");
}
从main函数就可以看出,main函数第一条就是把所有的航线打印出来,运用一个循环,把所用航线消息全部显示给用户。
6.增加排队等候的客户名单域
structlinkqueueappendqueue(structlinkqueueq,charname[],intamount)
{
qptrnew1;
new1=(qptr)malloc(sizeof(qnode));
strcpy(new1->wait_name,name);
new1->req_amt=amount;
new1->next=NULL;
if(q.front==NULL)//若原排队等候客户名单域为空
q.front=new1;
else
q.rear->next=new1;
q.rear=new1;
returnq;
}
该函数主要配合订票功能中,余票不足,让客户等待的函数使用,使用队列让等待购票。
7.根据客户提出的终点站名输出航线信息:
voidter()
{
structairline*info,*find();
charname[10];
inti=0;
info=start;
printf("请输入终点站名:
");
scanf("%s",name);
while(i<6)
{
if(!
strcmp(name,info->ter_name))break;
info++;
i++;
}
if(i>=6)
printf("对不起,该航线未找到!
\n");
else
{
printf("终点站名**航班号**飞机号**飞行日期**乘员定额**余票量**飞行时间**票价**起飞时间\n");
display(info);
}
}
该函数主要是为了让用户订票时,一目了然,票面情况。
8.订票和退票
voidorder()//订票
{
structairline*air_line;
intamount,grade;
charname[10];
air_line=start;
if(!
(air_line=find()))
exit(0);
printf("请输入你订票所需要的数量:
");
scanf("%d",&amount);
if(amount>air_line->tkt_amt)//若客户订票额超过乘员定票总额,退出
{
printf("\n对不起,您输入的票的数量已经超过乘员定额!
");
return;
}
elseif(amount<=air_line->seats)//若客户订票额末超过余票量,订票成功并等记信息
{
inti;
printf("请输入您的姓名(订票客户):
");
scanf("%s",name);
printf("请输入%s票的舱位等级:
",name);
scanf("%d",&grade);
printf("\n\n机票生成中\n\n");
air_line->order=insertlink(air_line->order,amount,name,grade);//在订票乘员名单域中添加客户信息
printf("姓名:
");
printf("%s\n",name);
printf("终点站:
");
printf("%s\n",air_line->ter_name);
printf("机票价格:
");
printf("%d\n",air_line->air_fare);
printf("飞行日期:
");
printf("%s\n",air_line->date);
printf("起飞时间:
");
printf("%s\n",air_line->take_off_time);
printf("您的座位号为:
");
for(i=0;iprintf("%5d",air_line->tkt_amt-air_line->seats+i);
printf("\n");
air_line->seats-=amount;//余票再减去订购的票
printf("\n祝您乘坐愉快!
\n");
}
else//若满员或余票额少于订票额,询问客户是否需要进行排队等候
{
charr;
printf("\n已经没有更多的票,您需要排队等候吗?
(Y/N)");
getchar();
scanf("%c",&r);
if(r=='Y'||r=='y')
{
printf("\n请输入您的姓名(排队订票客户):
");
scanf("%s",name);
air_line->wait=appendqueue(air_line->wait,name,amount);//在排队等候乘员名单域中添加客户信息
printf("\n注册成功!
\n");
}
else
printf("\n欢迎您下次再次订购!
\n");
}
}
voidreturn_tkt()//退票
{
structairline*info;
qnode*t,*back,*f,*r;
intgrade;
structclient_list*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->client_name))break;
p2=p1;p1=p1->next;
}
if(p1==NULL)
printf("对不起,你没有订过票!
\n");
else//若信息查询成功,删除订票客户名单域中的信息
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
info->seats+=p1->book_the_ticket_num;
grade=p1->grade;
printf("%s成功退票!
\n",p1->client_name);
free(p1);
}
info->order=head;//重新将航线名单域指向订票单链表的头指针
f=(info->wait).front;//f指向排队等候名单队列的头结点
r=(info->wait).rear;//r指向排队等候名单队列的尾结点
t=f;//t为当前满点条件的排队候补名单域
while(t)
{
if(info->seats=info->wait.front->req_amt)//若满足条件者为头结点
{
inti;
info->wait.front=t->next;
printf("%s订票成功!
\n",t->wait_name);
for(i=0;ireq_amt;i++)/*输出座位号*/
printf("%s的座位号是:
%d\n",t->wait_name,(info->seats)-i);
info->seats-=t->req_amt;
info->order=insertlink(info->order,t->req_amt,t->wait_name,grade);//插入到订票客户名单链表中
free(t);
break;
}
back=t;
t=t->next;
if((info->seats)>=(t->req_amt)&&t!
=NULL)//若满足条件者不为头结点
{
inti;
back->next=t->next;
printf("%s订票成功!
\n",t->wait_name);
for(i=0;ireq_amt;i++)/*输出座位号*/
printf("<%s>'sseatnumberis:
%d\n",t->wait_name,(info->seats)-i);
info->seats-=t->req_amt;
info->order=insertlink(info->order,t->req_amt,t->wait_name,grade);//插入到订票客户名单链表中
free(t);
break;
}
if(f==r)break;
}
}
该处是这个系统的核心部位,系统的其他部分全部为这两个部分服务。
9.按剩余票数排序:
voidsort_tkt()//按剩余票数排序
{
intj;
structairlinet,*info,*p,*q;
p=info=air;
for(p=info;(p+1)->seats;p++)
for(q=p+1;q->seats;q++)
{
if(p->seatsseats)
{
t=*p;
*p=*q;
*q=t;
}
}
printf("终点站名**航班号**飞机号**飞行日期**乘员定额**余票量**飞行时间**票价**起飞时间\n");
for(j=0;j<6;j++)
{
display(info);
info++;
}
}
10.
订票、退票、等待、以及余票排序的关系流程图
4.运行结果
1.菜单
2.浏览航线信息
3.查询航线信息
4.订票
5.排队等待
6.浏览已订票客户信息
7.退票
8.查看剩余票数并排序
5.总结
课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。
在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。
学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。
课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程。
通过制作航空客运订票系统,综合运用本专业所学课程的理论和实际知识进行一次实际训练,从而培养和提高我们独立工作能力,巩固了对数据结构等课程所学的内容,掌握怎么运用数据结构的有关知识来解决实际问题,同时各科相关的课程都有了全面的复习,独立思考的能力也有了提高。
在这次设计过程中,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。
致谢
在此感谢我的老师.;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪,这次课程设计的每个实验细节和每个数据,都离不开老师您的细心指导。
而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。
同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。
由于本人的设计能力有限,在设计过程中难免出现错误,恳请老师们多多指教,我十分乐意接受你们的批评与指正,本人将万分感谢。
参考文献
[1].郑莉等编著《C++语言程序设计(第四版)》北京:
清华大学出版社
[2].徐孝凯贺桂英编著《数据结构(C语言描述》北京:
清华大学出版社
[3].杨明广钟黔川编著《C程序设计教程》四川:
四川科学技术出版社
附录:
/*航空管理系统源代码*/
#include
#include
#include
structclient_list//客户名单
{
charclient_name[20];//客户姓名
intbook_the_ticket_num;//订票数量
intgrade;//舱位等级
structclient_list*next;
};
typedefstructwait_liat
{
charwait_name[20];
intreq_amt;
structwait_liat*next;
}qnode,*qptr;
structlinkqueue
{
qptrfront;//等候替补客户名单域的头指针
qptrrear;//等候替补客户名单域的属指针
};
structairline
{
charter_name[10];//终点站名
charflight[10];//航班号
charplane_num[10];//飞机号
chardate[7];//飞行日期(星期几)
inttkt_amt;//乘员定额
intseats;//余票量
chartime[15];//飞行时长
intair_fare;//机票价格
chartake_off_time[10];//起飞时间
structclient_list*order;//乘员名单域,指向乘员名单链表的头指针
structlinkqueuewait;//等候替补的客户名单域,分别指向排队等候名单队头队尾的指针
}lineinfo;
structairline*start;
structairlineair[6]={{"A","1111","001","周二",30,15,"24h",1520,"03:
06"},
{"B","2222","002","周三",40,10,"35h",1258,"14:
00"},
{"C","3333","003","周四",50,14,"32h",1469,"21:
10"},
{"D","4444","004","周五",60,58,"12.5h",2369,"09:
15"},
{"E","5555","005","周六",60,34,"23.5h",924,"12:
50"},
{"F","6666","006","周日",60,20,"40h",2460,"18:
30"}};
voiddisplay(structairline*info)//打印每条航线的基本信息
{
printf("%8s%3s%s%4s%6d%5d%8s%5d%s\n",
info->ter_name,info->flight,info->plane_num,info->date,info->tkt_amt,info->seats,info->time,info->air_fare,info->take_off_time);
}
voidlist()//打印全部航线信息
{
structairline*info;
inti=0;
info=start;
printf("终点站名**航班号**飞机号**飞行日期**乘员定额**余票量**飞行时间**票价**起飞时间\n");
while(i<6)
{
display(info);
info++;
i++;
}
printf("\n\n");
}
structlinkqueueappendqueue(st