《数据结构》课程实验报告

2024-04-08

《数据结构》课程实验报告(精选9篇)

篇1:《数据结构》课程实验报告

一、实验目的通过用SQL语句对数据进行完整性控制,了解掌握提供定义完整性约束条件的机制、提供完整性检查的方法以及违约处理

二、实验环境

WINDOWS XP 和 SQLServer200

5三、实验内容:

参照完整性定义

参照完整性检查和违约处理

属性上的约束条件的定义(1.不允许去控空值 2.劣质唯一 3.用CHECK短语指定列值应该满足的条件)

属性上的约束条件检查和违约处理

元祖上的约束条件的定义

完整性约束命名子句

修改表中的完整性限制

定义触发器

激活触发器

四、程序源码与运行结果

一、定义SC中的参照完整性。

CREATE TABLE SC

(Sno CHAR(9)NOT NULL,Cno CHAR(4)NOT NULL,Grade SMALLINT,PRIMARY KEY(Sno,Cno),FOREIGN KEY(Sno)REFERENCES Student(Sno),FOREIGN KEY(Cno)REFERENCES Course(Cno));

二、显式说明参照完整性的违约处理示例。

CREATE TABLE SC

(Sno CHAR(9)NOT NULL,Cno CHAR(4)NOT NULL,Grade SMALLINT,PRIMARY KEY(Sno,Cno),FOREIGN KEY(Sno)REFERENCES Student(Sno)

ON DELETE CASCADE

ON UPDATE CASCADE

FOREIGN KEY(Cno)REFERENCES Course(Cno)

ON DELETE NO ACTION

ON UPDATE CASCADE);

三、在定义SC表时,说明Sno,Cno,Grade属性不允许取空值。

CREATE TABLE SC

