搜档网
当前位置:搜档网 › 学习数据结构心得体会

学习数据结构心得体会

学习数据结构心得体会

【篇一:数据结构学习总结】

数据结构学习总结

通过一学期对《数据结构与算法》的学习,大概的了解了基本的数

据结构和相应的一些算法。下面总结一下自己一个学期学习的收获

和心得。数据结构是什么:

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间

存在一种或多种特定关系的数据元素的集合。通常情况下,精心选

择的数据结构可以带来更高的运行或者存储效率。数据结构往往同

高效的检索算法和索引技术有关。数据结构重要性:

一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须

在计算机内存储,数据的存储结构是数据结构的实现形式,是其在

计算机内的表示;此外讨论一个数据结构必须同时讨论在该类数据

上执行的运算才有意义。一个逻辑数据结构可以有多种存储结构,

且各种存储结构影响数据处理的效率。在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造

经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于

是否选择了最优的数据结构。许多时候,确定了数据结构后,算法

就容易得到了。有些时候事情也会反过来,我们根据特定算法来选

择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非

常重要的。选择了数据结构,算法也随之确定,是数据而不是算法

是系统构造的关键因素。这种洞见导致了许多种软件设计方法和程

序设计语言的出现,面向对象的程序设计语言就是其中之一。

常见的数据结构:

1. 顺序表:

定义:顺序表是在计算机内存中以数组的形式保存的线性表,是指用

一组地址连续的存储单元依次存储数据元素的线性结构。线性表采

用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依

次存放在计算机内存中一组地址连续的存储单元中。

基本运算:

置表空:sqlsetnull(l)判表满:sqlempty(l)

求表长:sqllength(l)插入:sqlinsert(l,i,x)按序号取元素:sqlget(l,i)删除:sqldelete(l,i)

按值查找:sqllocate(l,x)

2. 链表

定义:链表是一种物理存储单元上非连续、非顺序的存储结构,数

据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一

系列结点(链表中每一个元素称为结点)组成,结点可以在运行时

动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相比于线性表顺序结构,

链表比较方便插入和删除操作。分类:单链表—用一组地址任意的

存储单元存放线性表中的数据元素。

循环链表—循环链表是另一种形式的链式存贮结构。它的特点是表

中最后一个结点的指针域指向头结点,整个链表形成一个环。

基本运算:建立链表,插入节点,删除节点。

3. 堆栈

定义:堆栈都是一种数据项按序排列的数据结构,只能在一端(称为

栈顶(top))对数据项进行插入和删除。要点:堆:顺序随意栈:后进

先出(last-in/first-out)。

基本算法:

置空栈:initstack(s)判栈空:stackempty(s)

判栈满:stackfull(s)取栈顶元素:gettop(s)

入栈:push(s)出栈:pop(s)

4. 队列

定义:队列是一种特殊的线性表,它只允许在表的前端(front)进

行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称

为空队列。在队列这种数据结构中,最先插入的元素将是最先被删

除的元素;反之最后插入的元素将最后被删除的元素,因此队列又

称为“先进先出”(fifo—first in first out)的线性表。

分类:顺序队列;链队;

基本运算:初始化队列 qini (q)入队 qadd(q,x)

出队 qdel(q,x)判断队列是否为qempty(q)

判断队列是否为满qfull(q)

5. 特殊矩阵

分类:对阵矩阵;三角矩阵;稀疏矩阵;

6. 二叉树

定义:二叉树是每个节点最多有两个子树的有序树。通常子树被称

作“左子树”(left subtree)和“右子树”(right subtree)。二叉树

的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子

树有左右之分,次序不能颠倒。二叉树的第i层至多有2的 i -1次方

个结点;深度为k的二叉树至多有2^(k) -1个结点;对任何一棵二

叉树t,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为

n2,则n0 = n2 + 1。

