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

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

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

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

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

数据结构课程设计报告

 

《数据结构》

课程设计报告

 

专业:

计算机科学与技术

班级:

计算机科学与技术一班

姓名:

XXXXXXX

学号:

XXXXXXXXXXXX

指导教师:

XXXXX

 

二零一零年十二月二十七日

 

目录

摘要2

第一章课程设计目的3

第二章设计过程3

2.1数据结构背景3

2.2程序设计6

2.2.1猴子选大王6

2.2.2josoph环8

2.2.3拓扑排序11

2.2.4纸牌游戏13

2.2.5哈弗曼树15

第三章总结17

参考文献19

 

摘要

一个数据结构是由数据元素依据某种逻辑联系组织起来的。

对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示;此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。

  在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。

许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。

许多时候,确定了数据结构后,算法就容易得到了。

有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。

不论哪种情况,选择合适的数据结构都是非常重要的。

选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。

这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。

数据结构包括数组、链表、栈、二又树、哈希表等等。

它是对在计算机内存(有时是磁盘)中的数据的一种安排。

算法:

用于对数据结构中的数据进行各种处理。

掌握了数据结构和算法后,能解决的问题:

现实世界数据存储、程序员的工具、建模:

有些数据结构能直接对真实世界的情况建造模型,其中最重要的数据结构是图。

关键词:

数据结构、数据元素、链表、算法

 

第一章课程设计目的

《数据结构》是一门实践性较强的软件基础课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。

本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。

根据课堂讲授内容,我们做相应的自主练习,消化课堂所讲解的内容;通过调试典型例题或习题积累调试C程序的经验;通过完成辅导教材中的编程题,逐渐培养学生的编程能力、用计算机解决实际问题的能力。

第二章设计过程

2.1数据结构背景

在计算机科学中,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象(数据元素)以及它们之间的关系和运算等的学科,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。

 “数据结构”作为一门独立的课程在国外是从1968年才开始设立的。

1968年美国唐·欧·克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。

“数据结构”在计算机科学中是一门综合性的专业基础课。

数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。

数据结构这一门课的内容不仅是一般程序设计(特别是非数值性程序设计)的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序的重要基础。

  计算机是一门研究用计算机进行信息表示和处理的科学。

这里面涉及到两个问题:

信息的表示,信息的处理。

  而信息的表示和组织又直接关系到处理信息的程序的效率。

随着计算机的普及,信息量的增加,信息范围的拓宽,使许多系统程序和应用程序的规模很大,结构又相当复杂。

因此,为了编写出一个“好”的程序,必须分析待处理的对象的特征及各对象之间存在的关系,这就是数据结构这门课所要研究的问题。

众所周知,计算机的程序是对信息进行加工处理。

在大多数情况下,这些信息并不是没有组织,信息(数据)之间往往具有重要的结构关系,这就是数据结构的内容。

数据的结构,直接影响算法的选择和效率。

  计算机解决一个具体问题时,大致需要经过下列几个步骤:

首先要从具体问题中抽象出一个适当的数学模型,然后设计一个解此数学模型的算法(Algorithm),最后编出程序、进行测试、调整直至得到最终解答。

寻求数学模型的实质是分析问题,从中提取操作的对象,并找出这些操作对象之间含有的关系,然后用数学的语言加以描述。

计算机算法与数据的结构密切相关,算法无不依附于具体的数据结构,数据结构直接关系到算法的选择和效率。

运算是由计算机来完成,这就要设计相应的插入、删除和修改的算法。

也就是说,数据结构还需要给出每种结构类型所定义的各种运算的算法。

  数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并由计算机程序处理的符号的总称。

  数据元素是数据的基本单位,在计算机程序中通常作为一个整体考虑。

一个数据元素由若干个数据项组成。

数据项是数据的不可分割的最小单位。

有两类数据元素:

一类是不可分割的原子型数据元素,如:

整数"5",字符"N"等;另一类是由多个款项构成的数据元素,其中每个款项被称为一个数据项。

例如描述一个学生的信息的数据元素可由下列6个数据项组成。

其中的出生日期又可以由三个数据项:

"年"、"月"和"日"组成,则称"出生日期"为组合项,而其它不可分割的数据项为原子项。

  关键字指的是能识别一个或多个数据元素的数据项。

若能起唯一识别作用,则称之为"主"关键字,否则称之为"次"关键字。

  数据对象是性质相同的数据元素的集合,是数据的一个子集。

数据对象可以是有限的,也可以是无限的。

数据处理是指对数据进行查找、插入、删除、合并、排序、统计以及简单计算等的操作过程。

在早期,计算机主要用于科学和工程计算,进入八十年代以后,计算机主要用于数据处理。

据有关统计资料表明,现在计算机用于数据处理的时间比例达到80%以上,随着时间的推移和计算机应用的进一步普及,计算机用于数据处理的时间比例必将进一步增大。

 数据结构是指同一数据元素类中各数据元素之间存在的关系。

