数据结构课程实验大纲
课程基本信息 | |||
课程名称:数据结构 | 课程编号:02700433 | 英文名称:Data Structure | |
课程类型: 专业必修课(专业基础平台课) | 开课学期:4 | ||
总 学 时:86 | 理论学时:54 | 实验学时:32 | 学分:4 |
适用对象:计算机科学与技术 | |||
考核方式:考查 | 先修课程:离散数学、C++程序设计 | ||
开课单位:计算机与信息工程学院 | 大纲版本:2017 | ||
制定(修订)人:杨伟 | 审核人: 李征 | 批准人: 韩道军 | |
制定(修订)日期:2017.05 | 审核日期: 2017.06 | 批准日期:2017.06 |
一、实验简介
本课程是一门理论和实践紧密结合的基础课,它的任务是讨论现实世界中的各种逻辑结构、在计算机中的存储结构以及实现各种操作的算法问题,为今后进一步学习后续专业课程,进行软件开发和应用打好基础。
实验要求学生采用C++语言编程,实现理论课所学的数据组织、存储、处理的基本方法。要求学生具备基本的程序设计能力,能够基于给定的算法思想运用C++进行编程实现,能自如地根据具体问题的内容设计相应的算法,并根据输入数据进行合理性校验。具体要求如下:
1、验证性实验以传授知识为主,要求学生掌握基础知识、基本技能。在教学中教师讲解基本数据结构和算法。教师辅导多一些,教师在传授知识的同时,逐步培养学生严格认真,独立思考的实验态度。
2、综合性实验以掌握解决问题的方法为主线。综合性实验要求学生利用所学的数据结构和算法,在实验过程中解决所碰到的具体问题,通过实验报告总结提高。教师以解答学生的疑问为主,当学生在实验中遇到问题时,不是简单地帮助学生排除故障,而是提出产生故障的几种可能性,由学生自行排除,鼓励学生提出问题和不同的见解。
二、实验目标
(一)实验具体目标
目标1. 熟练掌握线性表(包括顺序表、链表、栈和队列)的存储方式及其操作实现;
目标2. 掌握二叉树的存储方式、遍历操作实现及构造赫夫曼树和赫夫曼编码的方法;
目标3. 掌握图的存储方式、遍历算法及基于图解决实现应用如最短路径或关键路径的方法;
目标4. 掌握折半查找和二叉排序树及常用排序算法的实现方法。
(二)实验目标与课程目标的关系
实验目标 | 支撑的课程目标 | 支撑体现 |
目标1. 熟练掌握线性表(包括顺序表、链表、栈和队列)的存储方式及其操作实现。 | 课程目标1. 理解数据结构的基本概念、计算机内部数据对象的表示和特性。掌握线性表、树、图等数据逻辑结构、存储结构及其差异以及各种操作的实现。 课程目标2. 能够针对实际问题选择合适的数据结构和方法设计出结构清晰、正确易读、复杂性较优的算法,同时掌握对算法进行时间、空间复杂度分析的基本技能。 | 体现在学生通过编程实现,可以深入理解线性表的逻辑结构、物理结构等概念,掌握线性表基本操作的编程实现,理解线性表插入、删除等操作过程中数据元素的移动现象,培养学生编写程序时,要考虑程序的强壮性,熟练掌握通过函数参数返回函数结果的办法。 |
目标2. 掌握二叉树的存储方式、遍历操作实现及构造赫夫曼树和赫夫曼编码的方法。 | 课程目标1. 理解数据结构的基本概念、计算机内部数据对象的表示和特性。掌握线性表、树、图等数据逻辑结构、存储结构及其差异以及各种操作的实现。 | 体现在学生采用结构化方法对实际问题进行求解,将复杂工程问题逐步细化为功能简单的小模块,最后集成解决复杂问题。 |
目标3. 掌握图的存储方式、遍历算法及基于图解决实现应用如最短路径或关键路径的方法。 | 课程目标1. 理解数据结构的基本概念、计算机内部数据对象的表示和特性。掌握线性表、树、图等数据逻辑结构、存储结构及其差异以及各种操作的实现。 | 体现使学生掌握图的邻接矩阵和邻接表存储方式,了解如何基于图模型解决实际问题,并将这种方法应用到解决复杂工程问题领域。 |
目标4.掌握折半查找和二叉排序树及常用排序算法的实现方法。 | 课程目标2. 能够针对实际问题选择合适的数据结构和方法设计出结构清晰、正确易读、复杂性较优的算法,同时掌握对算法进行时间、空间复杂度分析的基本技能。 课程目标3. 掌握排序和查找等算法的原理及实现,能够综合运用所学的数据结构知识、算法分析与设计知识,为解决复杂工程问题奠定良好基础。 | 体现在使学生掌握排序和查找等算法的原理及实现,能够综合运用所学的数据结构知识、算法分析与设计知识,为解决复杂工程问题奠定良好基础。 |
(三)实验对解决复杂工程问题能力的培养
本课程的实验教学过程应充分体现和落实对学生解决复杂工程问题能力的培养,理解复杂工程的内涵、认识复杂工程问题的特征,有针对性的培养和提高学生在计算机应用领域中解决复杂工程问题的能力。
在实验原理部分,注重培养学生深入理解和掌握线性表、树、图的逻辑结构、存储结构及其各种操作的实现,理解工程实践中常见的查找算法和排序算法、用计算机求解实际问题的基本思维方法,掌握分析问题和解决问题的能力;在实验方法和步骤部分,根据实验支撑的课程目标设计合适的实验内容,其难度和深度应能够体现复杂工程问题的特征。总之,本课程的实验教学通过实验原理学习、实验步骤实施、实验报告撰写等环节充分贯彻培养学生解决复杂工程问题能力的理念和要求,实现本课程目标的达成。
三、实验内容及基本要求
(一)实验内容
实验项目1 顺序表的操作(4学时)
1. 实验内容
(1)编程实现顺序表的基本操作:建立顺序表,修改顺序表,插入顺序表,删除顺序表;
(2)采用顺序表结构编程实现:两个集合的运算:交集/并集/差集。
2. 基本要求
(1)掌握线性表的顺序存储结构及其操作实现;
(2)掌握顺序表及其基本操作的实现。
3. 支撑的实验目标
本实验项目可以支撑“实验目标1. 熟练掌握线性表(包括顺序表、链表、栈和队列)的存储方式及其操作实现。”。
通过该实验,可以深入理解顺序表的逻辑结构、物理结构等概念,掌握顺序表基本操作的编程实现,理解顺序表插入、删除等操作过程中数据元素的移动现象,培养学生编写程序时,要考虑程序的强壮性,熟练掌握通过函数参数返回函数结果的办法。
实验项目2 单链表的操作(4学时)
1. 实验内容
(1)编程实现单链表的基本操作:建立单链表,查找单链表,插入单链表,删除单链表;
(2)采用单链表结构编程实现:两个有序单链表的归并运算。
2. 基本要求
(1)掌握线性表的链式存储结构;
(2)掌握单链表及其基本操作的实现。
3. 支撑的实验目标
本实验项目可以支撑“实验目标1. 熟练掌握线性表(包括顺序表、链表、栈和队列)的存储方式及其操作实现。”。
本实验通过验证方式引导学生深入理解单链表的逻辑结构、物理结构等概念,掌握单链表的基本操作,为后续学习打下基础,以便更好地达成后续更高层次的课程目标。
实验项目3 栈和队列的操作(4学时)
1. 实验内容
(1)编程实现顺序栈和链栈的基本操作:建栈,取栈顶元素,入栈,出栈;
(2)编程实现循环队列和链队列的基本操作:建队列,取队头元素,入队,出队。
2. 基本要求
(1)掌握栈的顺序存储结构、链式存储结构及其基本操作;
(2)掌握队列的顺序存储结构、链式存储结构及其基本操作。
3. 支撑的实验目标
本实验项目可以支撑“实验目标1. 熟练掌握线性表(包括顺序表、链表、栈和队列)的存储方式及其操作实现。”。
本实验通过验证方式引导学生掌握顺序栈和链栈的基本操作,循环队列和链队列的基本操作,为后续学习打下基础,以便更好地达成后续更高层次的课程目标。
实验项目4 二叉树的操作(8学时)
1. 实验内容
(1)采用二叉链表结构建立二叉树;
(2)编程实现二叉树的先序、中序、后序和层序遍历;
(3)编程实现:求二叉树的高度和叶子结点个数;
(4)应用实现:哈夫曼编码。
2. 基本要求
(1)掌握二叉树的二叉链表存储方式及二叉树的特征;
(2)验证二叉树在二叉链表存储结构下遍历操作的实现;
(3)掌握赫夫曼树的构造方法和赫夫曼编码的方法。
3. 支撑的实验目标
本实验项目可以支撑“实验目标2. 掌握二叉树的存储方式、遍历操作实现及构造赫夫曼树和赫夫曼编码的方法。”。
本实验为综合性设计实验,使学生加深对二叉树遍历的理解,明确函数递归调用的含义,进一步认识赫夫曼编码的意义,达到课程目标的要求。
实验项目5 图的操作(6学时)
1. 实验内容
(1)采用邻接矩阵/邻接表建立图;
(2)采用深度优先/广度优先搜索方式遍历图;
(3)编程实现Dijkstra最短路径算法。
2. 基本要求
(1)掌握图的邻接矩阵和邻接表存储方式;
(2)掌握图的遍历算法;
(3)掌握图的实际应用——最短路径算法。
3. 支撑的实验目标
本实验项目可以支撑“实验目标3. 掌握图的存储方式、遍历算法及基于图解决实现应用如最短路径或关键路径的方法。”。
本实验为综合性设计实验,使学生掌握图的邻接矩阵和邻接表存储方式,了解如何基于图模型解决实际问题,以便达到课程目标的要求。
实验项目6 查找和排序的实现(6学时)
1. 实验内容
(1)编程实现两种查找方法:折半查找和二叉排序树。若查找成功,返回元素在有序数组中的位置和查找次数;若查找失败,返回出错标志和查找次数;
(2)在9种排序算法(直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序和基数排序)中选择5种排序算法进行编程实现。
2. 基本要求
(1)掌握折半查找和二叉排序树两种查找方法;
(2)掌握各种不同的排序算法。
3. 支撑的实验目标
本实验项目可以支撑“实验目标4.掌握折半查找和二叉排序树及常用排序算法的实现方法。”。通过验证方式引导学生掌握查找算法和排序算法的核心思想,以便更好地达成后续更高层次的课程目标。
(二)实验重点、难点及解决办法
实验的重点包括:顺序表的插入和删除操作、单链表的插入和删除、顺序栈的初始化操作、链队列的初始化操作、二叉树的先序、中序和层序遍历、图的深度优先遍历和广度优先遍历算法、折半查找和折半插入排序。
实验的难点包括:循环队列的入队/出队操作、赫夫曼树的构造方法和赫夫曼编码的实现方法、最短路径算法、希尔排序、堆排序和快速排序。
解决方法:通过在Codeblock集成开发环境中动态演示顺序表操作中九大函数的具体实现步骤与调用,让学生掌握数据结构算法的编程思路。对于编程基础差的学生,分享录制的演示视频到FTP中,供其随时模仿学习。对于实验的难点及学生反映的较难实现部分,不是简单地给出实现代码,而是通过讲解算法思想及可能的实现思路引导学生独立解决。对学生在实验过程中所碰到的问题,鼓励学生在撰写实验报告时对其进行总结。
四、实验项目设置
序号 | 实验名称 | 建议学时 | 类型 | 涉及的知识点 | 支撑的 课程目标 |
1 | 顺序表的操作 | 4 | 验证性 | 1)顺序表的基本操作:建立顺序表,修改顺序表,插入顺序表,删除顺序表。 | 课程目标1 |
2 | 单链表的操作 | 4 | 验证性 | 1)单链表的基本操作:建立单链表,查找单链表,插入单链表,删除单链表。 | 课程目标1 |
3 | 栈和队列的操作 | 4 | 验证性 | 1)顺序栈和链栈的基本操作:建栈,取栈顶元素,入栈,出栈; 2)循环队列和链队列的基本操作:建队,取队头元素,入队,出队。 | 课程目标1 |
4 | 二叉树的操作 | 8 | 综合性 | 1)创建二叉链表结构的二叉树; 2)二叉树的先序、中序、后序和层序遍历; 3)计算二叉树的高度和叶子结点个数; 4)赫夫曼树的构造方法和赫夫曼编码的实现方法。 | 课程目标2 |
5 | 图的操作 | 6 | 综合性 | 1)邻接矩阵和邻接表; 2)图的深度优先遍历和广度优先遍历算法; 3)图的实际应用——最短路径算法。 | 课程目标3 |
6 | 查找和排序的实现 | 6 | 验证性 | 1)折半查找; 2)二叉排序树; 3)折半插入排序; 4)希尔排序; 5)快速排序; 6)堆排序; 7)归并排序。 | 课程目标4 |
合计 | 32 |
五、考核方式与成绩评定
(一)考核方式与具体要求
实验成绩最终由平时成绩、实验报告成绩等组合而成,各部分所占比例如下:
(1)平时成绩(30%):根据课堂出勤情况和实验验收情况给出平时成绩。
(2)实验报告成绩(70%):根据实验报告的完成情况及完成质量给出实验报告成绩。
(二)成绩评定办法及依据
课程目标 | 考核方式/占比 | 考核内容与方法 | 成绩评定指标与依据 |
目标1. 熟练掌握线性表(包括顺序表、链表、栈和队列)的存储方式及其操作实现。 | 平时表现/30% | 实验1-3/课堂表现、实验验收 | 出勤情况和实验验收情况 |
实验报告/70% | 实验报告 | 报告内容完整度以及正确率 | |
目标2. 掌握二叉树的存储方式、遍历操作实现及构造赫夫曼树和赫夫曼编码的方法。 | 平时表现/30% | 实验4/课堂表现、实验验收 | 出勤情况和实验验收情况 |
实验报告/70% | 实验报告 | 报告内容完整度以及正确率 | |
目标3. 掌握图的存储方式、遍历算法及基于图解决实现应用如最短路径或关键路径的方法。 | 平时表现/30% | 实验5/课堂表现、实验验收 | 出勤情况和实验验收情况 |
实验报告/70% | 实验报告 | 报告内容完整度以及正确率 | |
目标4. 掌握折半查找和二叉排序树及常用排序算法的实现方法。 | 平时表现/30% | 实验6/课堂表现、实验验收 | 出勤情况和实验验收情况 |
实验报告/70% | 实验报告 | 报告内容完整度以及正确率 |
六、推荐教材和其它教学资源
(一)推荐教材
[1] 严蔚敏、李冬梅和吴伟民 著, 数据结构(第2版),人民邮电出版社,2016.
(二)其它教学资源
参 考 书:
[1] 率辉 著,数据结构高分笔记(2018版),机械工业出版社,2017.
[2] 程杰 著,大话数据结构,清华大学出版社,2011.
[3] 王红梅、胡明和王涛 著,数据结构(C++版 第2版),清华大学出版社,2011.
[4] 刘大有 著,数据结构(第3版),高等教育出版社,2017.
[5] 刘大有 著,数据结构学习指导与习题解析,高等教育出版社,2017.
[6] 马克·艾伦·维斯 著,冯舜玺 译,数据结构与算法分析 C语言描述,机械工业出版社,2019
在线课程平台:
[1] 爱课程网站——国家级精品资源共享课网站(《数据结构》)