(Sno CHAR(9)NOT NULL,Cno CHAR(4)NOT NULL,Grade SMALLINT NOT NULL,PRIMARY KEY(Sno,Cno),四、建立部门表 DEPT,要求部门名称 Dname列取值唯一,部门编号Deptno列为主码。(列值唯一)

CREATE TABLE DEPT

(Deptno NUMERIC(2),Dname CHAR(9)UNIQUE,Location CHAR(10),PRIMARY KEY(Deptno)

五、Student表中Ssex只允许“男”或“女”。(用 CHECK 短语指定列值应该满足的条件)CREATE TABLE Student

(Sno CHAR(9)PRIMARY KEY,Sname CHAR(8)NOT NULL,Ssex CHAR(2)CHECK(Ssex IN(„男‟,„女‟)),Sage SMALLINT,Sdept CHAR(20)

六、当学生的性别是男时,其名字不能以 MS.打头。(元组上的约束条件的定义)CREATE TABLE Student

(Sno CHAR(9),Sname CHAR(8)NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20),PRIMARY KEY(Sno),CHECK(Ssex=„女‟ OR Sname NOT LIKE „ MS.% ‟));

七、完整性约束命名子句

CONSTRAINT <完整性约束条件名> [PRIMARY KEY 短语ㄧCHECK 短语]

例1:建立学生登记表Student,要求学号在90000-99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。

CREATE TABLE Student

(Sno NUMERIC(6)

CONSTRAINT C1 CHECK(Sno BETWEEN 90000 AND 99999),Sname CHAR(20)

CONSRAINT C2 NOT NULL,Sage NUMERIC(3)

CONSTRAINT C3 CHECK(Sage < 30),Ssex CHAR(2)

CONSTRAINT C4 CHECK(Ssex IN(„男‟,„女‟)),CONSTRAINT StudentKEY PRIMARY KEY(Sno));

例2:建立教师表 TEATHER,要求每个教师的应发工资不低于3000元。应发工资实际上就是实发工资例Sal与扣除项Deduct之和。

CREATE TABLE TEATHER

(Eno NUMERIC(4)PRIMARY KEY,Ename CHAR(10),Job CHAR(8),Sal NUMERIC(7,2),Deduct NUMERIC(7,2),Deptno NUMERIC(2),CONSTRAINT EMPFKey FOREIGN KEY(Deptno)REFERENCES DEPT(Deptno),CONSTRAINT C1 CHECK(Sal+Deduct >=3000));

八、限制修改表Student中的约束条件,要求学号改在900000-999999之间,年龄由小于30改为小于40。(修改表中的完整性)

可以先删除原来的约束条件,再增加新的约束条件。

ALTER TABLE Student

DROP CONSTRAINT C1;

ALTER TABLE Student

ADD CONSTRAINT C1 CHECK(Sno BETWEEN 900000 AND 999999),ALTER TABLE Student

DROP CONSTRAINT C3;

ALTER TABLE Student

ADD CONSTRAINT C3 CHECK(Sage <40);

九、SQL 使用 CREATE TRIGGER 命令建立触发器,其一般格式为

CREATE TRIFFER <触发器名>

{ BEFORE AFTER } <触发事件> ON <表名>

FOR EACH {ROW STATEMENT}

[WHEN <触发条件>]

<触发动作体>

例:定义一个BEFORE 行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于40000元,自动改为4000元”。

CREATE TRIGGER Insert_Or_Sal

BEFORE INSERT OR UPDATE ON Teacher

FOR EACH ROW

AS BEGIN

IF(new.Job=‟教授‟)AND(new.Sal<4000)THEN

new.Sal :=4000;

END IF;

END;

十、执行修改某个教师工资SQL语句,激活上述定义的触发器。

UPDATE Teacher SET Sal=800 WHERE Ename=„陈平‟;

执行顺序是:

 执行触发器 Insert_Or_Update_Sal;

 执行SQL语句“UPDATE Teacher SET Sal=800 WHERE Ename="陈平";"  执行触发器Insert_Sal;

 执行触发器Update_Sal.十一、删除触发器的SQL语法如下:

DROP TRIGGER <触发器名> ON <表名>;

触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户的删除.例: 删除教师表 Teacher 上的触发器 Insert_Sal。

DROP TRIGGER Insert_Sal ON Teacher;

五、实验总结

在实验过程中我对于创建和修改触发器和完整性约束的语法搞不明白

通过本实验,我理解/了解/熟悉了.......熟悉了完整性约束的添加删除 熟悉了触发器的使用方式 熟悉了触发器语法熟悉级联式更新删除的语法

篇2:《数据结构》课程实验报告

专业班级学号学生姓名任课教师朱焱老师辅导教师杨方蓉、梁懿

年月日

一、实验目的本次实验所涉及并要求掌握的知识点。根据老师实验前的讲授自行撰写。(小四号字,宋体)

二、实验环境

本次实验所使用的系统平台和相关软件。(小四号字,宋体)

三、实验内容:

本次实验的内容描述及相关题目

四、程序源码与运行结果

按照实验内容编写的代码与结果显示(五号字,宋体),重复的SQL语句只写一次。

五、实验总结

篇3:《数据结构》课程实验报告

关键词:数据结构,实验教学,实例

“数据结构”课程是高等院校理工科专业的一门必修课程,是计算机科学领域中的一门重要基础课。该课程主要介绍如何利用算法实现各种数据在计算机中的存储和处理,其重点学习内容包括:顺序表、链表、栈和队列、数组、树与森林、图、查找、排序等。通过本课程的学习,使学生深透地理解数据结构的基本概念和基础算法,培养学生良好的程序设计技能,锻炼学生通过编程解决实际问题的能力。为后续相关专业课程的学习打下坚实的基础,为从事计算机科学领域的研究和开发打下理论和实验的基础。

“数据结构”的课程实验不仅帮助学生理解数据结构的基本概念和基础算法,而且培养学生良好的算法技能,锻炼学生通过编程解决实际问题的能力。

一、“数据结构”实验教学中存在的问题

在大多数院校,按照教学大纲和实验大纲安排,“数据结构”课程一般在大学期间的第三学期或者第四学期开设,并且前期已开设一门程序设计基础课程。其总教学学时72学时,其中理论教学54学时,实验教学18学时。目前,在实验教学的整个过程中存在以下几个问题。

1.学生对实验教学重视程度不够。“数据结构”课程的理论知识多是用伪代码写的,学生往往侧重于算法的理解,忽略了算法的实现。教材中的算法往往是伪代码或者是程序段,学生要想将算法实现,就需要把伪代码或者程序段放到带有数据的实例中,用正确的、可执行的程序实现,然后调试运行,查看算法结果。而这一过程,一方面,比较复杂;另一方面,不是“数据结构”课程的重点,所以往往会被老师和学生忽略。但是这一过程恰恰是帮助学生透彻理解算法,帮助学生把算法与实际应用结合。

2.实验项目设置关联性。每一个实验项目对应一定的理论知识,实验项目之间不相关,学生做完做不完都不会影响下次实验,导致很多学生对一些实验不够重视,主动性不高。有一些学生在个别实验项目没有做完的情况下,没有主动的在课下完成,在下次实验课上也没有主动积极的补做,时间久了,越积越多,最终导致这门课程学得不好,也必然影响后续课程的学习。

3.实验项目内容设置缺乏与实例的结合。实验不仅仅是理论知识巩固,更是知识总结和能力的提高。实验内容的设置不能仅仅考虑理论知识体现,更应考虑如何让学生在理解理论的同时和实际应用相结合,培养学生把理论应用于实际的主动性。目前,大多数学生学习态度是被动的,不愿意去多想,不愿意去扩展。教师在设计实验项目时要引导他们去联系实际,去扩展内容。这样持续下去,学生才会在掌握理论知识的同时,和实际应用相结合,掌握算法的精髓。

针对以上存在的问题,在“数据结构”实验教学中我们设计了与实例紧密结合的分层次的实验教学模式。这一教学模式由易到难、由单一到综合,逐步培养学生的算法编写能力。我们将整个实验教学分成基础篇、提高篇、专项篇等三个阶段,每个阶段完成一定的知识目标和理论目标。

二、“数据结构”实验教学模式

多数高校的教学计划中,“数据结构”课程的实验教学是18学时,我们将18学时分为9个实验项目,分别为:顺序表的操作、单链表的操作、栈的操作、队列的操作、数组的操作、二叉树的操作、图的操作、查找操作、排序操作。不同实验项目结合不同的实例,划分到不同的层次,具体实施如下。

1.基础篇。“数据结构”实验教学的初级阶段属于基础篇的内容,是对教材的理论知识点的简单实现。实验项目中顺序表的操作、单链表的操作、栈的操作、队列的操作等属于基础篇的实验,这一阶段的实验实例相对简单,重点在于让学生掌握基本的数据结构类型。这一阶段的顺序表实验和单链表实验用的实例是学生成绩管理系统,这里对学生的信息只存储学号和姓名,成绩信息可以存储一门到三门课程的成绩。这样数据比较简单,着重让学生掌握线性表的顺序存储和链式存储。对于栈的操作采用的是火车车厢重排问题的案例,这里要求学生也要通过顺序和链式两种存储方式实现。对于队列操作的实验采用的实例是银行排队叫号系统。在银行排队叫号系统这一实例中要求学生不能仅仅使用一个队列,一次简单的先进先出操作实现,需要学生考虑到一个排号队列,多个叫号队列的情况,让学生有所思考,从而实现对队列操作的深入理解。

2.提高篇。通过基础篇实验的学习,学生对线性表、栈、队列等基本数据结构有了深刻的认识,对顺序存储结构和链式存储结构的使用有了一定的基础。接下来要学习的是较为复杂的数据结构:数组、树和图。数组的操作、二叉树的操作、图的操作等实验就是提高篇要完成的实验内容。这一阶段接触的是复杂的数据结构,但核心还是运用基础篇学习的基本数据结构,实例的选择也会较为复杂。数组操作的实验选择的实例是超市物品购买数据存储系统。这个实例中要处理的数据不是简单的数组,其需要的数组较大,但存储的数据较少,这就是典型的系数矩阵。在现实生活中这类数据经常遇到,对这类数据的存储和操作就要通过数组操作的实验进行学习和掌握。树操作通过二叉树实现的,所以树这一章节的实验设置的是二叉树的操作,结合的实例是磁盘文件的记录系统,着重是运用线索二叉树的知识。图操作的实验用的实例是高速公路交通网这一经典案例。这一实例不仅运用了图的遍历操作,还用了最短路径等经典算法。通过这些提高篇的实验项目学生对复杂的数据结构有所掌握,也对数据结构的复杂应用有所了解。

3.专项篇。对于大多数数据的处理都会用到两种典型的操作:查找和排序。数据结构课程的后期都会讲到这两项内容,同样也会有两项专门的实验来对应。查找操作和排序操作采用的实例分别是奥运会奖牌的排行榜的查询和排名,着重让学生掌握不同的查找方法和排序方法。需要学生熟记一些经典的查找算法和排序算法,会对不同的算法比较优劣,同时也对时间复杂度和空间复杂度有所了解。

基础篇、提高篇、专项篇这三个实验阶段,由易到难,相辅相承,让学生逐步掌握不同数据结构的定义和使用,进而培养学生的算法编写能力。具体在实施过程中根据学生的实际接受情况和掌握情况对具体实验内容进行增减。

三、实验效果

我们在2012级学生的“数据结构”课程教学中开始探索这一实验教学模式,在2013级学生的“数据结构”课程教学中进一步完善,效果很好。学生学习的积极性明显提高,学习效果也有了明显的提高。

经过一系列的实验教学实践,我们针对“数据结构”课程,探索出了由基础篇、提高篇、专项篇这个三个阶段组成的与实例紧密结合的实验教学模式。这一教学模式由易到难,逐步培养学生的算法编写能力。今后,我们将继续结合教学实际进一步完善实验教学文件、丰富“数据结构”课程实验内容和课程设计的内容,从而提升“数据结构”课程的教学效果。

参考文献

[1]黄贤英.计算机专业实验教学体系建设思考[J].实验技术与管理,2009,(10):94-100.

[2]马彬.三维一体化的计算机实验教学建设体系[J].实验室研究与探索,2013,(10):163-165.

篇4:数据结构课程的实验教学探讨

关键词 数据结构 实践教学 课内上机

中图分类号:G642 文献标识码:A

作为计算机专业学生的一门专业核心课程,数据结构是计算机程序设计的重要理论技术基础。①在实际的教学过程中,学生常常反映数据结构课程难度偏大,而且内容枯燥。从教学内容上来讲,数据结构比较难在于它包含了很多抽象的概念、算法。

数据结构的教学形式包含理论教学和实践教学两部分。同C语言程序设计等实践性很强的课程②类似,数据结构也需要学生在掌握有关概念的基础上进行上机编程训练。理论是实践的基础,而实践帮助学生更好地理解课堂上所学到的知识。要提高本门课程的教学质量,理论教学和实践教学两个环节都必须做好。当然,要达到事先制定的教学目标并不容易。比如,在理论教学上,教师需要丰富教学内容而不仅仅是讲解教材上的知识点,如有教师提出的案例教学。③同时,要想方设法使课堂教学过程生动有趣、讲授语言浅显易懂。下面本文将以课内上机为例,从如何增强教学效果谈几点感受,以供探讨。

1 同步理论教学,合理分配上机学时

在一般情况下,课内上机内容应与理论教学内容同步。然而,课内上机的学时是有限的,比如20学时。如果一次上机为两学时,那么平均一章内容只能安排一次上机。以严蔚敏C语言版的《数据结构》教材为例,最先学习的内容是线性结构,可以安排单链表的创建和插入、删除等作为上机实验内容。尽管这是第一个上机实验,但在教学过程中学生往往反映这些内容并不简单。原因是多数学生对C语言中结构体和指针的使用并不熟练,因此需要花一定的时间来復习这方面内容,所以本次实验可以安排两次上机。而后续的栈和队列等内容相对而言较为容易,可只安排一次上机。由于上机学时有限,实验内容又受到理论教学进度的制约,为保证实验内容在规定的学时内全部完成,对课内上机学时的合理分配就显得尤为重要了。

2 丰富上机内容,提高学生的学习积极性

学习的积极性对课程学习来说其重要性不言而喻。很多学生在学习理论知识之后,对上机编程还是有新鲜感的,但是不少学生会因为编程难度的逐步增大而逐渐失去兴趣,最终选择放弃。要让学生保持对上机实验的热情,教师需要在上机内容的安排上有新意。通常,与教材配套的习题集中有不少的上机实习题(如严蔚敏版《数据结构题集》)④可做参考。为提高学生的学习兴趣,可以提供一些其他的题目。比如,在学习数组中的三元组时,使用Movielens提供的用户评分数据,Movielens是较早出现的电影推荐评分系统,它提供了很多测试数据集。这些数据经过处理后很容易转换为三元组的存储形式,而且具有一定的实际意义,相比为检验程序而随意制造的测试数据,完成对这些评分数据的处理更能够吸引学生的注意力,从而提高他们的学习兴趣。当然,如何在教学中让学生感受到乐趣,从而保持较高的学习积极性是一个值得研究的问题。

3 把握任务难度,提高学生编程能力

在数据结构的理论教学内容中包含了很多复杂而且抽象的概念、算法,通过课堂上的认真学习,多数学生还是能够理解的。但是很多学生并不能真正掌握并做到学以致用。在一定程度上,这也是不少动手能力不强的学生却能在理论考试中考出好成绩的原因。因此,对每一个在课堂上讲解的重要知识点,不管是简单的结构类型定义还是复杂的算法,都要求学生编程实现,让学生在上机实验中去体会并掌握所学的理论知识。为了降低任务难度,可以给学生提供已经写好框架的程序,让学生在合适的位置添加相应的功能。比如,对于树结构,可以在源程序中写好二叉树的创建,然后要求学生补充完成二叉树的遍历、层次计算或左右孩子查找等其他操作。这样做的另一个好处是避免学生从网络或从其它途径直接寻找源代码以应付了事。由于程序是统一提供的,对学生来说无法自行发挥,即使找到合乎要求的部分代码也要放到源程序中去调试运行。然而,这样的任务安排也会对一部分编程能力强的学生产生约束,使他们有可能提出的更好设计方案和编程创意被抑制。解决这一矛盾的方法之一是布置多级任务。对基本任务要求学生统一完成,而高级任务可以让学生自行发挥。在采取这样的多级任务方式之后,一方面可以让编程基础相对薄弱的学生得到训练,另一方面能够为编程能力较强的学生提供自由发挥的空间,以满足不同层次学生的需求。

编程是实践数据结构必须具备的能力。但是在教学中发现,很多学生在数据结构课程的实践过程中不是没有想法,而是不知道如何通过编程去实现。由于数据结构是一门重要的专业基础课,一般学生在修完某种编程语言(如C/C++)后就开始学习此课程了,除少数对编程有浓厚兴趣、已经具有一定编程能力的学生外,多数学生在此阶段的编程能力还不是很强,这也就往往使得他们花费在调试程序上的时间远多于对程序的设计和编写。因此,上机任务的难度需根据学生的实际水平适时调整,让学生的编程能力得到锻炼和增强,以便为综合性设计打好基础。

4 完善验收方式,加强监督和管理

课内上机实验的考查是个很棘手的问题,一般实践课程的常规考查方法是以答辩的形式进行。学生在规定时间内讲解并运行程序,教师通过提问来判断学生的完成情况。这种方法还是比较有效的,能在有限的时间内了解学生的学习情况,特别是提问环节能够凸显很多问题。然而,课堂时间有限,有时一个班甚至多个班被安排同时上机,而且采用这种答辩的方式在课内完成对所有学生的检查是很难实现的。如果只安排一次最终的测试,部分自觉性不强的学生可能不会一直认真学习,仅仅在最后阶段突击,显然这也没有达到教学目的。因此,平时对课内上机实验不仅要加强监督和管理,验收方式也需灵活多样。举例来说,若课内上机一共安排10次,可根据教学内容分阶段地安排3次答辩形式的考查,如对链表、二叉树和图等重要的教学内容。这3次考查是每个学生都要完成的,每次指定一个最后期限,并且在此之前的任何上机时间也都可以验收。这样,既解决了课内上机的验收时间不够用的问题,也能掌握所有学生的学习情况。

5 结语

综上所述,由于数据结构是一门理论性和实践性都很强的计算机专业核心课程,如何在教学中使得每一堂上机实验课都有意义,而不流于形式是不容易的。当然不论采用何种方式,最终目的还是希望学生能够通过实验加深对理论知识的理解,在实践中增强专业技能,并真正做到学以致用。

注释

① 严蔚敏,吴伟民.数据结构(C语言版)[M].北京:清华大学出版社,2007:I.

② 谭浩强.C语言程序设计(第二版)[M].北京:清华大学出版社,1999:X.

③ 李克清.《数据结构》课程中的案例教学初探[J].长江大学学报:自然科学版,2004.1(4):135-136.

篇5:数据结构实验报告

1.问题描述

为某个单位建立一个员工通讯录管理系统,可以方便地查询每一个员工的办公室电话号码、手机号码及电子邮箱。2.设计分析

在本设计中,整个通讯录可以采用顺序表或链表方式存储。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除以及整个通讯录表的输出。3.员工通讯信息的结构类型定义和通讯录链表的结点类型

typedef struct { char num[5];/*员工编号*/ char name[8];/*员工姓名*/ char phone[9];/*办公室电话号码*/ char call[12];/*手机号码*/ }DataType;/*员工通讯信息的结构类型*/ typedef struct node { DataType data;/*结点的数据域*/ struct node *next;/*结点的指针域*/ }ListNode,*LinkList;/*通讯录链表的结构类型*/ 4.实验源代码

// Address_List1.cpp : 定义控制台应用程序的入口点。// //#include “stdafx.h” #include“stdio.h” #include “stdlib.h” # include #include #include using namespace std;#define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 typedef intStatus;typedef struct { /*员工通讯信息的结构类型定义*/

char num[5];

/*员工编号*/

char name[8];

/*员工姓名*/ char phone[9];

/*办公室电话号码*/

char call[12];

/*手机号码*/

char mail[15];

/*邮箱*/ }DataType;/*通讯录单链表的结点类型*/ typedef struct node {

DataType data;

/*结点的数据域*/

struct node *next;

/*结点的指针域*/ }LNode, *LinkList;void CreateList(LinkList &L){//逆位序输入n个元素的值,建立带表头结点的单链线性表L

LinkList p;

int i,n;

L =(LinkList)malloc(sizeof(LNode));

L->next = NULL;

cout <<“请输入创建员工的通讯信息的个数:”;

cin >> n;

for(i = 0;i

p =(LinkList)malloc(sizeof(LNode));

cout <<“

请输入员工信息”<

cout <<“

员工编号:”;

cin>> p->data.num;

cout <<“

员工姓名:”;

cin >> p->data.name;

cout <<“办公室电话号码:”;

cin >> p->data.phone;

cout <<“

手机号码:”;

cin >> p->data.phone;

cout <<“

员工邮箱:”;

cin >> p->data.mail;

cout <<“================================”<< endl;

p->next = L->next;

L->next = p;

} } void InitList(LinkList &L){//初始化线性表

L =(LinkList)malloc(sizeof(LNode));

L->next = NULL;} void DestroyList(LinkList &L){//销毁线性表

LinkList p, q;

p = L;

q = p->next;

while(q!= NULL)

{ free(p);

} } int ListEmpty(LinkList &L){//判断线性表是否为空

if(L->next == NULL)

return TRUE;

else

return FALSE;} int ListLength(LinkList &L){//求链表的长度

LinkList p = L;

int c = 0;

while(p->next!= NULL){

c++;

p = p->next;

}

return(c);} void GetElem(LinkList &L){//取链表第i个数据元素

LinkList p = L->next;

string s;

cout <<“输入员工的编号或名字:”;

cin >> s;

while(p!= NULL)//根据相关信息,查找员工。

{

if(p->data.num == s || p->data.name == s || p->data.phone == s || p->data.call == s || p->data.mail == s)

break;

p = p->next;

}

if(!p)

cout <<“查无此人!”<< endl;

else{

cout <<“

员工信息”<< endl;

cout <<“

员工编号:”<< p->data.num << endl;

cout <<“

员工姓名:”<< p->data.name << endl;

cout <<“办公室电话号码:”<< p->data.phone << endl;

cout <<“

手机号码:”<< p->data.phone << endl;

cout <<“

员工邮箱:”<< p->data.mail << endl;

cout <<“================================”<< endl;

} } void ReviseList(LinkList &L)//修改信息 {

LinkList p = L->next;

char j[20];

string s;

int i;

cout <<“输入员工的编号或名字:”;

cin >> s;

while(p!= NULL){//根据相关信息,查找员工。

if(p->data.num == s || p->data.name == s || p->data.phone == s || p->data.call == s || p->data.mail == s)

break;

p = p->next;

}

if(!p)

cout <<“查无此人!”<< endl;

else

{

cout <<“n想修改什么信息?_1-编号 2-姓名 3-办公室电话号码 4-手机号码 5-邮箱”<< endl;

cin >> i;

cout <<“想修改成什么?”<< endl;

cin >> j;

switch(i){

case 1:strcpy(p->data.num, j);break;

case 2:strcpy(p->data.name, j);break;

case 3:strcpy(p->data.phone, j);break;

case 4:strcpy(p->data.call, j);break;

case 5:strcpy(p->data.mail, j);break;

default: cout <<“输入错误,”<< endl;

system(“pause”);

}

cout <<“修改完毕!”;

system(“pause”);

return;

} } void ListDelete(LinkList &L)//删除第i个元素 {

