关于数据结构的学习

更新时间:2023-10-03 15:18:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

谈《数据结构》课程的学习

数据结构是计算机学科的重要分支研究领域,是计算机程序设计的重要理论技术基础,主要介绍用计算机解决一系列问题特别是非数值信息处理问题时所用的各种数据的组织方法、存储方式以及在各种结构上执行操作的算法。目的使学生掌握如何把现实世界的客观问题转换为在计算机内的表示形式,学会组织数据、选择算法、设计算法,培养逻辑思维和抽象思维能力,为系统开发与设计奠定坚实的基础。

不仅如此,数据结构与本系两个专业的人才培养的关系十分密切,它是许多后续课程如操作系统、数据库原理、信息组织与检索、管理信息系统、物流信息系统、网站设计等专业课程的先行课程。因此,《数据结构》课程在本系的地位非常重要。 1.《数据结构》与程序设计语言

《数据结构》是一门研究现实世界中数据与数据之间关系的一门学科,而表达这些关系时必须借助于计算机所能理解的语言──程序设计语言来表达,所以学习《数据结构》之前,必须非常熟悉一门或多门程序设计语言,如C、C++、JAVA等。

以C语言为例,C语言中的数组、结构体、语句、函数、指针等基本知识都经常作为工具来表达数据的存储结构和操作,尤其是C语言中数组、结构体、指针和数据传递方式等知识,它们是C语言中的重点和难点,而《数据结构》所用到的恰好是C语言的这些知识点。有些同学在学习C语言时,没有掌握好这些相关知识,所以在学习《数据结构》过程中用到这些知识时感到很茫然。唯一的解决办法是重新复习C语言中的相关知识点,熟练掌握它们的基本原理和使用方法,尤其是指针与结构体的结合,是《数据结构》中表达链式存储结构所必有用到的基本工具。 2.《数据结构》的知识结构

《数据结构》课程包含两大块知识的学习,即数据结构和算法,其中数据结构从逻辑上来分包括:线性结构、层次结构和网状结构,每一种逻辑结构又可选择两种不同的存储形式:即顺序存储和链式存储;算法包括查找与排序。 ⑴数据的逻辑结构

数据的逻辑结构描述的是数据元素之间的相互联系,计算机要对数据进行处理,首先必须搞清楚它所处理的对象之间的相互关系,然后对不同关系的数据进行不同的存储和处理。 线性结构:除第一个和最后一个元素外,每个数据元素有且仅有一个直接前驱和一个直接后继,数据元素呈一对一联系。

层次结构:每个数据元素有且仅有一个直接前驱,但可有任意多个直接后继,数据元素呈一对多联系。

网状结构:每个数据元素可有任意多个直接前驱和任意多个直接后继,数据元素呈多对多联系。

另外,除了上述几种逻辑结构结构外,还有一种称为集合的结构,在这种结构中元素之间除了“同属一个集合”的关系外,别无其它关系。该结构元素间的关系极为松散,可用其它结构来表示,在大多数数据结构教材中不做研究。 ⑵数据的物理结构

数据的物理结构或称存储结构是描述数据元素及其间的关系在存储器中的存储方式,按照数据在存储器中存储方式的不同,可分为两种存储方式:即顺序存储与链式存储。

顺序存储:用一组地址连续的存储单元,依次存放数据结构中的每个元素,此时逻辑上相邻的元素,其物理位置也相邻。这样存储密度较高,而且可以随机存取每个数据;但在插入和删除元素时,需要移动大量的数据,并且多余的存储空间不能共享。

链式存储:用一组任意的存储单元依次存放数据结构中的每个元素,这组存储单元可以是连续的,也可以是不连续的,此时,逻辑上相邻的元素,其物理不一定相邻,数据结构中

的每个元素是通过结点间的指针表达结点间的关系。这种方式很灵活,有很广的应用,尤其是在插入、删除元素频繁时,适宜选用这种结构,且空间能共享,但需要额外开销空间。 ⑶对数据的操作

