+数据结构课程设计报告+.docx

上传人:b****5 文档编号:11639327 上传时间:2023-03-29 格式:DOCX 页数:53 大小:106.82KB
下载 相关 举报
+数据结构课程设计报告+.docx_第1页
第1页 / 共53页
+数据结构课程设计报告+.docx_第2页
第2页 / 共53页
+数据结构课程设计报告+.docx_第3页
第3页 / 共53页
+数据结构课程设计报告+.docx_第4页
第4页 / 共53页
+数据结构课程设计报告+.docx_第5页
第5页 / 共53页
点击查看更多>>
下载资源
资源描述

+数据结构课程设计报告+.docx

《+数据结构课程设计报告+.docx》由会员分享,可在线阅读,更多相关《+数据结构课程设计报告+.docx(53页珍藏版)》请在冰豆网上搜索。

+数据结构课程设计报告+.docx

+数据结构课程设计报告+

封面

作者:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1