LinkList p, q;

int j = 0,i;p = L;

cout <<“请输入你要删除第几个员工的信息:”;

cin >> i;

while(p->next && j < i1)//删除位置不合理

cout <<“删除位置不合理”<< endl;

q = p->next;

p->next = q->next;//删除并释放结点

free(q);} void ListInsert(LinkList &L){

LinkList s, p = L;

s =(LinkList)malloc(sizeof(LNode));

cout <<“

请输入员工信息”<< endl;

cout <<“

员工编号:”;

cin >> s->data.num;

cout <<“

员工姓名:”;

cin >> s->data.name;

cout <<“办公室电话号码:”;

cin >> s->data.phone;

cout <<“

手机号码:”;

cin >> s->data.phone;

cout <<“

员工邮箱:”;

cin >> s->data.mail;

cout <<“================================”<< endl;

s->next = p->next;

p->next = s;}

void PrintList(LinkList &L)//打印线性表 {

LinkList p = L->next;

int i = 1;

if(p == NULL)

cout <<“通讯录为空!”<< endl;

while(p!= NULL)

{

cout <<“第 ”<

cout <<“

员工编号:”<< p->data.num << endl;

cout <<“

员工姓名:”<< p->data.name << endl;

cout <<“办公室电话号码:”<< p->data.phone << endl;

cout <<“

手机号码:”<< p->data.phone << endl;

cout <<“

员工邮箱:”<< p->data.mail << endl;

cout <<“==============================”<< endl;

p = L;

cout <<“请输入你要删除第几个员工的信息:”;

cin >> i;

while(p->next && j < i1)//删除位置不合理

cout <<“删除位置不合理”<< endl;

q = p->next;

p->next = q->next;//删除并释放结点

free(q);} void ListInsert(LinkList &L){

LinkList s, p = L;

s =(LinkList)malloc(sizeof(LNode));

cout <<“

请输入员工信息”<< endl;

cout <<“

员工编号:”;

cin >> s->data.num;

cout <<“

员工姓名:”;

cin >> s->data.name;

cout <<“办公室电话号码:”;

cin >> s->data.phone;

cout <<“

手机号码:”;

cin >> s->data.phone;

cout <<“

员工邮箱:”;

cin >> s->data.mail;

cout <<“================================”<< endl;

s->next = p->next;

p->next = s;}