将现实世界中的数据组织成一定的结构存储到计算机中,是为了要对数据进行处理(即操作),对数据结构常见的操作有:插入、删除、查找(检索)、遍历(访问)、排序等,尤其是查找和排序,它们在软件设计中使用非常频繁,如管理信息系统、物流信息系统、搜索引擎等,因此不仅要对每种数据结构的常用操作进行研究,而且还需要对查找与排序的算法单独进行讨论,提出各种不同的算法思想,并对每一种算法的效率进行分析(时间开销和空间开销),这样才能在实际应用中根据不同的情况选择不同的算法,以设计出效率高的程序。

3.《数据结构》的学习思路

《数据结构》的学习应该有一定的学习思路,一般根据不同的知识模块选择不同的学习思路。

⑴三大数据结构的学习

线性结构、层次结构和网状结构在教材中占有很大的份量,是本课程学习的重点,学习这一部分知识的思路是:

①每一种数据结构的逻辑描述。

②每一种数据结构的存储形式,其中包括顺序存储与链式存储两种形式的结构描述。 ③在每一种存储结构上的操作算法(初始化、插入、删除、查找、取元素、遍历等)。 其中,线性结构的学习尤为重要,因为它是其它结构学习的基础,因此一定要把线性结构的相关知识掌握好,为后面的学习打好基础。 ⑵查找与排序算法的学习

算法是计算机处理数据的操作步骤的描述,算法的好坏直接影响到计算机的执行效率,尤其是查找与排序算法,是实践中使用频率非常高的两类算法,因而对这两类算法进行分析和研究是非常有必要的。学习这一部分知识的思路是: ①每一种算法的算法思想。

②每一种算法的算法实现(选用一种程序设计语言)。 ③每一种算法的的算法评价。 4.《数据结构》的学习方法

对于“数据结构”来说,教师的“教”固然重要,但学生的“学”也极其关键。学生的“学”不应该是被动的“学”,而应该是主动的“学”、自觉自愿的“学”,只有这样,才能充分发挥其主观能动性的作用,真正把学习搞好。具体来说,应该做到以下几点: ⑴课堂学习

对于授课内容,课前要适当预习,课后要认真复习,上课时则要专心听讲,并做好笔记。一般来说,课前预习无需花费太多的时间,只要粗略地看一下,有所了解即可(当然能够在课前就能把将要学习的知识弄明白,那是最好不过的了);而课堂听讲则要集中注意力,尤其是要跟上老师讲课的进度,积极思考老师提出来的问题,与老师进行互动和沟通;最后,课后复习则要及时、全面,要根据上课时老师的讲解以及自己所作的笔记,反复研读课本的有关内容,直至真正理解、掌握为止。 ⑵作业

课后作业是巩固和复习每一次课堂学习的有效手段。“数据结构”通常被认为是一门难以掌握的课程,而主要困难正是来自习题的解答,许多同学都反映过,课堂上老师所讲的内容是很容易听懂的,课本上的有关内容也容易看懂,只是拿到题目后,总感到无从下手。在学

习“数据结构”的过程中(特别是早期阶段),这种现象是普遍存在的,要过此难关,别无良策,惟有多看例题、多做练习(一定要独立完成),并在此过程中不断地进行总结。 ⑶上机实验

“数据结构”是一门实践性很强的课程,上机实习是对学生全面综合素质进行训练的一种最基本的方法,是与课堂听讲、自学和练习相辅相成的、必不可少的一个教学环节。上机实习一方面能使书本上的知识变“活”,起到深化理解和灵活掌握教学内容的目的;另一方面,上机实习是对学生软件设计的综合能力的训练,包括问题分析,总体结构设计,程序设计基本技能和技巧的训练。此外,还有更重要的一点是:机器是比任何教师更严厉的检查者。因此,在“数据结构”的学习过程中,必须严格按照老师的要求,主动地、积极地、认真地做好每一个实验,以不断提高自己的编程能力与专业素质。 ⑷参考书的使用

