数据结构实验和课程设计指导书Word文档格式.docx
- 文档编号:7177607
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:56
- 大小:59.85KB
数据结构实验和课程设计指导书Word文档格式.docx
《数据结构实验和课程设计指导书Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构实验和课程设计指导书Word文档格式.docx(56页珍藏版)》请在冰点文库上搜索。
教学经验表明,严格实施作业和实习的规范,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将能起到显著的促进作用。
数据结构及其算法的教学难点在于它们的抽象性和动态性。
虽然在书本教材和课堂授课(板书或投影胶片)中采用图示可以在一定程度上化抽象为直观,但很难有效展现数据结构的瞬间动态特性和算法的作用过程。
我们自主研发的“C程序可视化运行调试集成环境AnyviewC”,以及基于AnyviewC开发的数据结构、C程序设计、离散数学等课程的“编程作业与实验可视化网络平台”,打破了程序运行调试黑箱。
学生可通过AnyviewC平台可在线编写和可视化调试自己编写的程序,并接受系统的实时自动测评,极大提高了学生程序设计训练的效率和效果。
教师也可从繁重的书面作业批改工作中解脱出来,转到有针对性的现场指导和习题讲评上。
借助于互联网,AnyviewC平台将实验室“全天候”和“跨时空”地拓广到每位学生个人的微机或移动终端上。
根据教学计划,本学期数据结构课程:
1.课堂理论课48学时。
2.实验室研讨课16学时。
3.课程知识测验。
主要题型是简答题,随课程进度完成测验。
4.在“AnyviewC编程作业与实验可视化网络平台”上机完成约46道必做题,学有余力的同学还可以加做选做题。
5.抽象数据类型的实现。
实现一组抽象数据类型,并对所采用的存储结构和相关操作的实现进行讨论。
6.课程设计(一周综合性实验)。
数据结构的习题分为“基础知识题”和“算法设计题”两类。
在课程网站上,“基础知识题”主要供学生进行自测和复习之用,目的是帮助学生深化理解教科书的内容,澄清基本概念、理解和掌握数据结构中分析问题的基本方法和算法要点,为完成算法设计题做准备。
“算法设计题”则侧重于基本程序设计技能的训练,相对于实习题而言,这类编程习题属于偏重于编写功能单一的“小”程序的基础训练,然而,它是进行复杂程序设计的基础,是本课程习题作业的主体和重点。
各章的题量根据教学内容的多少和重要程度而定,几乎对教科书的每一小节都安排了对应的习题。
2.2算法设计的上机作业要求
1.使用AnyviewC语言和算法书写规范写出书面作业的算法(函数),作为上机前的准备。
需要强调的是“算法的可读性”。
初学者总是容易忽视这一点。
算法不仅是开发程序的基础,还是一种在程序设计者之间交流解决问题方法的手段。
因此,可读性具有头等的重要性。
不可读的算法是没有用的,由它得到的程序极容易产生很多隐藏很深的错误,且难以调试正确。
一般地说,宁要一个可读性好、逻辑清晰简单、但篇幅较长的算法,也不要篇幅较小但晦涩难懂的算法。
算法的正确性力求在设计算法的过程中得到保证,然而一开始做不到这一点也没多大关系,可以逐步做到。
算法设计的正确方法是:
首先理解问题,明确给定的条件和要求解决的问题,然后按照自顶向下,逐步求精,分而治之的策略逐一地解决子问题,最后严格按照和使用本章后面提供的算法书写规范和类C语言完成算法的最后版本。
按照规范书写算法是一个值得高度重视的问题。
在基础训练中就贯彻这一规范,不但能够有助于写出“好程序”,避免形成一系列难以纠正且遗害无穷的程序设计坏习惯,而且能够培养软件工作者应有的严谨的科学工作作风。
2.对函数进行静态检查修改,形成准备上机的程序文本。
多数初学者在编好程序后处于以下两种状态之一:
一种是对自己的“精心作品”的正确性确信不疑;
另一种是认为上机前的任务已经完成,查纠错误是上机的工作。
这两种态度是极为有害的。
事实上,非训练有素的程序设计者编写的程序长度超过50行时,极少不含有除语法错误以外的错误。
上机动态调试决不能代替静态检查,否则调试效率将是极低的。
静态检查主要有两种方法,一是用一组测试数据手工执行程序(通常应先分模块检查);
二是通过阅读或给别人讲解自己的程序而深入全面地分析理解程序逻辑,在这个过程中再加入一些注解和断言。
如果程序中逻辑概念清楚,后者将比前者有效。
3.在“AnyviewC编程作业与实验可视化网络平台”编辑提交程序,并在系统的自动测试和提示下,调试程序,直到能通过系统的测试。
“AnyviewC编程作业与实验可视化网络平台”提供了程序可视化运行和调试的环境,为进行数据结构教学的师生提供了算法设计作业程序的可视化自动测试环境。
可在该集成环境编辑C源程序,并对其进行可视化运行、分析和调试。
通过设置断点、单步或变换速度的连续运行,可在多个窗口上动态观察程序执行时的数据变量的物理和逻辑2D或3D视图,使得程序运行期间本来不可见的程序对数据的处理过程和数据之间的动态抽象关系全部可视化。
在提交算法设计作业程序时,系统自动进行可视化测试,评判作业程序的正确性。
通过对比“标准结果视图”和“作业结果视图”,作业者可对自己的程序进行直观的分析和排错。
关于该作业系统的使用,请参阅系统的帮助文档。
在调试过程中可以不断借助系统的可视DEBUG的各种功能,提高调试效率。
调试中遇到的各种异常现象往往是预料不到的,这时不应“苦思冥想”,而应动手确定疑点,通过修改程序来证实它或绕过它。
4.在调试程序的过程中,做好调试笔记,记录心得体会。
调试正确后,认真整理源程序及其注释,记录带有完整注释的且格式良好的源程序清单和结果。
一道算法设计作业文档包括:
(1)上机前编写并经过静态检查的程序文本;
(2)调试笔记;
(3)最后程序文本,及通过时间。
实验项目名称:
抽象数据类型的实现
实验项目性质:
设计性实验
所属课程名称:
数据结构
实验计划学时:
6
对某组具体的抽象数据类型,运用课程所学的知识和方法,设计合理的数据结构,并在此基础上实现该抽象数据类型的全部基本操作。
通过本设计性实验,检验所学知识和能力,发现学习中存在的问题。
进而达到熟练地运用本课程中的基础知识及技术的目的。
1.确定要实现的抽象数据类型,并对基本操作做适当的选取和增加;
2.选择存储结构,并写出相应的类型定义;
3.设计各基本操作的实现算法,并表达为函数形式;
4.设计测试方案,编写主函数;
5.将上述4步的结果写成预习报告。
以教材中讨论的各种抽象数据类型为对象,利用C语言的数据类型表示和实现其中某个抽象数据类型。
可选的抽象数据类型如下表所列:
编号
抽象数据类型
基本难度
存储结构
1
栈和队列
1.0
顺序和链接
2
线性表
3
哈希表
1.1
任选
4
二叉树
1.2
5
堆
6
二叉排序树
7
平衡二叉树
1.3
8
树
9
并查集
10
B树
1.4
11
有向图
12
无向图
13
有向带权图
注:
如果基本操作数量较多,可选择实现其中一个基本操作子集。
实验要求如下:
1.首先了解设计的任务,然后根据自己的基础和能力从中选择一题。
一般来说,选择题目应以在规定的时间内能完成,并能得到应有的锻炼为原则。
若学生对教材以外的相关题目较感兴趣,希望选作实验的题目时,应征得指导教师的认可,并写出明确的抽象数据类型定义及说明。
2.实验前要作好充分准备,包括:
理解实验要求,掌握辅助工具的使用,了解该抽象数据类型的定义及意义,以及其基本操作的算法并设计合理的存储结构。
3.实验时严肃认真,要严格按照要求独立进行设计,不能随意更改。
注意观察并记录各种错误现象,纠正错误,使程序满足预定的要求,实验记录应作为实验报告的一部分。
4.实验后要及时总结,写出实验报告,并附所打印的问题解答、程序清单,所输入的数据及相应的运行结果。
计算机学院实验中心。
编程环境:
AnyviewCL可视化编程环境、TC++、C++Builder、VC++或Java。
调试内容应包括:
调试过程中遇到的问题是如何解决的以及对实验的讨论与分析;
基本操作的时间复杂度和空间复杂度的分析和改进设想。
列出对每一个基本操作的测试结果,包括输入和输出,测试数据应完整和严格。
考核形式以实验过程和实验报告相结合的方式进行。
实验报告作为整个设计性实验评分的书面依据。
设计性实验的成绩评定以选定题目的难易度、完成情况和实验报告为依据综合评分。
从总体来说,所实现的抽象数据类型应该全部符合要求,类型定义,各基本操作的算法以及存储结构清晰;
各模快测试运行正确;
程序的结构合理;
设计报告符合规范。
实验结束后要写出实验报告,以作为整个设计性实验评分的书面依据和存档材料。
实验报告是反映学生实验效果的最主要的依据,也是学生正确地表达问题、综合问题和发现问题的能力的基本培养手段,因而是非常重要的内容。
本设计性实验的报告要包括以下几项内容:
(1)设计任务、要求及所用软件环境或工具;
(2)抽象数据类型定义以及各基本操作的简要描述;
(3)所选择的存储结构描述及在此存储结构上各基本操作的实现;
(4)程序清单(计算机打印),输入的数据及各基本操作的测试结果;
(5)实验总结和体会。
实验报告以规定格式的电子文档书写、打印并装订,排版及图表要清楚、工整。
对设计性实验进行总结和讨论,包括本实验的优、缺点,数据存储结构的特点,与其它存储结构之间的比较等。
通过总结,可以对抽象数据类型有更全面、深入的认识,这是设计性实验不可缺少的重要内容。
这部分内容应作为实验报告中的一个组成部分。
1.题目
采用字符类型为元素类型和无头结点单链表为存储结构,实现抽象数据类型List。
ADTList{
数据对象:
D={ai|ai∈ElemSet,i=1,2,...,n,n≥0}
数据关系:
R1={<
ai-1,ai>
|ai-1,ai∈D,i=2,...,n}
基本操作:
SetEmpty(&
L)
操作结果:
构造一个空的线性表L。
Destroy(&
初始条件:
线性表L已存在。
销毁线性表L。
Length(L)
返回L中元素个数。
Get(L,i,&
e)
线性表L已存在,1≤i≤LengthList(L)。
用e返回L中第i个元素的值。
Locate(L,e,compare())
线性表L已存在,compare()是元素判定函数。
返回L中第1个与e满足关系compare()的元素的位序。
若这样的元素不存在,则返回值为0。
Insert(&
L,i,e)
线性表L已存在,1≤i≤LengthList(L)+1。
在L的第i个元素之前插入新的元素e,L的长度加1。
Delete(&
L,i,&
线性表L已存在且非空,1≤i≤LengthList(L)。
删除L的第i个元素,并用e返回其值,L的长度减1。
Display(L)
依次输出L的每个元素。
}ADTList
2.存储结构定义
公用头文件DS0.h:
#include<
conio.h>
stdio.h>
stdlib.h>
string.h>
values.h>
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineIBFEASIBLE-1
#defineOVERFLOW-2
#defineMAXLEN20
#defineMAXSIZE20
typedefintStatus;
typedefcharElemType;
/*元素类型为字符类型*/
(1)顺序存储结构
#defineLIST_INIT_SIZE20/*线性表存储空间的初始分配量*/
#defineLISTINCREMENT10/*线性表存储空间的分配增量*/
typedefstruct{
ElemType*elem;
/*存储空间基址*/
intlength;
/*当前长度*/
intlistsize;
/*当前分配的存储容量*/
}SqList;
(2)无头结点单链表存储结构
typedefstructLNode{
ElemTypedata;
structLNode*next;
}LNode,*LList;
/*不带头结点单链表类型*/
(3)带头结点单链表存储结构
typedefstructLNode{/*结点类型*/
ElemTypedata;
structLNode*next;
}LNode,*Link,*Position;
typedefstructLinkList{/*链表类型*/
Linkhead,tail;
/*分别指向线性链表中的头结点和最后一个结点*/
intlen;
/*指示线性链表中数据元素的个数*/
}LinkList;
3.算法设计
StatusSetEmpty(SqList&
L){/*构造一个空的顺序线性表*/
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)
returnOVERFLOW;
/*存储分配失败*/
L.length=0;
/*空表长度为0*/
L.listsize=LIST_INIT_SIZE;
/*初始存储容量*/
returnOK;
}
StatusDestroy(SqList&
L){/*销毁顺序线性表L*/
free(L.elem);
L.elem=NULL;
L.listsize=0;
}
intLength(SqListL){/*求表长*/
returnL.length;
StatusGet(SqList&
L,inti,ElemType&
e){/*获取第i元素*/
if(i<
1||i>
L.length)
returnERROR;
e=*(L.elem+i-1);
intLocate(SqListL,ElemTypex){/*确定x在表中的位序*/
ElemType*p;
inti=1;
/*i的初值为第1个元素的位序*/
p=L.elem;
/*p的初值为第1个元素的存储位置*/
while(i<
=L.length&
&
*p++!
=x)
++i;
=L.length)
returni;
else
return0;
StatusInsert(SqList&
L,inti,ElemTypee){
/*操作结果:
在L中第i个位置之前插入新的数据元素e,L的长度加1*/
ElemType*newbase,*q,*p;
L.length+1)/*i值不合法*/
if(L.length>
=L.listsize){/*当前存储空间已满,增加分配*/
newbase=(ElemType*)realloc(L.elem,
(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!
newbase)returnOVERFLOW;
L.elem=newbase;
/*新基址*/
L.listsize+=LISTINCREMENT;
/*增加存储容量*/
}
q=L.elem+i-1;
/*q为插入位置*/
for(p=L.elem+L.length-1;
p>
=q;
--p)
*(p+1)=*p;
/*插入位置及之后的元素右移*/
*q=e;
/*插入e*/
++L.length;
/*表长增1*/
StatusDelete(SqList&
e){
/*初始条件:
顺序线性表L已存在,1≤i≤ListLength(L)*/
删除L的第i个数据元素,并用e返回其值,L的长度减1*/
ElemType*p,*q;
L.length)/*i值不合法*/
p=L.elem+i-1;
/*p为被删除元素的位置*/
e=*p;
/*被删除元素的值赋给e*/
q=L.elem+L.length-1;
/*表尾元素的位置*/
for(++p;
p<
++p)/*被删除元素之后的元素左移*/
*(p-1)=*p;
L.length--;
/*表长减1*/
StatusDisplay(SqListL){/*依次显示表中元素*/
ElemType*p;
inti;
printf("
("
);
for(i=1;
i<
=L.length;
i++)
%c"
*p++);
)\n"
(2)无头结点单链表
voidSetEmpty(LList&
L){/*置无头结点的空单链表*/
L=NULL;
StatusDestroy(LList&
L){/*销毁链表*/
LListq=L;
while(L){
L=L->
next;
free(q);
q=L;
intLength(LListL){/*求表长*/
intn=0;
while(L!
=NULL){
n++;
returnn;
StatusGet(LListL,inti,ElemType&
intj=1;
while(j<
i&
L!
j++;
if(L!
=NULL){e=L->
data;
elsereturnERROR;
/*位置参数i不正确*/
intLocate(LListL,ElemTypex){/*确定x在表中的位序*/
intn=1;
while(L!
=NULL&
L->
data!
=x){
if(L==NULL)return0;
elsereturnn;
StatusInsert(LList&
L,inti,ElemTypee){/*插入第i元素*/
LLists,q;
s=(LList)malloc(sizeof(LNode));
s->
data=e;
if(i==1){s->
next=q;
L=s;
returnOK;
else{
while(j<
i-1&
q->
next!
=NULL){
q=q->
if(j==i-1){
next=q->
next=s;
StatusDelete(LList&
e){/*删除第i元素*/
LListq=L,t;
if(i==1){
e=q->
L=q->
else{
n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 课程设计 指导书