void PrintList(LinkList &L)//打印线性表 {

LinkList p = L->next;

int i = 1;

if(p == NULL)

cout <<“通讯录为空!”<< endl;

while(p!= NULL)

{

cout <<“第 ”<

cout <<“

员工编号:”<< p->data.num << endl;

cout <<“

员工姓名:”<< p->data.name << endl;

cout <<“办公室电话号码:”<< p->data.phone << endl;

cout <<“

手机号码:”<< p->data.phone << endl;

cout <<“

员工邮箱:”<< p->data.mail << endl;

cout <<“==============================”<< endl;break;

case 4:

//添加

ListInsert(L);

cout <<“添加信息成功!”;

system(“pause”);

break;

case 5:

PrintList(L);

ListDelete(L);

cout <<“删除信息成功!”;

system(“pause”);

break;//输出全部信息

case 6:

PrintList(L);

system(“pause”);

break;

case 7:

cout <<“该通讯录共有 ”<< ListLength(L)<<“ 员工信息!”<< endl;;

system(“pause”);

break;

default:

cout <<“输入错误!”<< endl;

system(“pause”);

}

篇6:数据结构实验报告

一. 题目要求

1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历;

3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二. 解决方案

对于前三个题目要求,我们用一个程序实现代码如下 #include #include #include #include “Stack.h”//栈的头文件,没有用上

