亓 璐
(济宁学院计算机科学系,山东 济宁 273155)
《数据结构》课程教学改革探讨
亓 璐
(济宁学院计算机科学系,山东 济宁 273155)
针对《数据结构》课程教学中存在的问题,提出了如下改革措施:运用生活和科研案例,激发学生的学习兴趣;使用面向对象的特性,挖掘知识点之间的关系,使学生建立课程的整体知识框架;转变学生的学习思路,使其重视概念的理解;采用图解法使程序分析中的抽象问题具体化,帮助学生编写代码。实践表明,采取上述措施和方法,有效地提高了课堂教学效率。
数据结构;面向对象;案例教学;图解法;实验教学
《数据结构》是计算机专业课程体系中一门非常重要的基础课程,其一方面能扩展和深化《离散数学》、《程序设计语言》等课程中的基本理论和方法,另一方面能为学生学习《操作系统》、《编译原理》和《数据库》等后续课程奠定坚实的理论与实践基础[1]。通过该课程的学习,使学生能从数据结构的角度出发,为现实问题所涉及的数据选择合适的逻辑结构、存储结构,设计出合理、可行的算法,并编写出正确、清晰和高质量的程序,提高算法设计能力和工程实践能力[2]。由于该课程的传统课堂教学模式过于注重介绍基本内容和讲解习题,忽视对学生实践能力的培养,导致学生学习该课程时感到枯燥乏味,学习积极性不高。因此,如何激发学生的学习兴趣并增强学生解决实际问题的能力,是一个亟待解决的问题。为此,笔者从理论教学和实验教学2个方面、多个角度对传统课堂教学方法进行了改革和创新❶。
1.1引用生活实例激发学生的学习兴趣
《数据结构》课程内容丰富,知识点之间的关系错综复杂。要取得好的教学效果,首先要激发学生的学习兴趣。由于数据结构是在现实生活中总结出来的,所以在课堂教学中应适当引入生活实例,通过“联想”式的启发,将抽象的理论知识转化成学生容易理解和感兴趣的内容,从而调动学生的学习积极性[3]。例如,在讲解采用开放定址法解决散列表的冲突时,可以用学生在图书馆占位为例进行说明。当学生来到图书馆选中一个坐位将要坐下时,发现桌上写着“占位,谢谢合作”,此即散列表中的冲突。如何解决上述问题呢?一种处理方式是观察右边的位子是否被占,如果也被占,再观察右边下一个位子,依次类推,而往右查看下一个位子就是线性探测法的+1,+2,+3,…。另一种处理方式是先观察左边的位子是否被占,再观察右边的位子是否被占,此即二次探测再散列的+1和-1。这样通过列举与学生生活紧密联系的实例,可以轻松愉快地理解所学知识。
1.2培养学生面向对象的思维方式
在数据结构中,抽象数据类型充分概括数据结构定义中的数据对象、数据关系和操作3个方面。以往教学时用学生比较熟悉的C语言对抽象数据类型进行描述,由于C语言的局限性,其不能准确、有效地表现抽象数据类型的思想,而C++或Java中类的特性与抽象数据类型的抽象性和封装性相符合[4],因此,利用面向对象方法和C++语言来描述数据结构可以提高课堂教学效率。这种改变,不仅有助于挖掘数据结构中隐藏其中的关系,而且能够培养学生面向对象的思维分析方式以及注重可复用构件的思想。例如,栈是操作受限的线性表,如果把线性表的表头定义为栈底,表尾定义为栈顶,那么入栈操作等价于在线性表的表尾进行插入操作,出栈操作等价于在线性表的表尾进行删除操作,因此可以引导学生将线性表理解为基类,将栈作为线性表的派生类对待。在线性表操作的基础上再实现栈的操作,可以加深学生对程序设计的模块化和结构化的认识。这样找到即将讲解的栈和已讲解的线性表的关系,增强了知识点的连贯性,使学生对新知识更容易理解。
1.3加强整体知识框架的构建
数据结构课程理论知识庞杂、分散,如果知识点的因果关系、内在逻辑关系没理顺的话,学生学习起来会感觉很困难。为此,需要分析各种逻辑结构之间以及各章节知识点之间的关系,采用纵横对比的方法将分散的的概念和运算纳入完整的学科体系中,从而建构起完整知识结构框架[5]。
横向对比方面,以线性表为例,可从线性表的顺序存储结构和链式存储结构2个方面出发,分析算法的优缺点,从而弄清楚知识点的前因后果,将顺序表、单链表、循环链表和双向链表“串联”起来。当在线性表的顺序存储(顺序表)中插入、删除一个数据元素操作时,“惊动”了其他许多数据元素,因而需要移动大量数据元素。为了解决顺序表动态操作效率低的问题,可引入链式存储。链式存储中的单链表通过指针“顺藤摸瓜”找到下一个数据元素,但无法找到其直接前驱元素,为此引入循环链表。循环链表虽然能够实现找到任何一个数据元素的前驱结点,但是时间复杂度比较大,为此通过改进结点,增加指向前驱的指针域,进而形成双向链表。双向链表的2个指针域可以容易地找到任何一个数据元素的前驱和后继,时间复杂度都降为O(1)。这并不能说明双向链表是十全十美的,也存在不足,存储密度不紧密就是其中一个方面。顺着该线索,引导学生发现顺序表的优点。经过深入分析,使学生对各种存储方式做到“心中有数”,这样在处理实际问题时才能“扬长避短”。
纵向对比方面,以线性结构和树形结构为例,对上述2种原本不相干的结构进行分析,发现它们存在相似的地方:线性结构除了首元素外具有唯一的前驱,树形结构除了根结点外具有唯一的双亲;线性结构除了尾元素外具有唯一的后继,树形结构除了叶子结点外具有多个孩子。因此,线性结构的前驱相当于树形结构的双亲,线性结构的后继相当于树形结构的孩子。这样,树形结构中形式上只有左孩子或只有右孩子的单支二叉树,本质上其实是线性结构。
1.4注重基本概念的理解
由于《数据结构》是一门理论与实践紧密结合的课程,因而要求学生既能掌握基本的理论知识,还能上机编程实现算法。为了提高学生的程序设计能力,可以采用算法自然语言、C++语言并配合相应示意图的教学方式,具体内容如下。
2.1示意图法在队列初始化中的应用
队列是操作受限的线性表,在队头出队列、在队尾入队列。在实现队列初始化时,首先明确目标,即最终形成空队列(见图1);然后将算法自然语言描述“翻译”成C++语言,画出对应的示意图。每更新一次示意图,都要与图1对照,找出差异,完善程序,步骤如下:
1)生成一个结点:Node
2)指针域为空: front->next=Null(见图3)。
3)队尾指向头结点:rear=front;(见图4)。
最后将算法最终生成图与图1对比,如果两者相同,则程序完成;如果两者不相同,找出差别,完善程序,直到与图1完全相同为止。
图1 空队列 图2 生成结点 图3 设置指针域 图4 设置队尾指针
2.2示意图法在顺序表初始化中的应用
顺序表是指用一组地址连续的存储空间依次存放线性表中的数据元素,其包含以下重要信息:开辟一块地址连续的存储空间;开辟空间大小;将数据元素放入其中;放入数据元素的个数。据此建立对应类,elem为开辟存储空间的首地址,listsize为空间大小,length为存放数据元素的个数。因此建立类list为:
Class list{
private
int length;
int listsize;
图5 开辟空间 图6 空间为100
T *elem;
}
顺序表的初始化就是实现顺序表概念的4个方面,即为类中3个变量赋值:
1)开辟地址连续的空间:elem=new T[listsize];(见图5)。
2)空间大小为100:listsize=100;(见图6)。
3)初始状态不存放数据元素:length=0。
为了提高《数据结构》课程教学质量,笔者提出一些针对性的改革措施。教学实践表明,采取教学改革措施后,提高了课堂教学效率,明显改善教学效果,因而受到学生的认可。今后,应在培养学生的编程能力方面继续探索,从而进一步提高学生的实践创新素质。
[1]刘馨月,张宪超,于红.数据结构与算法核心课程建设[J].计算机教育,2011(6):65-68.
[2] 张小刚,李向阳.《数据结构》课程教学改革探讨与实践[J].塔里木大学学报,2008,20(2):93-95.
[3] 陈越,何钦铭,冯雁.“数据结构”综合性课程设计教学探索与实践[J].计算机教育,2008(8):54-55.
[4] 殷人昆.数据结构(用面向对象和 C++描述)[M]. 北京:清华大学出版社,2007.
[5] 青宇航.关于《数据结构》现代教学方法的探索[J].教育与职业,2007,59(8):151-152.
[编辑] 李启栋
10.3969/j.issn.1673-1409(N).2012.11.062
N4
A
16731409(2012)11N18603