学好一门课程,只靠一本教材,显然是不够的,对于“数据结构”来说,更是如此。因此,应当去图书馆借阅或购买相关的参考书籍,特别是相应的习题集。例如,对于C语言版本的“数据结构”来说,可供推荐的优秀的参考书目就有《数据结构题集(C语言版)》(严蔚敏、吴伟民编著,清华大学出版社,1999)、《数据结构习题与解析(C语言篇)》(李春葆编著,清华大学出版社,2000)、《数据结构程序设计题典》(李春葆等编著,清华大学出版社,2002)等。

⑸课程网站的使用

本课程网站早已开通,网站上有丰富的教学资源,如有比教材还详细的【课堂内容】模块,有提纲挈领式的教学课件资源,有大量的网上自测题,还有大量的程序设计题,尤其是【教学互动】模块,为师生之间架起了沟通的桥梁,同学们可以充分利用网站资源,作为本课程的学习的有益补充。

另外,Internet上也有丰富的与本课程相关的教学资源,如

“http://algorithm.myrice.com(算法与数据结构)、http://www.vcok.com(唯C世界)等。 ⑹勤学好问

众所周知,学习的根本之道在于勤学好问。勤能补拙,问则明智。作为学生,既不肯用功,又不愿向同学或老师请教,那绝对是不行的。因此,学生积极发扬不耻下问、刨根问底的精神。一方面,同学之间应互相请教,共同探讨有关问题;另一方面,也要大胆地向老师请教,充分利用老师答疑解惑的“功效”。在多年的教学过程中,我发现,凡是喜欢问问题的同学,最后数据结构都学得不错。 5.《数据结构》的难点解析

在《数据结构》的学习过程中,有些知识点是许多同学感到较难的,大致有以下几点: ⑴结构体的应用

结构体在本课程中经常作为一个工具来描述数据结构,因为,结构体能够把彼此有联系的数据构成一个整体,而我们为了充分表达一种逻辑数据的存储结构时,要考虑到方方面面的问题,如线性表的顺序存储(顺序表),既要有存储线性表元素的连续的存储空间(借用C语言中的数组),还要表达出线性表当前元素的数目(即长度),这两个方面的信息都是关联于线性表的,因此,把它们构成一个结构体,就非常完美地描述了顺序表。如: typedef struct

{ DataType list[MAX]; /*MAX为已定义的符号常量*/ int len; }Seqlist;

⑵结构体与指针的结合

在表达一种逻辑结构的链式存储结构时,必然要用到结构体与指针的结合,因为链式结构是用地址(指针)来描述数据之间的逻辑关系,因此,在所有的链式结构中,结点(相当于一个数据)中除存放数据本身的信息外,还必须有空间存放中一个(或几个)结点的地址,要把这些信息构成一个整体,必然是结构体中嵌套指针。如描述单链表中结点的结构: typedef struct Node

{ DataType data; /*存放结占本身的数据信息*/ struct Node *next; /*存放后继结点的地址*/ }SLNode;

其中结构体的成员next是一个准备指向与本结点一样类型的结点(或说:next准备存放一个与自己同类型结点的地址),每一个结点的结构都是如此,所以就构成了一个单链表。 ⑶指针的运用

以上图的单链表为例,在图中,指针p指向23所在的结点,p的类型是一个结构体指针(如Lnode *p;),其值实际上是一个整数,即23所在结点所占存储单元的首地址,这个地址值是随机的,并且我们关心的不是这个值等于多少,而是通过p访问相应结点中的数据,因此下面几种表达形式是在链式结构中经常用到的: p:23所在结点的地址,是一个整型常数。 *p:23所在的结点,是一个结构体数据。

&p:指针变量p的地址,也是一个整型常数,但绝不等于p。 p->data:p所指结点的数据成员,即整数23。

p->next:p所指结点的指针成员,即p所指结点的后继结点的地址,也就是12所在结点的地址。