typedefintElemType;

//数据类型 typedefint Status;

//返回值类型 //定义二叉树结构 typedefstructBiTNode{ ElemType

data;

structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree;intInsertBST(BiTree&T,int key){//插入二叉树函数

if(T==NULL){

T =(BiTree)malloc(sizeof(BiTNode));

T->data=key;

T->lChild=T->rChild=NULL;

return 1;} else if(keydata){ InsertBST(T->lChild,key);} else if(key>T->data){

InsertBST(T->rChild,key);} else

return 0;} BiTreeCreateBST(int a[],int n){//创建二叉树函数 BiTreebst=NULL;inti=0;while(i

//数据域

InsertBST(bst,a[i]);

i++;} returnbst;} int Delete(BiTree&T)

{

BiTreeq,s;

} if(!(T)->rChild){ //右子树为空重接它的左子树

q=T;T=(T)->lChild;free(q);}else{

if(!(T)->lChild){ //若左子树空则重新接它的右子树

q=T;T=(T)->rChild;}else{ q=T;s=(T)->lChild;while(s->rChild){

q=s;s=s->rChild;}

(T)->data=s->data;//s指向被删除结点的前驱

if(q!=T)

q->rChild=s->lChild;

else

q->lChild=s->lChild;

free(s);} } return 1;

//删除函数,在T中删除key元素 intDeleteBST(BiTree&T,int key){ if(!T)return 0;else{

if(key==(T)->data)return Delete(T);

else{

if(key<(T)->data)

returnDeleteBST(T->lChild,key);

else

returnDeleteBST(T->rChild,key);

} } } intPosttreeDepth(BiTree T){//求深度

inthr,hl,max;if(!T==NULL){ hl=PosttreeDepth(T->lChild);hr=PosttreeDepth(T->rChild);max=hl>hr?hl:hr;return max+1;} else

return 0;

} void printtree(BiTreeT,intnlayer){//打印二叉树 if(T==NULL)return;printtree(T->rChild,nlayer+1);for(inti=0;i

”);} printf(“%dn”,T->data);printtree(T->lChild,nlayer+1);} void PreOrderNoRec(BiTree root)//先序非递归遍历 { BiTree p=root;BiTreestack[50];intnum=0;while(NULL!=p||num>0){

while(NULL!=p)

{

printf(“%d ”,p->data);

stack[num++]=p;

p=p->lChild;

}

num--;

p=stack[num];

p=p->rChild;} printf(“n”);} void InOrderNoRec(BiTree root)//中序非递归遍历 { BiTree p=root;

} intnum=0;BiTreestack[50];while(NULL!=p||num>0){ while(NULL!=p){

stack[num++]=p;

p=p->lChild;} num--;p=stack[num];printf(“%d ”,p->data);p=p->rChild;} printf(“n”);void PostOrderNoRec(BiTree root)//后序非递归遍历 { BiTree p=root;BiTreestack[50];intnum=0;BiTreehave_visited=NULL;

while(NULL!=p||num>0){

while(NULL!=p)

{

stack[num++]=p;

p=p->lChild;

}

p=stack[num-1];

if(NULL==p->rChild||have_visited==p->rChild)

{

printf(“%d ”,p->data);

num--;

have_visited=p;

p=NULL;

}

else

{

p=p->rChild;

} } printf(“n”);}

int main(){//主函数

printf(“

---------------------二叉排序树的实现-------------------”);printf(“n”);int layer;inti;intnum;printf(“输入节点个数:”);scanf(“%d”,&num);printf(“依次输入这些整数(要不相等)”);int *arr=(int*)malloc(num*sizeof(int));for(i=0;i

scanf(“%d”,arr+i);} BiTreebst=CreateBST(arr,num);printf(“n”);printf(“二叉树创建成功!”);printf(“n”);layer=PosttreeDepth(bst);printf(“树状图为:n”);printtree(bst,layer);int j;int T;int K;for(;;){ loop: printf(“n”);printf(“

***********************按提示输入操作符************************:”);printf(“n”);printf(“

1:插入节点

2:删除节点

3:打印二叉树

4:非递归遍历二叉树

5:退出”);scanf(“%d”,&j);

switch(j){

case 1:

printf(“输入要插入的节点:”);

scanf(“%d”,&T);

InsertBST(bst,T);

printf(“插入成功!”);printf(“树状图为:n”);

printtree(bst,layer);

break;

case 2:

}

printf(“输入要删除的节点”);scanf(“%d”,&K);DeleteBST(bst,K);printf(“删除成功!”);printf(“树状图为:n”);printtree(bst,layer);break;case 3: layer=PosttreeDepth(bst);printtree(bst,layer);break;case 4:

printf(“非递归遍历二叉树”);printf(“先序遍历:n”);PreOrderNoRec(bst);printf(“中序遍历:n”);InOrderNoRec(bst);

printf(“后序遍历:n”);

PostOrderNoRec(bst);

printf(“树状图为:n”);

printtree(bst,layer);

break;case 5:

printf(“程序执行完毕!”);

return 0;} goto loop;} return 0;对于第四小问,要储存学生的三个信息,需要把上面程序修改一下,二叉树结构变为 typedefintElemType;