(1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层(1~h-1) 的结点数都达到最大个数,第 h 层有叶子节点,并且叶子

节点都是从左到右依次排布,这就是完全二叉树。

(2)满二叉树——除了叶结点外每一个结点都有左右子叶且叶结点都

处在最底层的二叉树,。

(3)深度——二叉树的层数,就是高度。

性质:

(1) 在二叉树中,第i层的结点总数不超过2^(i-1);

(2) 深度为h的二叉树最多有2^h-1个结点(h=1),最少有h个结点;

(3) 对于任意一棵二叉树,如果其叶结点数为n0,而度数为2的结

点总数为n2,则n0=n2+1;

(4) 具有n个结点的完全二叉树的深度为int(log2n)+1

(5)有n个结点的完全二叉树各结点如果用顺序方式存储,则结点之

间有如下关系:若i为结点编号则如果i1,则其父结点的编号为i/2;如果2*i=n,则其左儿子(即左子树的根结点)的编号为2*i;若

2*in,则无左

儿子;如果2*i+1=n,则其右儿子的结点编号为2*i+1;若2*i+1n,

则无右儿子。

(6)给定n个节点,能构成h(n)种不同的二叉树。h(n)为卡特兰数的

第n项。h(n)=c(n,2*n)/(n+1)。

(7)设有i个枝点,i为所有枝点的道路长度总和,j为叶的道路长

度总和j=i+2i。

二叉树遍历:

遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的

规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,

而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实

质上是将二叉树的各个结点转换成为一个线性序列来表示。

设l、d、r分别表示遍历左子树、访问根结点和遍历右子树,则对

一棵二叉树的遍历有三种情况:dlr(称为先根次序遍历),ldr(称

为中根次序遍历),lrd (称为后根次序遍历)。

(1)前序遍历访问根;按前序遍历左子树;按前序遍历右子树

(2)中序遍历按中序遍历左子树;访问根;按中序遍历右子树

(3)后序遍历按后序遍历左子树;按后序遍历右子树;访问根

(4)层次遍历即按照层次访问,通常用队列来做。访问根,访问

子女,再访问子女的子女(越往后的层次越低)(两个子女的级别

相同)。

7. 散列

定义:若结构中存在和关键字k相等的记录,则必定在f(k)的存储

位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f

为散列函数(hash function),按这个思想建立的表为散列表。

散列函数:直接定址法;除留余数法;数字分析法;平方取中法;

折叠法。冲突处理方法:开放地址法(线性探测再散列,二次探测

再散列,伪随机探测再散列)链地址法。

8. 图

定义:一种较线性表和树更为复杂的数据结构。存储结构:邻接矩阵;邻接表;逆邻接表;十字链表;邻接多重表。图的遍历:

深度优先遍历:深度优先遍历的思想类似于树的先序遍历。其遍历

过程可以描述为:从图中某个顶点v出发,访问该顶点,然后依次

从v的未被访问的邻接点出发继续深度优先遍历图中的其余顶点,

直至图中所有与v有路径相通的顶点都被访问完为止。

广度优先遍历:对图的广度优先遍历方法描述为:从图中某个顶点

v出发,在访问该顶点v之后,依次访问v的所有未被访问过的邻接点,然后再访问每个邻接点的邻接点,且访问顺序应保持先被访问

的顶点其邻接点也优先被访问,直到图中的所有顶点都被访问为止。下面是对一个无向图进行广度优先遍历的过程。

查找算法

1. 顺序查找:在一个已知无(或有序)序队列中找出与给定关键字相

同的数的具体位置。原理是让关键字与队列中的数从第一个开始逐

个比较,直到找出与给定关键字相同的数为止。

2. 折半查找:首先,假设表中元素是按升序排列,将表中间位置记

录的关键字与查找关键字比较,如果两者相等,则查找成功;否则

利用中间位

置记录将表分成前、后两个子表,如果中间位置记录的关键字大于

查找关键字,则进一步查找前一子表,否则进一步查找后一子表。

重复以上过程,直到找到满足条件的记录,使查找成功,或直到子

表不存在为止,此时查找不成功。

3. 分块查找:先选取各块中的最大关键字构成一个索引表;查找分

两个部

分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一

块中;然后,在已确定的块中用顺序法进行查找。

4. 二叉排序树:

定义:二叉排序树(binary sort tree)又称二叉查找树。它或者是

一棵空树;或者是具有下列性质的二叉树:(1)若左子树不空,则

左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)左、右子树