数据结构分别为逻辑结构、存储结构和数据的运算。

数据的逻辑结构是对数据之间关系的描述,有时就把逻辑结构简称为数据结构。

逻辑结构形式地定义为(K,R)(或(D,S)),其中,K是数据元素的有限集,R是K上的关系的有限集。

  数据元素相互之间的关系称为结构。

有四类基本结构:

集合、线性结构、树形结构、图状结构(网状结构)。

树形结构和图形结构全称为非线性结构。

集合结构中的数据元素除了同属于一种类型外,别无其它关系。

线性结构中元素之间存在一对一关系,树形结构中元素之间存在一对多关系,图形结构中元素之间存在多对多关系。

在图形结构中每个结点的前驱结点数和后续结点数可以任意多个。

  数据结构在计算机中的表示(映像)称为数据的物理(存储)结构。

它包括数据元素的表示和关系的表示。

数据元素之间的关系有两种不同的表示方法:

顺序映象和非顺序映象,并由此得到两种不同的存储结构:

顺序存储结构和链式存储结构。

顺序存储方法:

它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现,由此得到的存储表示称为顺序存储结构。

顺序存储结构是一种最基本的存储表示方法,通常借助于程序设计语言中的数组来实现。

链接存储方法:

它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。

由此得到的存储表示称为链式存储结构,链式存储结构通常借助于程序设计语言中的指针类型来实现。

索引存储方法:

除建立存储结点信息外,还建立附加的索引表来标识结点的地址。

散列存储方法:

就是根据结点的关键字直接计算出该结点的存储地址。

数据结构中,逻辑上(逻辑结构:

数据元素之间的逻辑关系)可以把数据结构分成线性结构和非线性结构。

线性结构的顺序存储结构是一种随机存取的存储结构,线性表的链式存储结构是一种顺序存取的存储结构。

线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。

逻辑结构与数据元素本身的形式、内容、相对位置、所含结点个数都无关。

2.2程序设计

2.2.1猴子选大王

(1)需求分析

一堆猴子都有编号,编号是1,2,3...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。

(2)功能要求

输入数据:

输入m,nm,n为整数,n

输出形式:

中文提示按照m个猴子,数n个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能

(3)概要设计(流程图)

 

malloc()分配内存

For循环

指针移动查找

Count=n-1

 

If(Ptr2==ptr+n)

Ptr2=ptr;保证猴子围成圈

N

i++

Y

N

Y

N

Y

图2-1流程图

(4)调试结果演示

图2-2猴子选大王

2.2.2josoph环

(1)需求分析

编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。

一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。

报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。

设计一个程序来求出出列顺序。

(2)功能要求:

利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。

(3)概要设计

为实现上述程序功能,应以有序链表表示集合。

带头结点的线性表类型定义如下:

typedefstructLnode{//节点类型

ElemTypedata;

StructLnode*next;

}*Link,*Position;

typedefstruct{//链表类型

Linkhead,tail;//分别指向线性链表中的头结点和最后一个结点

Intlen;//只是线性链表中的数据元素

}LinkList;

StatusMakeNode(Link&p,ElemTypee);

//分配由p指向的值为e的结点,并返回OK;若分配失败,则返回ERROR

voidFreeNode(Link&p);

//释放p所指接点

StatusInitList(LinkList&L);

//构造一个空的线性表L

StatusDestroyList(LinkList&L);

//销毁线性表L,L不再存在

StatusClearList(LinkList&L);

//将线性表L从之唯恐表,并释放原链表的结点空间

StatusInsFirst(Linkh,Links);

//已知h指向线性链表的头结点,将s所直接点插入在第一个结点之前

StatusDelFirst(Linkh,Link&q);

//已知h指向线性表的头结点,删除链表中的第一个结点并以q返回

StatusAppend(LinkList&L,Links);

//将指针s所指(彼此以指针项链)的一串结点链接在线性链表L的最后一个结点

//之后,并改变链表L的尾指针指向新的尾节点

StatusRemove(LinkList&L,Link&q);

//删除线性链表L中的尾结点并以q返回,改变链表L的尾指针只想新的尾结点

StatusInsBefore(LinkLIst&L,Link&p,Links);

//已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之前,

//并修改指针p指向新插入的结点

StatusInsAfter(LinkLIst&L,Link&p,Links);

//已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之后,

//并修改指针p指向新插入的结点

StatusSetCurElem(Link&p,ElemTypee);

//已知p指向线性链表中的一个结点,用e更新p所指结点中的数据元素的值

ElemTypeGetCurElem(Linkp);

//已知p指向线性链表中的一个结点,返回p所指结点中数据元素的值

StatuslistEmpty(LinkListL);

//若线性链表L为空表,则返回TRUE,否则返回FALSE

intListLength(LinkListL);

//返回线性链表L中元素个数

PositionGetHead(LinkListL);

//返回线性链表L中头结点的位置

PositionGetLast(LinkListL);