//数据类型 typedefstring SlemType;

typedefint Status;

//返回值类型 //定义二叉树结构 typedefstructBiTNode{ SlemType name;ElemType score;ElemType no;

//数据域 structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree;参数不是key,而是另外三个

intInsertBST(BiTree&T,intno,intscore,string name){//插入二叉树函数

if(T==NULL){

T =(BiTree)malloc(sizeof(BiTNode));

T->no=no;T->name=name;T->score=score;

T->lChild=T->rChild=NULL;

return 1;} else if(nono){ InsertBST(T->lChild,no,score,name);} else if(key>T->data){

InsertBST(T->rChild,no,score,name);} else

return 0;} 其他含参函数也类似 即可完成50个信息存储

用数组存储50个信息,查看以往代码

#include #include using namespace std;class student{ private: intnum;string name;int ob1;int ob2;intara;public: void set(inta,stringb,intc,int d);void show();int average();};void student ::set(inta,stringb,intc,int d){ num=a;name=b;ob1=c;ob2=d;ara=(c+d)/2;} void student::show(){ cout<<“学号:”<int main(){ cout<<“ 欢迎来到学生管理系统”<>numlock;switch(numlock){ case 0: cout<<“输入想查询的学号”<>i;if(i==j){ cout<<“该学号信息已被删除”<>j;delete[j]ptr;cout<<“删除成功”<>k;if(k!=j){

cout<<“该学号信息已经存在,添加失败”<

break;} cout<<“重新输入添加的学号”<>q;cout<<“输入姓名”<>w;cout<<“输入科目一的成绩”<>e;cout<<“输入科目二的成绩”<>r;ptr[k].set(q,w,e,r);break;case 3: for(m=1;m<20;m++){

for(int n=m+1;n<20;n++){

if(ptr[m].average()

student a;

a=ptr[m];

ptr[m]=ptr[n];

ptr[n]=a;

}}

ptr[m].show();} break;case 4: cout<<“谢谢使用”<

二叉排序树储存数据界面(储存学生信息略)

创建二叉树:

插入节点:

删除节点:

非递归遍历:

退出:

数组储存学生信息界面

分析查找效率:

因为二叉树查找要创建二叉树,而数组查找只创建一个数组,二叉树的创建时间比较长,所以对于数据量较少的情况下数组的查找效率比较高。但当数据量增加时,二叉树的查找优势就显现出来。所以数据量越大的时候,二叉树的查找效率越高。

四. 总结与改进

这个实验工作量还是很大的,做了很久。树状图形输出还是不美观,还需要改进。

一开始打算用栈实现非递归,但是根据书里面的伪代码发现部分是在C++编译器里运行不了的(即使补充了头文件和数据的定义),所以之后参考了网上的数组非递归,发现其功能和栈相似。

递归遍历的实现比非递归的遍历真的简单很多。

篇7:数据结构实验报告

14学年—15学年第 2 学期 数据结构实验任务书

专业名称: 计算机科学与技术 实验学时: 4 课程名称:数据结构 任课教师: 史绍强 实验题目:图的最短路径算法的实现

实验环境: Visual C++ 实验目的:

1.掌握图的邻接矩阵的存储定义;

2.掌握图的最短路径(Dijsktra)算法的实现。

实验内容:

设计北京林业大学的校园平面图,所含景点不少于8个。以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。要求将这些信息保存在文件graph.txt中,系统执行时所处理的数据要对此文件分别进行读写操作。

1.从文件graph.txt中读取相应数据, 创建一个图,使用邻接矩阵表示图(算法6.1); 2.景点信息查询:为来访客人提供校园任意景点相关信息的介绍;

3.问路查询:为来访客人提供校园任意两个景点之间的一条最短路径(算法6.10)。

选做内容(对文件进行操作,相应信息变化后,再次进行景点信息查询和问路查询时应该有所体现)

1.修改一个已有景点的相关信息; 2.增加一个新景点及其相关信息; 3.增加一条新的路径;

4.删除一个景点及其相关信息; 5.删除一条路径。

实现提示:

1.校园道路是双向通行的,可设校园平面图是一个带权的无向图,用邻接矩阵表示此无向网。

typedef struct{

char name[100];char info[10000];}VertexType;//顶点结构 typedef struct{

VertexType vexs[10];int arcs[100][100];//邻接矩阵

int vexnum,arcnum;//顶点个数,边的个数

}MGraph;//图结构

2.将图的顶点信息和边的信息用数据文件graph.txt存储,数据文件格式可以设置如下形式:

图中顶点数 边的数目

景点名称 景点信息

始点

终点

路径长度

如可以在文件graph.txt中存储以下数据: 8 15 女生宿舍 有南北两栋,24层,是北林最漂亮的宿舍楼 小南门 经由北林主路通往学校北门,交通便利 „„

正门 主楼 80 正门 图书馆 400 „„

程序运行的参考结果下图:

实验要求:

(1)程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。(2)程序要添加适当的注释,程序的书写要采用缩进格式。

(3)根据实验报告模板详细书写实验报告,在实验报告中给出校园平面图。

(4)校园平面图中的校园景点信息保存在文件graph.txt中,源程序保存为“Graph_search.cpp”,实验报告命名为“实验报告3.doc”。将这三个文件压缩为一个文件,每个同学自己先将压缩文件命名为::学号姓名.rar,上传到welcomeyouto@tust.edu.cn(由各班学习委员统一打包压缩发送,学委发送的文件格式为班级实验报告3,如132011班实验报告3)。

篇8:《数据结构》课程实验报告

实验教学是学生从学习理论知识到走向社会的桥梁, 对提高学生综合素质、培养学生创新精神和实践能力有着理论教学不可替代的特殊作用[1]。特别是主干课程的实践教学, 它是应用型人才培养中的关键环节[2]。课内实验是指与理论课相捆绑的实践教学, 即嵌入到专业基础课或专业课内的实验实践教学[3]。它是与理论教学并行实施的实践教学环节, 能够帮助学生深入理解和掌握所学的专业知识。