也分别为二叉排序树;

查找:若根结点的关键字值等于查找的关键字,成功。否则,若小

于根结点的关键字值,递归查左子树。若大于根结点的关键字值,

递归查右子树。若子树为空,查找不成功。

排序算法:

1. 直接插入排序:插入排序的基本操作就是将一个数据插入到已经

排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算

法适用于少量数据的排序,时间复杂度为o(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数

组的所有元素,但将最后一个元素除外,而第二部分就只包含这一

个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有

序的第一部分里的位置。

2. 希尔排序:先取一个小于n的整数d1作为第一个增量,把文件

的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个

组中。先在各组内进行直接插入排序;然后,取第二个增量d2d1重

复上述的分组和排序,直至所取的增量dt=1(dtdt-l?d2d1),即所有

记录放在同一组中进行直接插入排序为止。

这两部分数据分别进行快速排序,整个排序过程可以递归进行,以

此达到整个数据变成有序序列。

5. 直接选择排序:第一次从r[0]~r[n-1]中选取最小值,与r[0]交换,第二次从r{1}~r[n-1]中选取最小值,与r[1]交换,....第i次从r[i-

1]~r[n-1]中选取最小值,与r[i-1]交换.....第n-1次从r[n-2]~r[n-1]中

选取最小值,与r[n-2]交换,总共通过n-1次,得到一个按排序码从小

到大排列的有序序列。

6. 归并排序:申请空间,使其大小为两个已经排序序列之和,该空

间用来存放合并后的序列;设定两个指针,最初位置分别为两个已

经排序序列的起始位置;比较两个指针所指向的元素,选择相对小

的元素放入到合并空间,并移动指针到下一位置;重复直到某一指

针达到序列尾;另一序列剩下的所有元素直接复制到合并序列尾。

心得:无论我们学习什么课程,概念永远是基础,所有的知识都是

建立在基础概念之上的。我们要将概念熟记于心,然后构建知识框架。数据结构包括线性结构、树形结构、图状结构或网状结构。线

性结构包括线性表、栈、队列、串、数组、广义表等,栈和队列是

操作受限的线性表,串的数据对象约束为字符集,数组和广义表是

对线性表的扩展:表中的数据元素本身也是一个数据结构。除了线

性表以外,栈是重点,因为栈和递归紧密相连,递归是程序设计中

很重要的一种工具。树状结构中的重点自然是二叉树和哈弗曼树了。对于二叉树的很多操作都是基于对二叉树的遍历,掌握了如何遍历,很多问题也就迎刃而解了,比如对二叉树结点的查找访问、统计二

叉树中叶子结点的数目、求二叉树的深度等。哈弗曼编码也有着很

广泛的应用。对于图状结构,主要学习图的存储结构及图的遍历。

对算法的学习是学习数据结构的关键。要注重对算法的掌握。对于

一个算法,如果我们不是很理解的话,可以手动将算法走一遍,慢

慢理解该算法的思想。学习这门课程的最终目的,还是要学会如何

设计算法,这需要我们长期的练习和思考。

【篇二:数据结构课程设计心得体会】

程序设计心得体会

做了一个星期的程序设计终于做完了,在这次程序设计课中,真是

让我获益匪浅,我突然发现写程序还挺有意思的。

由于上学期的c语言跟这学期的数据结构都算不上真正的懂,对于

书上的稍微难点的知识就是是而非的,所以我只是对老师的程序理解,我也试着去改变了一些变量,自己也尽量多的去理解老师做程

序的思路。当我第一天坐在那里的时候,我就不知道该做些什么,

后来我只有下来自己看了一遍书来熟悉下以前学过的知识。

通过这次的程序设计,发现一个程序设计就是算法与数据结构的结

合体,自己也开始对程序产生了前所未有的兴趣,以前偷工减料的

学习也不可能一下子写出一个程序出来,于是我就认真看老师写的

程序,发现我们看懂了一个程序其实不难,难的是对于一个程序的

思想的理解,我们要掌握一个算法,不仅仅限于读懂,主要的是要

理解老师的思路,学习老师的解决问题的方法。

这次试验中,我发现书本上的知识是一个基础,但是我基础都没掌握,更别说写出一个整整的程序了。自己在写程序的时候,也发现

自己的知识太少了,特别是基础知识很多都是模模糊糊的一个概念,没有落实到真正的程序,所以自己写的时候也感到万分痛苦,基本

上涉及一个知识我就会去看看书,对于书本上的知识没掌握好。在

饭后闲暇时间我也总结了一下,自己以前上课也认真的听了,但是

还是写不出来,这主要归结于自己的练习太少了,而且也总是半懂

就不管了。在改写老师的程序中也出现了很多的问题,不断的修改

就是不断的学习过程,当我们全身心的投入其中时,实际上是一件

很有乐趣的事情。对于以后的学习有了几点总结:第一、熟记各种

数据结构类型,定义、特点、基本运算(分开点一点也没多少东西,难度不大,但是基本);第二、各种常用的排序算法,如冒泡排序、堆排序……,这些是必考的内容,分数不会少于20%;第三,多做

习题,看题型,针对题型来有选择复习;数据结构看上去很复杂,

但你静下心来把书扫上几遍,分解各个知识点,这一下来,学数据

结构的思路就会很清晰了。

【篇三:数据结构实训心得体会】

这次课程设计的心得体会通过实习我的收获如下1、巩固和加深了

对数据结构的理解,提高

综合运用本课程所学知识的能力。2、培养了我选用参考书,查阅手册及文献资料的能力。培

养独立思考,深入研究,分析问题、解决问题的能力。3、通过实际编译系统的分析设计、编

程调试,掌握应用软件的分析方法和工程设计方法。4、通过课程设计,培养了我严肃认真的

工作作风,逐步建立正确的生产观念、经济观念和全局观念。从刚

开始得觉得很难,到最后

把这个做出来,付出了很多,也得到了很多,以前总以为自己对编

程的地方还不行,现在,

才发现只要认真做,没有什么不可能。编程时要认真仔细,出现错

误要及时找出并改正,(其中对英语的要求也体现出来了,因

为它说明错误的时候都是英语)遇到问题要去查相关的资料。反复

的调试程序,最好是多找

几个同学来对你的程序进行调试并听其对你的程序的建议,在他们

不知道程序怎么写的时候

完全以一个用户的身份来用对你的用户界面做一些建议,正所谓当

局者迷旁观者清,把各个

注意的问题要想到;同时要形成自己的编写程序与调试程序的风格,从每个细节出发,不放

过每个知识点,注意与理论的联系和理论与实践的差别。另外,要

注意符号的使用,注意对

字符处理,特别是对指针的使用很容易出错且调试过程是不会报错的,那么我们要始终注意

指针的初始化不管它怎么用以免不必要麻烦。通过近两周的学习与

实践,体验了一下离开课堂的学习,也可以理解为一次实践与理论

的很好的连接。特别是本组所做的题目都是课堂上所讲的例子,在

实行之的过程中并不是那

么容易事让人有一种纸上谈兵的体会,正所谓纸上得来终觉浅绝知

此事要躬行。实训过程中

让我们对懂得的知识做了进一步深入了解,让我们的理解与记忆更

深刻,对不懂的知识与不

清楚的东西也做了一定的了解,也形成了一定的个人做事风格。通

过这次课程设计,让我对一个程序的数据结构有更全面更进一步的

认识,根据不同的

需求,采用不同的数据存储方式,不一定要用栈,二叉树等高级类型,有时用基本的一维数

组,只要运用得当,也能达到相同的效果,甚至更佳,就如这次的

课程设计,通过用for的

多重循环,舍弃多余的循环,提高了程序的运行效率。在编写这个

程序的过程中,我复习了

之前学的基本语法,哈弗曼树最小路径的求取,哈弗曼编码及译码

的应用范围,程序结构算

法等一系列的问题它使我对数据结构改变了看法。在这次设计过程中,体现出自己单独设计

模具的能力以及综合运用知识的能力,体会了学以致用、突出自己

劳动成果的喜悦心情,也

从中发现自己平时学习的不足和薄弱环节,从而加以弥补。篇二:

数据结构试验心得数据结构课程设计心得体会(专业:计算机科学

与技术姓名:朱文学号:2011220137)通讯录管理系统是基于

双向循环链表设计而成的信息管理系统。该系统通过对程序进行

模块化,建立添加、显示、查找和删除功能的函数,各函数中运用

双向循环链表存储数据。

为存储通讯录信息,需定义一个结构体类型,成员包括姓名、街道、城市、邮编、国家等,

并建立双向循环链表,定义该结构体类型的指针,用于指向各结点。分别建立具有添加、删

除、修改、查询等功能的子函数,完成相应功能,对程序实现模块化。这其中要用到对链表

的删除、插入等知识。为实现存储功能,需用到文件的相关函数开

发一个通讯录管理系统,借助计算机可以方便、快捷、灵活的管理

个人的朋友及相关

人员的通讯信息,了解友人相关信息,帮助与友人保持联络。所以

设计一个通讯录管理系统

管理各人的通讯信息是非常必要的,同时,通过用循环双向链表设

计通讯录管理系统可以让

我们更好的去理解循环双向链表,更好的学好数据结构这门课程。

本次实验中,我们使用分工合作的方式,首先定义了函数的结构体

部分,剩下的根据函

数所要实现的功能进行分工合作,我实现的是通讯录中删除功能的

子函数,删除信息(void

delete(dnode *head))的功能是按照用户输入的姓名首先进行按姓

名查询功能,查找成功,

则执行删除信息的功能,查询不成功,则提示错误信息。定义结点p,输入要删除的信息的

姓名,按姓名查找结点,如果找到匹配的结点p,就进行相关的删除操作,否则就是没找到

要删除的数据,最后返回到主函数。这次实验中我深刻认识到合作

的重要性。例如:我所编写的按名删除功能的实现中,应

用了章林霞同学所编写写的按名搜索查询功能的那部分函数,在这

次实验中,我学到很多东

西,加强了我的动手能力,并且培养了我的独立思考能力。我们坚

持理论联系实际的思想,

以实践证实理论,从实践中加深对理论知识的理解和掌握。实验是

我们快速认识和掌握理论

知识的一条重要途径。

通过这次课程设计,我们对c语言以及数据结构有了更深刻的了解,增强了程序的编写

能力,巩固了专业知识,对程序的模块化观念也又模糊逐渐变的清

晰了。在程序的运行与调

试过程中出现了很多错误,通过反复地复习课本上的相关知识,不

停地修改与调试,我们终

于完成了这段程序。在调试过程中,我们认识到了数据结构的灵活

性与严谨性,同一个功能

可以由不同的语句来实现,但编写程序时要特别注意细节方面的问题,因为一个小小的疏忽

就能导致整个程序不能运行。我们也认识到了自己的薄弱之处,如

对链表相关知识的欠缺,

文件运用的不熟练,在以后的学习中我们要集中精力、端正态度,

争取把知识学得更扎实、

更全面。

经过这次的实验,我们整体对各个方面都得到了不少的提高,希望

以后学校和系里能够

开设更多类似的实验,能够让我们得到更好的锻炼。也让我们深深

感受到讨论交流很重要,

遇到困难时,大家一起讨论,加强我们的团队合作精神,同时通过

这次的课程设计,我们对数据结构中双向链表结构有了更深刻的理解。篇三:数据结构综合实验心得体会心得体会:

做了一个星期的程序设计终于做完了,在这次程序设计课中,真是

让我获益匪浅。对大

一学习的c语言和这学期开的数据结构,并没有掌握,很多知识都

不太懂,突然让自己独立

完成一个程序让我手忙脚乱,起码在我认为那真的特别难,看了老

师给的题目以及上网查找

了一些相关的知识,简单的编了几行就告一段落了,第一天等于只

完成了老师要求写的需求

分析和概要设计,后来查找了关于哈希表的相关知识,了解了如何

创建哈希表,如何合适的

构建哈希函数,(选取合适的表长,合适的余数,使得查找时间以

及平均查找长度最短)以及

什么是除留余数法,和怎样用除留余数法创建哈希表,看懂了之后,我又看了处理冲突的方

法,有三种线性探测再散列法法,二次探测再散列法,伪随机数序

列法三种,而我所要做的

是第一种线性探测再散列的方法,相较后两种要简单很多,在遇到

冲突的时候地址加一,知

道冲突解决。

在了解这些概念以后,我就开始着手编程序了,在遇到问题的时候

请教我们班擅长的同

学,慢慢把不能不会不理解的地方给弄明白了,在经过很多次调试

以后,一些基本功能已经

可以实现了,为了使平均查找长度越小越好,我不断尝试新的表长

以及除数,在没有出现错

误的基础上,将功能实现,最后,终于在周四的时候将所有的程序

调试完全。这次的综合性实验使我了解到,平时对知识的积累相当

重要,同时也要注重课上老师的

讲解,老师在课上的延伸是课本上所没有的,这些知识对于我们对

程序的编写有很大的作用,

同时,编程也要求我们有足够的耐心,细细推敲。越着急可能就越

无法得到我们想要的结果,

遇到不会的问题要多多请教,知识是在实践与向别人请教的过程中

积累的,所以问是至关重

要的,只要肯下功夫很多东西都是可以完成的。篇四:数据结构实

验报告及心得体会2011~2012第一学期数据结构实验报告班级:信

管一班

学号:201051018 姓名:史孟晨实验报告题目及要求

一、实验题目

设某班级有m(6)名学生,本学期共开设n(3)门课程,要求实

现并修改如下程序(算

法)。

1. 输入学生的学号、姓名和 n 门课程的成绩(输入提示和输出显示使用汉字系统),输出实验结果。(15分)

2. 计算每个学生本学期 n 门课程的总分,输出总分和n门课程成绩排在前 3 名学生的学号、姓名和成绩。

3. 按学生总分和 n 门课程成绩关键字升序排列名次,总分相同者同名次。

二、实验要求

1.修改算法。将奇偶排序算法升序改为降序。(15分)

2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分))