//返回线性链表L中最后一个结点的位置

PositionPriorPos(LinkListL,Linkp);

//已知p指向线性链表L中的一个结点,返回p所指结点的直接前驱的位置‘

//若无前驱,则返回NULL

PositionNextPos(LinkListL,Linkp);

//已知p指向线性链表L中的一个结点,返回p所指结点的直接后继的位置‘

//若无后继,则返回NULL

StatusLocatePos(LinkListL,intI,Link&p);

//返回p指示线性链表L中的第I个节点的位置并返回OK,i值不合法时返回ERROR

PositionLocateElem(LinkListL,ElemTypee,Status(*compare)(ElemType,ElemType));

//返回线性链表L中的第1个与e满足函数compare()判定关系的元素的位置,

//若不存在这样的元素,则返回NULL

StatusListTraverse(LinkListL,status(*visit)());

//依次对L的每个元素调用函数visit()。

一旦visit()失败,则操作失败

(4)调试结果演示

图2-3josoph环

2.2.3拓扑排序

(1)需求分析

任务:

编写函数实现图的拓扑排序。

(2)功能要求

能够求有向图的拓扑排序。

通过输入有向图的结点的个数以及边数,并输入各个边,可以求出该图的拓扑排序,而且可以输出结果。

(3)概要设计

数据关系:

VR={|v,w∈V且P(v,w),表示从v到w的弧。

谓词P(v,w)定义了弧

基本操作:

typedefstructArcNode//图的邻接表表结点定义

typedefstructVNode//表头结点

typedefstruct//图的结构定义

intLocalVex(MGraphG,charv)//若G中存在顶点v,则返回该顶点在图中的位置;否则返回其他

信息

初始条件:

图G存在,v和G中顶点有相同特征。

操作结果:

若G中存在顶点v,则返回该顶点在图中的位置

intCreateDG(MGraph&G)

初始条件:

图G存在。

操作结果:

建立AOV网图

voidFindInDegree(MGraphG,intindegree[])

初始条件:

图G存在。

操作结果:

得到各顶点入度,存储在indegree[];

voidTopologicalSort(MGraphG)//对图进行拓扑排序

初始条件:

图G存在。

操作结果:

对图G进行拓扑排序。

 

(4)调试结果演示

图2-4拓扑排序

2.2.4纸牌游戏

(1)需求分析

编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后…从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的直到以52为基数的翻过,输出:

这时正面向上的牌有哪些?

(2)功能要求

能够自动将52张牌编号,并能对正面向上的牌进行标记,以示区别。

最后能够求出正面向上的牌的个数,以及正面向上牌的序号。

(3)概要设计

需要为每张牌设置一个标志位,标志它是正面或是反面。

故设立一个一维数组并赋初值为1,表示所有的牌现在都正面朝上(-1表示该牌反面朝上);

使用一个嵌套的for循环依次翻牌(当基数从2变到52);

最后再使用一个for循环输出所有正面朝上的牌。

图2-5概要设计图

 

(4)调试结果演示

图2-6纸牌

2.2.5哈弗曼树

(1)需求分析

建立函数输入二叉树,并输出其赫夫曼树

(2)功能要求

给定各个结点及其权值,能够构建一颗最优二叉树,求出各个结点到树根的路径长度,最后求出总的权值。

(3)概要设计

图2-7设计图

(4)调试结果演示

图2-8哈弗曼树

第三章总结

在课程设计中,首先要看清问题,将问题要求理解透彻,在构思要如何实现,要用到哪些函数,要用什么算法,在课程构思中选算法是一个很重要的概念,只有确定用这么算法后才能接下来的工作,将流程图画在纸上,再依次编写代码,在程序设计中,编写代码只是一个方面,调试才是关键。

它是一个相当繁琐的过程,有许多新的问题需要被解决,但同时它也是一个比较重要的过程,因为在程序调试过程中,你会学到很多新的东西,从而增加你编程的经验。

通过本次实习,温固了数据结构的相关知识,加深对课内所学的有关数据的逻辑结构和存储表示、数据结构的选择和应用、算法的设计和时空效率分析等课程基本内容的理解,进一步熟悉了VC++编程环境,巩固并提高了分析问题、解决实际问题的能力。

从理论到实践,在整整一个多月的日子里,我学到很多很多的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的内容。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才是真正的知识,才能提高自己的实际动手能力和独立思考的能力。

在设计的过程遇到了各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计,把以前所学过的知识重新温故,巩固了所学的知识。

任何一件事情都需要一个过程,在这个过程中,面对许多问题,我们尽最大的努力寻找解决方法,现学现用新的知识,不断积累经验,为未来的发展打下基础。

我们是在学习,但是我们真正要学的是学习的能力,我们享受这个过程,因为它引领我们进步!

 

参考文献

数据结构(C语言版)严蔚敏吴伟民编著清华大学出版社

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

当前位置:首页 > 小学教育 > 语文

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

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