数据结构是随着处理对象的复杂性不断增加而发展起来的一门课程, 作为计算机专业的核心课程, 在专业人才培养链条中占有举足轻重的地位[4,5,6,7]。数据结构主要研究数据在抽象视图和实现视图中的表示和处理方法[8,9]。抽象视图涉及的是数据结构的理论性部分, 实现视图主要体现的是数据结构的实践性, 理论指导实践, 实践支撑理论, 因此设计有助于课堂理论教学的实验教学方案是非常有必要的[10]。它可以解决学生对所学知识缺乏必要感性认识的问题, 将知识传授、技能训练、能力培养融于一体, 使所学理论知识在实验中得到验证和应用[11]。

栈和队列是两种非常重要的数据结构, 它们有非常多的实际应用并且是实现其他复杂结构的基础, 因此为了帮助学生掌握并灵活运用这两种结构, 本文给出一种栈和队列的实验教学方案。该方案的设计思路也可以应用于其他数据结构或课程的实验教学方案的设计。

二、认识两种重要的数据结构———栈和队列

栈和队列是两种运算受限的线性表, 它们的插入和删除运算都被限制在表的端点处进行, 只是具体的受限规则不一样[12,13]。

(一) 学习对象

栈 (stack) 是运算受限的线性表, 它被限制在表的一端进行插入和删除操作。能进行插入和删除的一端称为栈顶, 另一端称为栈底。正是由于它插入和删除操作上的限制使得它具有了一种独特的“后进先出” (LIFO) 的特性。栈的LIFO特性使得它具有非常多的应用, 如:符号平衡问题、中缀表达式转换为后缀表达式问题、后缀表达式的计算问题、函数调用的实现 (包括递归函数的实现) 、在股票市场中查找划分、Web浏览器中的网页访问历史、文本编辑器中的撤销序列等。此外, 栈还是其他很多算法的辅助数据结构和其他数据结构的组成部分。

队列 (queue) 也是一种运算受限的线性表, 它被限制在表的一端进行插入操作, 在表的另一端进行删除操作。进行插入操作的一端称为队尾, 进行删除操作的一端称为队首。正是由于它插入和删除操作上的限制使得它具有了一种独特的“先进先出” (FIFO) 的特性。队列的FIFO特性使得它具有非常多的应用, 如:操作系统中的作业调度、异步数据转换、多道程序设计等。此外, 队列还是其他很多算法的辅助数据结构和其他数据结构的组成部分。

(二) 学习目标

学习这两种重要的线性结构需要学生重点消化的知识点有: (1) 栈/队列的概念、类型定义及基本操作的定义和实现; (2) 栈/队列的结构特性; (3) 栈/队列的灵活应用。

为了配合栈和队列的理论教学, 帮助学生理解和掌握上述知识点, 我们需要精心设计栈和队列的实验教学方案。

三、栈和队列的实验教学方案设计

(一) 实验题目设计

根据栈和队列的学习目标和遵循循序渐进的学习和教学原则, 实验题目被分为以下三个层次:基础型实验题目、设计型实验题目和加强理解型实验题目。

所谓基础型实验是指围绕课程讲授的栈/队列的物理实现和其基本运算的实现来设置的实验题目。设计基础型实验的目的是, 通过实践的方式验证课堂上讲授的重要知识点, 给学生切身的感受, 摆脱“纸上谈兵”的感觉, 这种立体的感受有助于学生深入理解和掌握这些知识点。设计型实验要求学生能分别运用栈/队列解决简单应用问题。这类实验题目主要是用来引导和加强学生对栈/队列的灵活运用。设计加强理解型实验的目的是强化学生对栈和队列的结构特性的理解和体会。为了达到这个目的, 加强理解型实验题目的设计思路有两个方面: (1) 引导学生去思考并解决这样两个问题:能否利用栈的LIFO特性来实现队列的FIFO特性?能否利用队列的FIFO特性来实现栈的LIFO特性? (2) 让学生实现其他更为复杂的栈和队列。

在栈的理论教学过程中可以开设栈的基础型实验, 在栈的理论教学结束后可以开设栈的设计型实验, 在队列的理论教学过程中可以开设队列的基础型实验, 在队列的理论教学结束后可以开设队列的设计型实验和加强理解型实验题目。表1给出了具体的实验安排。

学生必须在相关内容的理论教学过程中利用自己的课外时间完成全部基础型实验题目, 教师根据学时安排选择1~2道设计型实验题目让学生在上机课上完成, 未选择的题目应向学生提供完整的源代码和设计说明。相关内容的理论教学结束后, 学生必须利用自己的课外时间完成加强理解型实验题目中的第1题和第2题, 剩下两题可以选做。

(二) 教学方法

因为三种类型实验的要求、难易程度不同, 因此在学生参与形式、教师参与程度、教师参与方式等方面需要区别对待。表2给出了对三种类型实验在上述这几个方面的设计。

基础型实验要求每位学生利用课外时间独立完成, 教师全程参与指导。所谓全程参与指导是指从算法基本思想到算法实现的各个环节 (包括编程技巧、程序调试与测试等) 都要参与指导。参与方式多种多样, 例如利用QQ等即时通讯工具进行指导, 约定时间和地点进行答疑, 等等。

设计型实验要求每位学生在上机课上独立完成, 教师前期参与指导。所谓前期参与指导是指教师参与学生在算法设计环节的讨论, 教师可以给出提示, 同时鼓励学生设计不同的算法。参与方式是面对面的交流。

加强理解型实验要求每位学生利用课外时间独立完成, 教师后期参与指导。所谓后期参与指导是指教师在收齐学生提交的源码和设计报告后, 对其进行分析总结, 并将总结结果以班级为单位采用面对面的方式反馈给学生。

(三) 考核方法

对三种类型的实验采用不同的考核办法。表3给出了这方面的设计。

对基础型实验不做专门考核的原因是学生基础型实验完成的好坏会直接影响设计型实验和加强理解型实验的完成, 因此对其他两种类型实验的考核间接考核了基础型实验。

对设计型实验的考核分两个部分:一是本次上机课上实验的完成情况, 包括程序是否调试成功、程序的运行结果是否正确, 代码编写的质量等;二是本次上机课结束后提交的实验报告的完成情况, 包括内容是否完成、书写是否规范等。

对加强理解型实验的考核主要是考核学生提交的源代码和设计报告的完成质量。

设计型实验的成绩占总实验成绩的70%, 加强理解型实验的成绩占总实验成绩的30%。

四、结语

篇9:《数据结构》课程实验报告

数据结构实验教学实例“数据结构”课程是高等院校理工科专业的一门必修课程,是计算机科学领域中的一门重要基础课。该课程主要介绍如何利用算法实现各种数据在计算机中的存储和处理,其重点学习内容包括:顺序表、链表、栈和队列、数组、树与森林、图、查找、排序等。通过本课程的学习,使学生深透地理解数据结构的基本概念和基础算法,培养学生良好的程序设计技能,锻炼学生通过编程解决实际问题的能力。为后续相关专业课程的学习打下坚实的基础,为从事计算机科学领域的研究和开发打下理论和实验的基础。