3.编译、链接以上算法,按要求写出实验报告(25)。

4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。 5.用a4纸

打印输出实验报告。

三、实验报告说明

实验数据可自定义,每种排序算法数据要求均不重复。 (1) 实验题目:《n门课程学

生成绩名次排序算法实现》;

(2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性; (3)

实验要求:对算法进行上机编译、链接、运行; (4) 实验环境(windows xp-sp3,visual

c++); (5) 实验算法(给出四种排序算法修改后的全部清单); (6) 实验结果(四种

排序算法模拟运行后的实验结果); (7) 实验体会(文字说明本实验成功或不足之处)。

三、实验源程序(算法)score.c

#include stdio.h #include string.h #define m 6 #define n 3 struct student

{ char name[10]; int number; int score[n+1]; /*score[n]为总分,score[0]-score[2]为学科成绩

*/ }stu[m];

void changesort(struct student a[],int n,int j){int flag=1,i; struct student temp; while(flag){ flag=0; for(i=1;in-1;i+=2) /*对所有奇数项进行一遍比较*/ if (a[i].score[j]a[i+1].score[j]) { temp=a[i];

a[i]=a[i+1]; a[i+1]=temp; flag=1; } for(i=0;in-1;i+=2)/*对所有偶数项进行一遍比较*/ if (a[i].score[j]a[i+1].score[j]){ temp=a[i];

a[i]=a[i+1]; a[i+1]=temp; flag=1; }}}void print_score(struct student a[],i nt n,int j){ int i,k;printf(“ 奇偶交换成绩 %d 排序

表,j+1); printf(\n); printf( 名次学号姓名分数\n); k=1;

for(i=0;knin;i++) { if(i0a[i].score[j]!=a[i-1].score[j])k++;

printf( %4d ,k); printf(%4d,a[i].number);

printf( %s,a[i].name); printf( %6d,a[i].score[j]);

printf(\n);}} main()

{ int i,j,k;

for (i=0;im;i++) /*输入每个学生信息*/ { printf(请输入第 %d 名学生分数: ,i+1);printf(\n);printf(姓

名: ); scanf(%s,stu[i].name); printf(编

号: );scanf(%4d,stu[i].number); printf(数据结构: );

scanf(%4d,stu[i].score[0]); printf(离散数学: );

scanf(%4d,stu[i].score[1]);printf(大学英语: );

scanf(%4d,stu[i].score[2]); }

for(i=0;im;i++) /*计算每个学生总分*/{stu[i].score[n]=0;

for(j=0;jn;j++)

stu[i].score[n]+=stu[i].score[j]; }

changesort(stu,m,n); /*对总分进行排序*/ printf( 学生总分成绩排序表\n); printf( 名次学号姓名数据结构离散数学大学英语 k=1; for(i=0;im;i++)

{ if(i0stu[i].score[n]!=stu[i-1].score[n]) k++;printf(%4d,k);

printf( %4d,stu[i].number);printf( %s,stu[i].name);for(j=0;jn+1;j ++)

printf(%6d,stu[i].score[j]);printf(\n);

}

changesort(stu,m,0); /*对数据结构成绩进行排序*/

print_score(stu,m,0);

/*输出数据结构前 3 名同学成绩*/changesort(stu,m,1); /*对离散数学成绩进行

排序*/

总分\n);篇五:数据结构实训报告山东科技大学泰山科技学院课程实训说明书课程:数据结构项目实训题目:院系:信息工程系2014年5月 25日专业班级:学号:学生姓名:指导教师:目录

一、设计题目 (3)

1.1 顺序表操作.........................................................3 1.2

链表操作..........................................................3 1.3 二叉树的

基本操作 (3)

二、运行环境(软、硬件环境) (3)

2.1 软件环境 (3)

2.2 硬件环境 (3)

三、数据结构及算法设计的思想 (3)

3.1 顺序表设计构思.....................................................3 3.2

链表设计构思......................................................43.3 二叉树

设计构思 (4)

四、源代码 (5)

5.1 顺序表源代码......................................................5 5.2

链表源代码........................................................65.3 二叉树

源代码 (8)

五、运行结果分析 (11)

6.1 顺序表运行结果 (11)

6.2 链表运行结果.....................................................136.3 二

叉树运行结果 (15)

七、实习总结 (18)

一、设计题目

1.1链表操作 1.1.1 设计目的? 掌握线性表的在顺序结构和链式结构

实现。? 掌握线性表在顺序结构和链式结构上的基本操作。

1.1.2 设计内容和要求利用顺序表链表的插入运算建立线性链表,然

后实现链表的查找、插入、删除、计数、

输出、排序、逆置等运算(查找、插入、删除、查找、计数、输出、排序、逆置要单独写成

函数),并能在屏幕上输出操作前后的结果。 1.2二叉树的基本操

作 1.2.1 设计目的 ? 掌握二叉树的概念和性质 ? 掌握任意二叉树存

储结构。 ? 掌握任意二叉树的基本

操作。

1.2.2 设计内容和要求

(1) 对任意给定的二叉树(顶点数自定)建立它的二叉链表存储结构,并利用栈的五种

基本运算(置空栈、进栈、出栈、取栈顶元素、判栈空)实现二叉树的先序、中序、后序三

种遍历,输出三种遍历的结果。

(2) 求二叉树高度、结点数、度为1的结点数和叶子结点数。

相关主题