同时以下几个赋值语句也是经常用到的: p=head; /* p从表头开始 */

p=p->next; /* p在链表中移动,或说把p所指结点的后继结点的地址赋给p */ ⑷数据的传递

在表达算法思想时,需要借用程序设计语言中的函数(模块)来实现一个算法,这就涉及到数据传递。在不同函数之间进行数据传递,不同程序设计语言提供了基本相似的方法,只是有些细节不一样。对一个函数而言,数据可能有进也有出,许多同学对从函数中传出数据不太清楚。在C语言中,从函数中传出数据有三种途径:

①通过return语句。此时设计函数时,函数一定有返回值(返回值的类型就是要传出函数的数据的类型)。 SLNode *creat(void) { SLNode *head,*p,*q;

head=(SLNode *)malloc(LEN); q=p=head;

scanf(\ while(p->data!=0) {

p=(SLNode *)malloc(LEN); scanf(\ q->next=p; q=p; }

q->next=NULL;

return head; }

②通过全局变量。

SLNode *head; /* 全局变量 */ void creat(void) { SLNode *p,*q;

head=(SLNode *)malloc(LEN); q=p=head;

scanf(\ while(p->data!=0) {

p=(SLNode *)malloc(LEN); scanf(\ q->next=p; q=p; }

q->next=NULL; }

③通过指针。如果从函数中传出一般数据(整型、实型、字符型、结构体等),则形参定义为一级指针,若要从函数中传出地址,则形参需要定义成二指针。不管形参是一级指针还是二级指针,在函数内部都需要对指针所指的对象进行操作,即指针前带*,同时,调用此函数时,实参应是带有&的表达式。 void creat(SLNode **head) { SLNode *p,*q;

*head=(SLNode *)malloc(LEN); q=p=*head;

scanf(\ while(p->data!=0) {

p=(SLNode *)malloc(LEN); scanf(\ q->next=p; q=p; }

q->next=NULL; }

6.《数据结构》学习的误区 ⑴只动眼、耳,不动手

在教学过程中发现,相当一部分同学在看书和听课时,只动眼、耳,不动手。这种学习方法是极端错误的,学习数据结构的有效方法是动手,动脑。上课时,不仅思路要跟着老师的思路一起走,而且要动手做相关笔记,这样,课后复习时对老师讲课的思路和重难点才有一个比较清晰的认识,才能把握事物的本质;同时,课后还要对每一个算法,列举具体的数据,对照算法的具体语句,一条一条手工执行,这样才能领会算法的真正含义。 ⑵用学习C语言的方法来学习《数据结构》

有的同学认为,《数据结构》是C语言的延续,这是一种错误的想法。《数据结构》与C语言是两门完全不同的课程,C语言仅仅是一个程序设计工具,而《数据结构》则是程序设计的思想和灵魂,在学习《数据结构》的过程中经常会接触到C语言的知识,这只不过是借用C语言这个工具来表达《数据结构》的思想而已,我们也可以不选用C语言,而选择其它语言,如PASCAL、JAVA等,所以,不应该把《数据结构》当成C语言来学习,而应该按照《数据结构》的知识结构特点(如上所述)来学习。 ⑶死记硬背

有些同学在学习《数据结构》时,喜欢背教材中的有关结构描述、算法实现和一些实例,这也是不对的,因为,学习《数据结构》时,不应该局限数据和实例的表达,而应该着眼于分析每一种数据结构的特点、存储方式和操作算法,养成提出问题、分析问题和解决问题的思维习惯,提升自己分析问题和解决问题的能力,这样才会在学完《数据结构》后对自己的程序设计能力有一个较大的提高,并对后续相关课程的学习有很大的帮助。

总之,“数据结构”课程较之其它课程的学习有一定的难度,但只要树立信心、有一个好的学习态度、掌握一套适合自己的学习方法,且师生共同努力,相信一定能学好这门课程。

本文来源:https://www.bwwdw.com/article/njwd.html

Top