+数据结构课程设计报告+.docx
《+数据结构课程设计报告+.docx》由会员分享,可在线阅读,更多相关《+数据结构课程设计报告+.docx(53页珍藏版)》请在冰豆网上搜索。
+数据结构课程设计报告+
封面
作者:
PanHongliang
仅供个人学习
数据结构课程设计
题目:
赫夫曼树的建立
运动会分数统计
订票系统
猴子选大王
姓 名:
**
学 号:
****
专 业:
***
指导教师:
****
一:
绪言………………………………………………............3
1.1课题设计背景…………………………………..........3
1.2课题研究的目的和意义…………………………….3.
1.3课题研究的内容……………………………………..4
二:
具体程序设计……………………………………………62.1赫夫曼树的建立……………………………………………6
2.2运动会设计………………………………………………..8
2.3订票系统………………………………………………….12
2.4猴子选大王……………………………………………….15
三:
总结与展望………………………………………………………15
四:
参考文献…………………………………………………………15
附:
程序源代码
.
1.绪言
1.1课题背景
《数据结构》作为一门独立的课程最早是美国的一些大学开设的,1968年美国唐·欧·克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作.从60年代末到70年代初,出现了大型程序,软件也相对独立,结构程序设计成为程序设计方法学的主要内容,人们就越来越重视数据结构,认为程序设计的实质是对确定的问题选择一种好的结构,加上设计一种好的算法.从70年代中期到80年代初,各种版本的数据结构著作就相继出现.
目前在我国,《数据结构》也已经不仅仅是计算机专业的教学计划中的核心课程之一,而且是其它非计算机专业的主要选修课程之一.
《数据结构》在计算机科学中是一门综合性的专业基础课.数据结构的研究不仅涉及到计算机硬件(特别是编码理论、存储装置和存取方法等)的研究范围,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题.在研究信息检索时也必须考虑如何组织数据,以便查找和存取数据元素更为方便.因此,可以认为数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程,在计算机科学中,数据结构不仅是一般程序设计(特别是非数值计算的程序设计)的基础,而且是设计和实现编译程序、操作系统、数据系统及其它系统程序和大型应用程序的重要基础. 值得注意的是,数据结构的发展并未终结,一方面,面向各专门领域中特殊问题的数据结构得到研究和发展,如多维图形数据结构等;另一方面,从抽象数据类型的观点来论数据结构,已成为一种新的趋势,越来越被人们所重视.
1.2课题研究的目的和意义
通过对此次数据结构大型作业内容的实际操作及分析,加深对数据结构丰富功能的理解及增强实际动手能力,在实践中不断提高对汇编语言的运用能力.锻炼学生分析与编写大型软件代码的能力.通过与同组同学的合作,锻炼协作的能力.
二:
具体程序设计
2.1赫夫曼树的建立
1.任务:
建立建立最优二叉树函数
2.要求:
可以建立函数输入二叉树,并输出其赫夫曼树
3.概要设计
程序流程图如下:
4.调试分析
运行时显示:
输入abcde时:
输入110时:
这时按任意键则返回编辑窗口
2.2运动会分数统计
1.任务:
参加运动会有n个学校,学校编号为1……n.比赛分成m个男子项目,和w个女子项目.项目编号为男子1……m,女子m+1……m+w.不同的项目取前五名或前三名积分;取前五名的积分分别为:
7、5、3、2、1,前三名的积分分别为:
5、3、2;哪些取前五名或前三名由学生自己设定.(m<=20,n<=20).
2.功能要求:
1).可以输入各个项目的前三名或前五名的成绩; 2).能统计各学校总分, 3).可以按学校编号、学校总分、男女团体总分排序输出;4).可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校.
3.规定:
输入数据形式和范围:
20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称)
4.抽象数据类型结构体数组的定义如下:
#defineM6/*6个男子项目*/
#defineW4/*4个女子项目*/
#defineN10
typedefstruct{
intman[5+1];/*排名,此数组中存放学校代码*/
intwomen[3+1];
charIname[M+W+1];/*项目名称*/
}Item;/*项目代码,M的为女子*/
typedefstruct{
intscoreT;/*学校总分*/
intscoreM;/*男子总分*/
intscoreW;/*女子总分*/
intman[M+1];/*男子项目*/
intwomen[W+1];/*女子项目*/
intflag;/*排序用旗帜*/
}School;
ItemiteM[M+W+1];/*M+W个项目*/
Schoolsch[N+1];/*n个学校,0不用*/
charname[N+1][100];
voidInput()//输入函数
voidInitial()//初始化函数
voidSchool_F()//按学校代码查询函数
voidItem_F()//运动项目查询函数
voidFind()//查询菜单函数
voidOrder_ST()//总分排序函数
voidOrder_SM()//男子总分排序函数
voidOrder_SW()//女子总分排序函数
voidFind_O()//排序菜单函数
voidOutput()//输出到文件函数
void
5.本程序包括5个模块
a.主程序模块:
Voidmain()
{Do
{接受命令;
处理命令;
}while(“命令”=退出);
}
b.信息输入模块——实现信息的输入;
c.信息查询模块——实现信息的查询;
d.信息排序查询模块——实现各种的有序输出;
e.信息存盘模块——实现输出到文件.
各模块的关系如下:
主程序模块——信息输入模块——信息查询——信息排序查询模块—信息存盘模块.
6.流程图
主函数
欢迎界面
选择功能scanf("%d",&a)
If(i=1)
If(i=2)
If(i=3)
成绩输入
查询
排序查询
成绩输入
选择功能
For(i=1;i<=N;i++)项目个数
输入项目代码及名称
输入男子项目前五名
输入女子项目前三名
查询
Scanf(“%d”,&a);
T=1
t=2
T=3
按学校代码
按项目编号
返回上一级菜单
排序查询
选择功能
Scanf(“%d”,&a);
选canf(“%d”,&a);
a=1
a=2
按学校总分查询
按男团总分查询
7.调试分析
a.本程序在项目上采用了数字代码操作,并且能同步输入输出项目名和学校名.实现方法为在学校结构体内增加字符数组用来存储学校的名称.缺点就是没有考虑有一个学生参加两项比赛的情况,这就要再次增加循环参加比赛的数目.
b.算法的时空分析
(1)本程序时间复杂度为N*N主要集中在按积分排序的过程,在排序时采用了冒泡排序,而且在交换数据时也较大地耗费内存,至今未能解决..
(2)另外一点在于项目查询时,会增加时间复杂度,为了减少时间复杂度,我把按项目查找分为按女子和按男子查找,这样在查询项目时可先判断是男子项目还是女子项目,再查找,这样就减少时间复杂度.
(3)在空间复杂度方面,本程序几乎没有用到辅助空间,只是未用到所有的数组,会浪费一些存储空间.
8.测试结果
这是在学校个数为1,项目数为2(包括一个男子项目一个女子项目)时的输出文件情况:
1a学校
总分:
7,男子总分:
7,女子总分:
0
2b学校
总分:
7,男子总分:
5,女子总分:
2
3c学校
总分:
6,男子总分:
3,女子总分:
8
4d学校
总分:
2,男子总分:
2,女子总分:
8
5e学校
总分:
6,男子总分:
1,女子总分:
5
6学校
总分:
0,男子总分:
0,女子总分:
8
7学校
总分:
0,男子总分:
0,女子总分:
0
8学校
总分:
0,男子总分:
0,女子总分:
0
9学校
总分:
0,男子总分:
0,女子总分:
0
10学校
总分:
0,男子总分:
0,女子总分:
0
男子项目1排名:
第1名:
1第2名:
2第3名:
3第4名:
4第5名:
5
男子项目2排名:
第1名:
0第2名:
0第3名:
0第4名:
0第5名:
0
男子项目3排名:
第1名:
0第2名:
0第3名:
0第4名:
0第5名:
0
男子项目4排名:
第1名:
0第2名:
0第3名:
0第4名:
0第5名:
0
男子项目5排名:
第1名:
0第2名:
0第3名:
0第4名:
0第5名:
0
男子项目6排名:
第1名:
0第2名:
0第3名:
0第4名:
0第5名:
0
女子项目7排名:
第1名:
0第2名:
0第3名:
0
女子项目8排名:
第1名:
5第2名:
3第3名:
2
女子项目9排名:
第1名:
0第2名:
0第3名:
0
女子项目10排名:
第1名:
0第2名:
0第3名:
0
2.3订票系统
1.任务:
通过此系统可以实现如下功能:
a.录入:
可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)
b.查询:
可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);
可以输入起飞抵达城市,查询飞机航班情况;
c.订票:
(订票情况可以存在一个数据文件中,结构自己设定)
可以订票,如果该航班已经无票,可以提供相关可选择航班;
d.退票:
可退票,退票后修改相关数据文件;
客户资料有姓名,证件号,订票数量及航班情况,订单要有编号.
修改航班信息:
当航班信息改变可以修改航班数据文件
2.要求:
根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能;
3.具体概要设计
a.抽象类型定义如下
structFlaight{
charflaNum[10];/*航班号*/
charfTime[10];/*起飞时间*/
charlTime[10];/*降落时间?
*/
charfCity[30];/*起飞城市*/
charlCity[30];/*降落城市*/
intfprice;/*票价*/
charpriOf[10];/*折扣*/
intseat;/*座位数*/
structFlaight*next;
};
structCustom/*客户资料*/
{charCname[30];/*客户姓名*/
charID[30];/*证件号*/
intTicketN;/*订票数量*/
charFlaN[10];/*航班号*/
charListN[60];/*订单编号*/
structCustom*next;
};
structFlaight*head1=NULL;
structCustom*head2=NULL;
b.本程序包含三个模块
(1)主程序模块:
Voidmain()
{
do{
接受命令;
处理命令;
}while(命令!
=退出);
}
(2)信息输入模块——完成基本信息的输入
(3)实现功能模块——实现各种功能操作
(4)读写文件模块——实现文件建立和读写
4.流程图
主函数模块
Menu菜单
Case1
Case2
Case3
Case4
Case5
Case6
订票
查询
修改
存盘
文件读入
显示信息
查询航班信息
printf("xxxx航班-->:
");
输入航班号;
for(p1=head1->next;p1->next!
=NULL;p1=p1->next)
if(p1!
=NULL)
输出所查询航班的信息
航班信息修改模块
while()
{p1=p1->next;}
print("请选择功能:
");输入功能号
Cas1
Cas2
Cas3
Case4
Case5
Case6
Case7
Case8
起飞时间
抵达时间
起飞地
目的地
票价
折扣
总座位数
跳出
5.调试分析
原始信息:
航班:
ca112:
5013:
10长沙广州1340.310ca215:
4501:
50南京香港2140.43
ca319:
2104:
31长沙广州4310.85ca401:
3007:
04重庆长春3100.76
ca502:
0810:
56上海汉城1260.410ca620:
1822:
47东京纽约9870.976
ca1014:
0123:
59重庆长春8750.812ca1105:
0922:
12南京香港4220.343
ca1212:
0416:
54东京纽约9860.632
客户:
rayxy32ca1rayxy3samgh43ca3samgh4Andybo51ca4Andybo5
姚明Rockets10ca10姚明RocketsKobeLakers6ca5KobeLakers
曼联英格兰10ca12曼联英格兰
运行后:
航班:
ca1125013:
10长沙广州1340.36ca215:
4501:
50南京香港2140.43
ca319:
2104:
31长沙广州4310.85ca134e01:
3007:
04重庆长春3100.76
ca502:
0810:
56上海汉城1260.410ca620:
1822:
47东京纽约3450.976
ca1014:
0123:
59重庆长春8750.80ca1105:
0922:
12南京香港4220.343
ca1212:
0416:
54东京纽约9860.632
客户:
rayxy32ca1rayxy3samgh43ca3samgh4Andybo51ca4Andybo5姚明Rockets10ca10姚明RocketsKobeLakers6ca5KobeLakers曼联英格兰10ca12曼联英格兰
2.4猴子选大王
1.任务:
一堆猴子都有编号,编号是1,2,3...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王.
2.要求:
输入数据:
输入m,n为整数,n输出形式:
中文提示按照m个猴子,数n个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能
3.概要设计:
基本思路是以链表顺序储存猴子的信息,利用计数器完成操作,最后打印出是第几个猴子
存储结构:
循环链表
定义:
表中最后一个结点的指针指向第一个结点
4.调试分析
运行时显示:
输入10时:
这时再输入5:
这时按任意键则返回编辑窗口
3.总结与展望
通过为期半个月的课程设计,我们对《数据结构》这门课程有了更深一步的了解.它是计算机程序设计的重要理论技术基础,在我们计算机专业的学习中占据着十分重要的地位.同时也使我们知道,要学好这门课程,仅学习书本上的知识是不够的,还要有较强的实践能力.因为我们学习知识就是为了实践.而只有多实践,多编写程序,才能更好的理解与掌握书本上的东西.
这次课程设计也让我们明白拉“团结就是力量”的魅力.大家一起合作,一起讨论、一起研究,充分发挥团队精神,各尽其责,按时,按进度完成各自的任务,是我们能够把这个程序按时做出来的关键!
在我们组员的通力合作下,我们按照制定的计划,终于顺利地完成了这个程序.这使得我们相信:
无论是在以后的学习还是生活中,只要我们充分发挥团队合作的精神,一定可以克服种种困难,争取更大的成功!
本次设计我们也首次使用拉WIN-TC进行编译,摆脱拉TC环境下编译的弊端,WIN-TC的编译使我们的本次课程设计更加美观.但是也有不如意的地方,做的不好的地方,望老师谅解,我们会在以后的学习、设计中努力改进,做得更加完美.
4.参考文选
[1]严蔚敏,吴伟民编著,数据结构(C语言版),北京;清华大学出版社,2005
[2]严蔚敏,陈文博编著,数据结构及应用算法教程,北京;清华大学出版社,2006
[3]李云清,杨庆红,揭安全编著,数据结构(C语言版),北京;人民邮电出版社,2006
[4]谭浩强编著,C语言程序设计(第二版),北京;清华大学出版社,2003
[5]各大网站
附:
程序源代码
.
1.赫夫曼树的建立
#include
#include
#defineMAXLEN100
typedefstructHuffmantree{
charch;/*键值*/
intweight,mark;/*weight为权值,mark为标志域*/
structHuffmantree*parent,*lchild,*rchild,*next;
}Hftree,*linktree;
/*整理输入的字符串,合并相同的项,并求出每个字符在数组中出现的次数*/
linktreetidycharacter(charcharacter[])
{
inti=0;
linktreetree,ptr,beforeptr,node;/*链式,tree为头结点,beforeptr为ptr的前一结点,node为新申请
的结点*/
tree=(linktree)malloc(sizeof(Hftree));/*创建单链表的头结点*/
if(!
tree)returnNULL;
tree->next=NULL;/*头结点为空,且后续结点为空*/
for(i=0;character[i]!
='\0'&&character[i]!
='\n';i++){/*遍历直到字符串结束为止*/
ptr=tree;
beforeptr=tree;
node=(linktree)malloc(sizeof(Hftree));/*新申请结点node*/
if(!
node)returnNULL;
node->next=NULL;
node->parent=NULL;
node->lchild=NULL;
node->rchild=NULL;/*置空*/
node->mark=0;
node->ch=character[i];
node->weight=1;
if(tree->next==NULL)
tree->next=node;/*头结点的下一结点为空,连接node*/
else{
ptr=tree->next;
while(ptr&&ptr->ch!
=node->ch){/*将指针移至链表尾*/
ptr=ptr->next;
beforeptr=beforeptr->next;/*后移*/
}
if(ptr&&ptr->ch==node->ch){/*如果链表中某结点的字符与新结点的字符相同*/
/*将该结点的权加一*/
ptr->weight=ptr->weight+1;
free(node);/*释放node结点的存储空间*/
}
else{/*新结点与表中结点不相同,将新结点插入链表后*/
node->next=beforeptr->next;
beforeptr->next=node;/*node连接在beforeptr之后*/
}
}
}
returntree;
}
/*将整理完的字符串按出现次数从小到大的顺序排列*/
linktreetaxisnode(linktreetree)
{
linktreehead,ph,pt,beforeph;/*head为新链表的表头结点*/
head=(linktree)malloc(sizeof(Hftree));/*创建新链表的头结点*/
if(!
head)returnNULL;
head->next=NULL;/*新结点的头结点为空,后续结点也为空*/
ph=head;
beforeph=head;
while(tree->next){
pt=tree->next;/*取被操作链表的首元结点*/
tree->next=pt->next;
pt->next=NULL;/*取出pt所指向的结点*/
ph=head->next;
beforeph=head;
if(head->next==NULL)
head->next=pt;/*创建当前操作链表首元结点*/
else{
while(ph&&ph->weightweight){/*将被操作结点插入相应位置*/
ph=ph->next;
beforeph=beforeph->next;
}
pt->next=beforeph->next;
beforeph->next=pt;
}
}
free(tree);
returnhead;
}
/*用排完序的字符串建立霍夫曼树*/
linktreecreateHftree(linktreetree)
{
linktreep,q,newnode,beforep;
for(p=tree->next,q=p->next;p!
=NULL&&q!
=NULL;p=tree->next,q=p->next){
tree->next=q->next;
q->next=NULL;
p->next=NULL;
newnode=(linktree)malloc(sizeof(Hftree));/*申请新结点作为霍夫曼树的中间结点*/
if(!
newnode)returnNULL;
newnode->next=NULL;
newnode->mark=0;
newnode->lchil