“数据结构”的课程实验不仅帮助学生理解数据结构的基本概念和基础算法,而且培养学生良好的算法技能,锻炼学生通过编程解决实际问题的能力。

一、“数据结构”实验教学中存在的问题

在大多数院校,按照教学大纲和实验大纲安排,“数据结构”课程一般在大学期间的第三学期或者第四学期开设,并且前期已开设一门程序设计基础课程。其总教学学时72学时,其中理论教学54学时,实验教学18学时。目前,在实验教学的整个过程中存在以下几个问题。

1.学生对实验教学重视程度不够。“数据结构”课程的理论知识多是用伪代码写的,学生往往侧重于算法的理解,忽略了算法的实现。教材中的算法往往是伪代码或者是程序段,学生要想将算法实现,就需要把伪代码或者程序段放到带有数据的实例中,用正确的、可执行的程序实现,然后调试运行,查看算法结果。而这一过程,一方面,比较复杂;另一方面,不是“数据结构”课程的重点,所以往往会被老师和学生忽略。但是这一过程恰恰是帮助学生透彻理解算法,帮助学生把算法与实际应用结合。

2.实验项目设置关联性。每一个实验项目对应一定的理论知识,实验项目之间不相关,学生做完做不完都不会影响下次实验,导致很多学生对一些实验不够重视,主动性不高。有一些学生在个别实验项目没有做完的情况下,没有主动的在课下完成,在下次实验课上也没有主动积极的补做,时间久了,越积越多,最终导致这门课程学得不好,也必然影响后续课程的学习。

3.实验项目内容设置缺乏与实例的结合。实验不仅仅是理论知识巩固,更是知识总结和能力的提高。实验内容的设置不能仅仅考虑理论知识体现,更应考虑如何让学生在理解理论的同时和实际应用相结合,培养学生把理论应用于实际的主动性。目前,大多数学生学习态度是被动的,不愿意去多想,不愿意去扩展。教师在设计实验项目时要引导他们去联系实际,去扩展内容。这样持续下去,学生才会在掌握理论知识的同时,和实际应用相结合,掌握算法的精髓。

针对以上存在的问题,在“数据结构”实验教学中我们设计了与实例紧密结合的分层次的实验教学模式。这一教学模式由易到难、由单一到综合,逐步培养学生的算法编写能力。我们将整个实验教学分成基础篇、提高篇、专项篇等三个阶段,每个阶段完成一定的知识目标和理论目标。

二、“数据结构”实验教学模式

多数高校的教学计划中,“数据结构”课程的实验教学是18学时,我们将18学时分为9个实验项目,分别为:顺序表的操作、单链表的操作、栈的操作、队列的操作、数组的操作、二叉树的操作、图的操作、查找操作、排序操作。不同实验项目结合不同的实例,划分到不同的层次,具体实施如下。

1.基础篇。“数据结构”实验教学的初级阶段属于基础篇的内容,是对教材的理论知识点的简单实现。实验项目中顺序表的操作、单链表的操作、栈的操作、队列的操作等属于基础篇的实验,这一阶段的实验实例相对简单,重点在于让学生掌握基本的数据结构类型。这一阶段的顺序表实验和单链表实验用的实例是学生成绩管理系统,这里对学生的信息只存储学号和姓名,成绩信息可以存储一门到三门课程的成绩。这样数据比较简单,着重让学生掌握线性表的顺序存储和链式存储。对于栈的操作采用的是火车车厢重排问题的案例,这里要求学生也要通过顺序和链式两种存储方式实现。对于队列操作的实验采用的实例是银行排队叫号系统。在银行排队叫号系统这一实例中要求学生不能仅仅使用一个队列,一次简单的先进先出操作实现,需要学生考虑到一个排号队列,多个叫号队列的情况,让学生有所思考,从而实现对队列操作的深入理解。

2.提高篇。通过基础篇实验的学习,学生对线性表、栈、队列等基本数据结构有了深刻的认识,对顺序存储结构和链式存储结构的使用有了一定的基础。接下来要学习的是较为复杂的数据结构:数组、树和图。数组的操作、二叉树的操作、图的操作等实验就是提高篇要完成的实验内容。这一阶段接触的是复杂的数据结构,但核心还是运用基础篇学习的基本数据结构,实例的选择也会较为复杂。数组操作的实验选择的实例是超市物品购买数据存储系统。这个实例中要处理的数据不是简单的数组,其需要的数组较大,但存储的数据较少,这就是典型的系数矩阵。在现实生活中这类数据经常遇到,对这类数据的存储和操作就要通过数组操作的实验进行学习和掌握。树操作通过二叉树实现的,所以树这一章节的实验设置的是二叉树的操作,结合的实例是磁盘文件的记录系统,着重是运用线索二叉树的知识。图操作的实验用的实例是高速公路交通网这一经典案例。这一实例不仅运用了图的遍历操作,还用了最短路径等经典算法。通过这些提高篇的实验项目学生对复杂的数据结构有所掌握,也对数据结构的复杂应用有所了解。

3.专项篇。对于大多数数据的处理都会用到两种典型的操作:查找和排序。数据结构课程的后期都会讲到这两项内容,同样也会有两项专门的实验来对应。查找操作和排序操作采用的实例分别是奥运会奖牌的排行榜的查询和排名,着重让学生掌握不同的查找方法和排序方法。需要学生熟记一些经典的查找算法和排序算法,会对不同的算法比较优劣,同时也对时间复杂度和空间复杂度有所了解。

基础篇、提高篇、专项篇这三个实验阶段,由易到难,相辅相承,让学生逐步掌握不同数据结构的定义和使用,进而培养学生的算法编写能力。具体在实施过程中根据学生的实际接受情况和掌握情况对具体实验内容进行增减。

三、实验效果

我们在2012级学生的“数据结构”课程教学中开始探索这一实验教学模式,在2013级学生的“数据结构”课程教学中进一步完善,效果很好。学生学习的积极性明显提高,学习效果也有了明显的提高。

经过一系列的实验教学实践,我们针对“数据结构”课程,探索出了由基础篇、提高篇、专项篇这个三个阶段组成的与实例紧密结合的实验教学模式。这一教学模式由易到难,逐步培养学生的算法编写能力。今后,我们将继续结合教学实际进一步完善实验教学文件、丰富“数据结构”课程实验内容和课程设计的内容,从而提升“数据结构”课程的教学效果。

参考文献:

[1]黄贤英.计算机专业实验教学体系建设思考[J].实验技术与管理,2009,(10):94-100.

[2]马彬.三维一体化的计算机实验教学建设体系[J].实验室研究与探索,2013,(10):163-165.

上一篇:花坛标语下一篇:党员先进性测评自评总结