东北大学数据结构实验

2024-11-02

东北大学数据结构实验(精选8篇)

1.东北大学数据结构实验 篇一

《数据库技术及应用》

实验四、SQL语言数据定义语言DDL

学生姓名

学生班级

学生学号

指导老师

重庆邮电大学计算机学院 计算机专业实验中心 一. 实验内容

在 Navicat for MySQL 中使用 CREATE 命令完成对表、索引、视图、同义词 的创建,使用 DROP 命令完成对表、索引、视图、同义词的删除,使用 ALTER 命 令对表结构进行修改及完整性约束的增加、删除。

二. 实验步骤

1.启动 Navicat for MySQL,在 MySQL – 新建连接中完成连接参数配置。2.登录到本地数据库服务器后,连接到 test 数据库上。3.用 SQL 语句(如下),建立如下所示的表 student;

4.同理

5.同理

6.用 Drop Table 语句删除表 CourseAa。

7.用 Alter Table 语句更新表 ChooseBb,添加一个属性名 Bb4,类型 Varchar, 长度 20,完整性约束设为非空值,缺省值设为字符“系统测试值”。

8.用 Alter Table 语句更新表 ChooseBb,添加一个属性名 Bb5,类型 Varchar, 长度 10,完整性约束设为主码。完成后,表 ChooseBb 的设计如下所示。

9.用 Create View 语句建立一个视图 View_Choosebb,生成的视图属性名(View_bb1,View_bb2,view_bb3), 其中 View_bb1 对应于基表 ChooseBb 的 Bb1、View_bb2 对应于基表 ChooseBb 的 Bb4、view_bb3 对应于基表 ChooseBb 的 Bb5。完成后,视图 View_Choosebb 的设计如下所示。

10.用 Drop View 语句删除视图 View_Choosebb。

11.用 Create Index 语句对表 ChooseBb 的 Bb2 属性建立一个升序索引,索引名 Index_bb2。用 Create Index 语句对表 ChooseBb 的 Bb4 属性建立一个降序索引,索引名 Index_bb4。

12.用 Drop Index 语句删除索引 Index_bb2。

三. 心得体会

因为有理论课的基础,本次实验相对轻松,很快就完成了。不过中间出现了许多小错误,还好及时改正了。在实践中体会这些平时学理论未注意到的小细节才能更好的掌握知识。

2.东北大学数据结构实验 篇二

计算机在科学研究领域中应用的迅速发展使传统的教学实验与实际科研工作之间的差距越来越大。我们应该将计算机这个现代化的手段运用到物理实验教学中来, 逐步改善传统的教学方法, 缩小差距, 适应创新型、应用型人才培养的需要。大部分学校在物理实验数据处理方面对学生要求比较严格, 数据处理问题也是学生认为比较头疼的问题。对于数据较多、计算量较大的实验, 我们要求学生编程计算或利用现有的软件进行处理。从而锻炼学生的科学计算能力, 为他们将来的工作和学习打好基础。下面介绍一个教学实例。

模拟法测绘静电场实验中, 测绘同轴柱形电极间电势分布时要求学生找到1v、2v、3v、4v等势线上各八个等势点的坐标, 从而计算出各等势圆的平均半径, 如果使用计算机处理数据将会大大提高效率, 同时也给学生一个应用编程工具解决实际问题的锻炼机会。FORTRAN语言是世界上第一个被正式推广使用的高级语言。它是数值计算领域所使用的主要语言。它是为科学、工程问题或企事业管理中的那些能够用数学公式表达的问题而设计的, 其数值计算的功能较强。以FORTRAN语言编程为例解决这个数据处理问题。

程序代码如下:

只要在x_y.txt文件中输入电压与坐标, 运行程序就可以得到outcome_00.txt文件, 每个坐标对应的半径r (i) 、等势圆半径平均值r_av、半径的标准平均偏差S_r、相对偏差Er_r、ln (R0/r) 、电势的理论值v_r、电势百分误差E0_v等相关量都可算出, 大大提高了数据处理效率。程序中利用到了基本公式计算、数组、循环、读写等基本功能, 很多不熟悉计算机语言的同学对程序编写也表现出很大兴趣。

计算机在物理实验中的应用是教学改革的一个重要方面, 我们在物理实验教学中逐步增加用计算机处理数据的项目, 有的需要编程, 有的则是利用现成的计算软件。在实验报告的评判中, 对采用计算机处理实验数据的学生我们会酌情加分给予鼓励。经过近两年的教学实践, 效果非常显著:计算机学得比较好的学生在物理实验课上得到同学们的认可与欣赏, 这让他们也越来越喜欢物理实验;同学们在数据处理中计算机利用率明显提高, 科学计算能力大大提高;对科学研究有了一定认识和兴趣。使用计算机处理数据减轻了学生很多工作量, 同时提高了他们的综合素质, 为将来的工作和学习带来很大帮助。

摘要:计算机在科研领域中应用的迅速发展使传统的教学实验与科学研究工作之间的差距日益增大。因此应该逐步在物理实验数据处理过程中增加计算机的应用, 缩小教学实验与实际科研之间的差距, 从而适应培养创新型、应用型人才的需要。

3.《数据结构》实验教学方法探讨 篇三

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

0引言

《数据结构》是计算机专业课程体系的核心课程之一。课程主要讲述各种数据的逻辑结构、物理结构及基本操作的实现算法以及数据查找、排序算法,并对各种算法进行性能分析和比较。

根据调查发现,目前大多数院校《数据结构》课程教学现状不容乐观。学生普遍反映课程学习比较困难,教师也感觉教学效果不理想。实验教学更是因为程序设计语言基础不扎实、课程内容太抽象等原因而较难开展,有些学校因此而缩短学时甚至不开设实验。一些专家和教师就课程实验教学改革已经提出了一些具体的教学方法,如案例驱动、课题答辩等。这些方法都具有比较重要的借鉴价值,但某些文章过于片面的强调某一种教学方法。笔者认为根据学生的实际情况完善教学设计、加强教学管理,通过行之有效的教学手段使学生学有所获才是根本。下面结合自己的实际教学工作,谈谈对数据结构实验教学方法的认识。我校《数据结构>课程理论学时48,实践学时16,教材选用严蔚敏的《数据结构(C语言版)》)。

1讲好理论第一课.明确课程性质

仅从课程名称来看,<数据结构》就很容易被误解为实践性不强的理论课。讲好第一堂理论课非常重要,应让学生明确课程性质并理解实践学习的重要性。

结合程序设计语言、操作系统等课程内容,笔者设计了一些学生比较熟悉并容易理解的应用实例和学生一起探讨。如:int a[10]和a[i]-5的确切含义;文件簇的链式形态;国际象棋大师与超级计算机的对决:图的着色问题等。在讲解图的着色问题时引导学生思考图的存储中需要关心什么,怎么存以及大致的程序逻辑等。通过对实例的分析,引入课程主要内容,学生也可明确课程的性质和专业地位并思考课程学习目标。

2制定实验教学计划.设计实验内容

程序设计语言是数据结构的前驱课程之一,多数院校都是以c语言程序设计作为学生程序逻辑训练的课程。数据结构教材中采用类C语言来描述算法,对指针、结构体等内容并未作详细的介绍。对于刚刚学完C语言的学生来说,指针等内容本来就比较模糊,要将类C算法转换为程序实现就更加困难。

在制定实验教学计划时,可以采用由易到难、逐步加深的方式来安排实验内容。结合实验学时数和教学大纲要求,笔者将实验内容作了如下设计和安排:

2.1第一次上机任务只要求学生运用以前学过的C语言知识来编写一个程序:给定一个整数序列,要求①用冒泡或选择算法进行排序:②输入一个整数x,在此有序序列中进行查找,如成功,则返回其位置;③如查找不成功,将×插入到序列中并使序列仍然有序。此题目运用到数组的定义、排序、查找、数组元素插入算法等相关内容。通过此实验,不仅能了解学生程序语言的熟悉程度,也能了解学生对排序和查找等基础算法的掌握情况,为后面教学内容设计作好铺垫。

2.2结合教学进度要求学生实现常见数据结构的基本操作,并能作一些验证性的实验。如用数字菜单的形式实现单向链表的基本操作,并完成两个有序链表合并算法的验证。实验要求学生能实现大多数基本操作算法,完成头文件的设计,并能利用已实现的基本操作完成复杂算法的验证。通过此类实验,学生对数据结构的理解更直观,程序逻辑更清晰,C语言的掌握能力逐渐增强,同时也为面向对象课程的学习打下一定的基础。

2.3设计性实验即课程设计安排。课程设计的目的在于培养学生分析和解决实际问题的能力,训练和提高学生规范的程序设计方法。教师可推出一些典型的并与后续课程有一定联系的题目供学生选择。每个题目规模不能太小,并能反映相关数据结构在程序设计中起的关键作用。如:①实现一个串的基本操作演示程序,提供命令行的输入(仿照COMMAND),并对命令行能进行简单的编译和出错处理,最后根据命令动词的功能来执行命令:②利用哈夫曼编码算法实现简单文本文件的压缩和解压。题目随着理论教学进度推出,有难有易,学生结合自己实际来选择并可提前完成。

3规范实验过程.加强实验教学管理

为保障划的有效实施,必须规范实验过程并加强实验教学管理。

3.1根据计划制定实验指导书。指导书中给出每个实验的目的、学时、内容等。其中设计性实验另给出一些基本的分析思路,每个实验都适当的添加一些选作题。学生通过阅读实验指导书能进一步明确每次实验的具体内容和要求。

3.2要求学生做好上机前的准备。大二学生的编码速度普遍较慢,如果把实验课时间主要用于输入代码是非常不值得的,应将主要精力放在程序调试上面。这样不仅有充足的提问时间,也便于教师归纳并集中讲解学生调试过程中所遇到的常见问题。

3.8要求学生实验后完成实验报告。报告中须给出问题分析、数据描述、算法描述、程序描述、测试结果和心得体会等内容。教师对学生提交的实验报告进行分析,总结并指出实验的成功和不足之处。

3.4加强实验教学管理,从正面引导学生。随着网络信息技术的发展,网络中提供的各种信息服务和娱乐方式使部分学生的学习积极性逐渐降低,学习目标也越来越不明确。如果管理松懈,有些学生就会把实践学习当成是简单的Ctrl-C和CtrI-V,不能达到实验教学的预期目标。因此,教师应了解学生的学习动态,加强实践教学管理,并根据实际情况进行相应调整和改进。

4丰富教学手段。搞好实验指导

在实践教学过程,教师不能只停留于解决学生提出的问题,还应不断摸索教学方法,丰富教学手段。

4.1演示基本算法实现时可采用互动的方式进行。先按类型定义一初始化一输入测试数据一输出的实现顺序和学生一起得到结果;再让学生逐个实现其余算法,最后完成头文件的设计。学生通过教师演示和实际操作可以更快的掌握类C算法和C程序的转换思路。

4.2数据结构中的程序规模相比C语言来说更大。由于缺乏经验,很多学生在程序调试中会出现较多的语法和逻辑错误,可利用多媒体网络教学手段在学生机上直接演示并讲解程序调试的方法和技巧。

4.8学生实验过程中尽力营造一种你追我赶的竞争氛围,通过激励机制提高学生学习积极性。如果有同学较早实现了某些算法,可有选择性的适当的“刺激”部分学生以激发其不服输的心理,从而带动其他学生。

4.4鼓励学生多实践,要求学生通过实践来找出理论学习中存在的问题,提高自己的抽象思维和逻辑推理能力。对于编程能力较强的学生,鼓励他们多做题,做难题,为今后参加各种资格水平考试和专业竞赛作好准备。

5总结

4.数据结构实验报告 篇四

一. 题目要求

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++编译器里运行不了的(即使补充了头文件和数据的定义),所以之后参考了网上的数组非递归,发现其功能和栈相似。

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

5.数据结构实验报告 篇五

指导教师 姓

名班

级学

号实

验 室

黄梅根

钟志伟 0140703 07310325 S331-B

2008-11-29

单链表的插入和删除实验日志

指导教师:黄梅根

实验时间:2008年10月14日 学院 通信学院 专业信息工程

班级0140703 学号07310325姓名 钟志伟 实验室S331-B

实验题目:

单链表的插入和删除 实验目的:

了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。实验要求:

建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。实验主要步骤: 分析、理解程序。调试程序,并设计输入数据(如:bat,cat,eat,fat,hat,jat,lat,mat,#),测试程序的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。3 修改程序:

增加插入结点的功能。

将建立链表的方法改为头插入法。

实验结果:

心得体会:

通过本次实验,我了基本上掌握了线性表的逻辑结构和链式存储结构,从中也发现自己在这方面的知识掌握的还不是很扎实,下来要多看书,将基本的知识要掌握牢固。

二叉树操作实验日志

指导教师:黄梅根

实验时间:2008年 10 月28 日 学院 通信学院 专业信息工程

班级0140703 学号07310325姓名 钟志伟 实验室S331-B 实验题目: 二叉树操作

实验目的:

掌握二叉树的定义、性质及存储方式,各种遍历算法。

实验要求:

采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。

实验主要步骤;1.分析、理解程序。

2.添加中序和后序遍历算法.3.调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求所有叶子及结点总数。

实验结果:

心得体会:

通过此次实验,我基本掌握了建立二叉树,并且掌握了先序、中序和后序以及按层次遍历的操作,更好的掌握了书本上的知识。

图的遍历操作实验日志

指导教师:黄梅根

实验时间:2008年 11 月 11 日 学院 通信学院 专业 信息工程

班级 0140703 学号 07310325姓名 钟志伟实验室S331-B 实验题目:

图的遍历操作 实验目的:

掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图的存储结构;掌握DFS及BFS对图的遍历操作;了解图结构在人工智能、工程等领域的广泛应用。实验要求:

采用邻接矩阵和邻接链表作为图的存储结构,完成有向图和无向图的DFS和BFS操作。实验主要步骤:

1、分析、理解程序。

2、调试程序。设计一个有向图和一个无向图,任选一种存储结构,完成有向图和无向图的DFS(深度优先遍历)和BFS(广度优先遍历)的操作。

实验结果:

心得体会:

通过本次实验,我掌握了有向图和无向图的一些概念,了解了DFS和BFS对图的遍历操作。

循环链表实验日志

指导教师:黄梅根

实验时间:2008年 11 月 25 日 学院 通信学院 专业 信息工程

班级 0140703 学号 07310325 姓名 钟志伟 实验室S331-B 实验目的:

了解和掌握线性表的逻辑结构和链式存储结构,掌握循环链表的基本算法及相关的时间性能分析。

实验要求:

1.实现循环链表的建立

2.输出循环链表节点的指针序列,要求先输出自身的指针,再输出其指向的 节点的指针。如一个有五个节点的循环链表,各节点地址依次为3109,3290,3106,3595,3390,则输出应为:

3109

3290

3290 3106

3106 3595

3595 3390

3390

3109 3.对链表进行由大到小的排序,输出排序完成后的链表和链表的指针序列。

源代码:

#include“stdio.h” #include“string.h” #include“stdlib.h” #include“ctype.h” typedef struct node

//定义结点

{ char data[10];

//结点的数据域为字符串

struct node *next;

//结点的指针域

}ListNode;typedef ListNode * LinkList;

// 自定义LinkList单链表类型 LinkList CreatListR1();

//函数,用尾插入法建立带头结点的单链表 ListNode *LocateNode();

//函数,按值查找结点 void DeleteList();

//函数,删除指定值的结点 void printlist();

//函数,打印链表中的所有值

void DeleteAll();

//函数,删除所有结点,释放内存

//==========按值查找结点,找到则返回该结点的位置,否则返回NULL========== ListNode *LocateNode(LinkList head, char *key){

ListNode *p=head->next;//从开始结点比较

while(p&&strcmp(p->data,key)!=0)//直到p为NULL或p-> data为key止

p=p->next;

//扫描下一个结点

return p;

//若p=NULL则查找失败,否则p指向找到的值为key的结点 }

//==========用尾插入法建立带头结点的单链表=========== LinkList CreatListR1(void){

char ch[10];

LinkList head=(LinkList)malloc(sizeof(ListNode));//生成头结点

ListNode *s,*r,*pp;

r=head;

r->next=head;

printf(“Input # to end ”);//输入“#”代表输入结束

printf(“Please input Node_data:”);

scanf(“%s”,ch);

//输入各结点的字符串

while(strcmp(ch,“#”)!=0){

// pp=LocateNode(head,ch);

//按值查找结点,返回结点指针

// if(pp==NULL)

{

//没有重复的字符串,插入到链表中

s=(ListNode *)malloc(sizeof(ListNode));

strcpy(s->data,ch);

r->next=s;

r=s;

r->next=head;

}

printf(“Input # to end ”);

printf(“Please input Node_data:”);

scanf(“%s”,ch);

}

return head;

//返回头指针 } //==========删除带头结点的单链表中的指定结点======= void DeleteList(LinkList head,char *key){

ListNode *p,*r,*q=head;

p=LocateNode(head,key);

//按key值查找结点的 if(p==NULL){

//若没有找到结点,退出

printf(“position error”);

exit(0);

}

while(q->next!=p)

//p为要删除的结点,q为p的前结点

q=q->next;

r=q->next;

q->next=r->next;

free(r);

//释放结点 } //===========打印链表======= void printlist(LinkList head){

ListNode *p=head->next;

//从开始结点打印

while(p!=head){ printf(“%s,%sn ”,p->data,p->next);

p=p->next;

}

printf(“n”);} //==========删除所有结点,释放空间=========== void DeleteAll(LinkList head){

ListNode *p=head,*r;

while(p->next){ r=p->next;

free(p);p=r;

}

free(p);}

//==========主函数============== void main(){

char ch[10],num[10];

LinkList head;

head=CreatListR1();

//用尾插入法建立单链表,返回头指针

printlist(head);

//遍历链表输出其值

printf(“ Delete node(y/n):”);//输入“y”或“n”去选择是否删除结点

scanf(“%s”,num);

if(strcmp(num,“y”)==0 || strcmp(num,“Y”)==0){

printf(“Please input Delete_data:”);

scanf(“%s”,ch);

//输入要删除的字符串

DeleteList(head,ch);

printlist(head);

}

DeleteAll(head);

//删除所有结点,释放内存 }

实验结果:

心得体会:

6.数据结构 队列实验报告 篇六

小组成员:xxxxxxxx日期:xxxxxxxx

一、需求分析(xxx)

1.链队列

1)在本演示程序中,首先要链队列添加一个头结点,并判断队列是否为空,它只允许在表的一端进行插入,而在另一端删除元素,允许插入的一段叫队尾,允许删除的一端则为对头,接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。最后销毁队列,释放空间。2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“销毁队列”“清空队列”之后。由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。3)程序执行的命令包括: 欢迎来到链队列 1输出队列长度 2元素入队 3元素出队 4销毁队列 5清空队列 6对头元素 7退出链队列 4)测试数据 入队 1 2 3 4 5 分别执行“元素入队”“元素出队”“销毁队列”“清空队列”等操作。2.顺序队列

1)在本演示程序中,首先要顺序队列添加一个头结点,并判断队列是否为空,它只允许在表的一端进行插入,而在另一端删除元素,允许插入的一段叫队尾,允许删除的一端则为对头,接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“取得头结点”“输出显示”之后。由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。3)程序执行的命令包括: 欢迎来到顺序队列 1入队 2出队

3判断是否为空 4取得头结点 5输出显示 6退出顺序队列 4)测试数据 入队 1 2 3 4 5 分别执行“元素入队”“元素出队”等操作。3循环队列

1)在本演示程序中,首先要顺序队列添加一个头结点,并判断队列是否为空,初始化建空队列时,令front=rear=0,每当插入新的队列尾元素时,“尾指针增1”;每当删除队列头元素时,“头指针增1”。接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“取得头结点”“输出显示”之后。由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。3)程序执行的命令包括: 欢迎来到循环队列 1入队 2出队

3判断是否为空 4取得头结点 5输出显示 6退出顺序队列 4)测试数据 入队 1 2 3 4 5 分别执行“元素入队”“元素出队”等操作。

二.概要设计(xxxx)

⒈ 为实现上述算法,需要顺序表的抽象数据类型,抽象数据类型定义如下:

ADT Queue { 数据对象:D={ ai|ai∈ElemSet, i=1,2,3...,n, n>=0 } 数据关系: R={ |ai-1,ai∈D,i=2,...,n } 基本操作: InitQueue(&Q)操作结果:构造一个空队列。DestroyQueue(&Q)初始条件:队列Q已存在。

操作结果:队列Q已被销毁。ClearQueue(&Q)初始条件:队列Q已存在。

操作结果:将Q清为空队列。QueueEmpty(Q)初始条件:队列Q已存在。

操作结果:若Q为空队列,则返回TRUE,否则FALSE。QueueLength(Q)初始条件:队列Q已存在。

操作结果:返回Q元素的个数,即队列的长度。GetHead(Q,&e)初始条件:Q为非空队列。

操作结果:用e返回Q的队头元素。EnQueue(&Q,e)初始条件:队列Q已存在。

操作结果:插入e返回Q的新的队尾元素。DeQueue(&Q,&e)初始条件:Q为非空队列。

操作结果:删除Q的队头元素,并用e返回其值。}ADT Queue

2.单链队列

typedefstructQNode { QElemType;structQNode *next;//指针域 }QNode,*QueuePtr;Typedefstruct{ QueuePtr front;QueuePtr rear;}LinkQueue;Status InitQueue(LinkQueue&Q)//构造一个空队列。

Status DestroyQueue(LinkQueue&Q)//销毁队列Q,Q不存在。

Status ClearQueue(LinkQueue&Q)//将Q清为空队列。

Status QueueEmpty(LinkQueueQ)//若Q为空队列,则返回TRUE,否则FALSE。intQueueLength(LinkQueueQ)//返回Q元素的个数,即队列的长度。

Status GetHead(LinkQueueQ,QElemType&e)//若队列不为空,则用e返回Q的队头元素,并返回OK;否则返回ERROR。

Status EnQueue(LinkQueue&Q,QElemType e)//插入e返回Q的新的队尾元素。

Status DeQueue(LinkQueue&Q,QElemType&e)//若队列不空,则删除Q的队头元素,并用e返回其值,并返回OK;否则返回ERROR。

三.详细设计(xxx)

1.顺序队列的实现和运算

1)元素的类型 typedefstruct { Datatypedata[MAXSIZE];intfront,rear;}Squeue;2)空的队列的构造

void InitSqueue(Squeue *p)/*初始化队列*/ { p->front=0;p->rear=0;} 3)元素的入队

int Ensqueue1(Squeue1 *q, Datatype e)/*入队*/ { if((q->rear+1)% MAXSIZE == q->front){ printf(“n队列已满n”);return 0;} 4)元素的出队

int DeSqueue1(Squeue1 *q,Datatype *e)/*出队*/ { if(q->front==q->rear){ printf(“队列已空,无法出队!”);return 0;} *e=q->data[q->front];q->front=(q->front+1)%MAXSIZE;return 1;} 5)判断队列是否为空

int QueueEmpty1(Squeue1 q)// 判断是否为空 { if(q.front==q.rear)return 1;else return 0;} 6)队头元素的取值的算法

int Gethead1(Squeue1 *q,Datatype *e)// 取对头元素 { if(q->front==q->rear){ printf(“队列已空,无法出队!”);return 0;} else *e=q->data[q->front];return 1;} 7)遍历顺序队列的算法

void display1(Squeue1 q)//遍历顺序对列 { printf(“此队列数据为:n”);if(q.front==q.rear)printf(“此队列为空!”);else { while(q.front

void InitQueue2(LinkQueue *q){ // 构造一个空队列Q q->front=q->rear=malloc(sizeof(QNode));if(!q->front)exit(1);q->front->next=NULL;} 2)元素的入队算法

void EnQueue2(LinkQueue *q, QElemType e)//将元素e进队 { QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode));//创建新节点

if(!p)//如果内存分配成功

exit(1);

p->data=e;//初始化新节点数据为e p->next=NULL;

q->rear->next=p;

q->rear=p;} 3)元素的出队的算法

int DeQueue2(LinkQueue *q,QElemType e)//队头结点出队,将出队的元素存入e { QueuePtr p;if(q->front==q->rear)//队列为空

return 0;p=q->front->next;//初始化temp为要出队的结点指针

if(q->front->next==q->rear)//要出队的结点为最后一个结点

q->rear=q->front;e=p->data;//要出队的数据元素为e q->front->next=p->next;//使下一个结点变为对头

free(p);//删除要出队的结点

return e;} 4)队列的长度算法

void QueueLength2(LinkQueue *q)//返回队列长度 { QueuePtr p;int i=0;p=q->front->next;while(p){

++i;

p=p->next;} printf(“链队列长度为:%dn”,i);} 5)队列的销毁

void DestroyQueue2(LinkQueue *q){ while(q->front){

q->rear=q->front->next;

free(q->front);

q->front=q->rear;

if(!q->rear)

free(q->rear);} free(q->front);} 6)队列的输出算法

void output2(LinkQueue *q)//输出队列 { QueuePtr p;p=q->front->next;printf(“链队列元素依次为:”);while(p){

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

p=p->next;} printf(“n”);} 7)队列的清空的算法 void Clear2(LinkQueue *q)//清空队列 { QueuePtr temp=q->front->next;while(temp){

QueuePtrtp=temp;

temp=temp->next;

free(tp);} temp=q->front;

q->front=q->rear=NULL;free(temp);} 8)返回对头元素的算法

int GetHead2(LinkQueue *q, int *e)//返回对头结点元素,存入e { if(q->front==q->rear)

return 0;*e=q->front->next->data;return 1;} 3.循环队列的实现和运算 1)队列的初始化算法

void InitSqueue3(Squeue3 *p)/*初始化队列*/ { p->base=(Datatype *)malloc(sizeof(Datatype)* MAXSIZE);p->front=0;p->rear=0;} 2)入队的算法

int Ensqueue3(Squeue3 *q, Datatype e)/*入队*/ { if((q->rear+1)% MAXSIZE == q->front){ printf(“n队列已满n”);return 0;} else q->base[q->rear]=e;/*将接收到得值付给队尾所指的节点*/ q->rear=(q->rear+1)% MAXSIZE;/*队尾向后移一位完成入队*/ return 1;} 3)出队的算法

int DeSqueue3(Squeue3 *q,Datatype *e)/*出队*/ { if(q->front==q->rear){ printf(“队列已空,无法出队!”);return 0;} *e=q->base[q->front];q->front=(q->front+1)%MAXSIZE;return 1;} 4判断队列是否为空的算法

int QueueEmpty3(Squeue3 q)// 判断是否为空 { if(q.front==q.rear)return 1;else return 0;} 5)对头元素的返还的算法

int Gethead3(Squeue3 *q,Datatype *e)// 取对头元素 { if(q->front==q->rear){ printf(“队列已空,无法出队!”);return 0;} else *e=q->base[q->front];return 1;} 6)遍历循环队列的算法

void display3(Squeue3 *q)//遍历循环对列 { int tail;tail=q->front;printf(“此队列数据为:n”);if(q->front==q->rear)printf(“此队列为空!”);else { while(tail!=q->rear){ printf(“%dt”, q->base[tail]);tail=(tail+1)%MAXSIZE;} printf(“n”);} } 4.主函数的算法 void main(){

int choice;Datatype e1;int i1,a1,x1,s1,j1;//顺序队列定义的量 int e2,i2,n2,s2,a2;//链队列定义的量

int i3,a3,x3,s3,j3;//循环队列定义的量 Datatype e3;

Squeue1 Q1;

//******************************* LinkQueue q;

//******************************** Squeue3 Q;

//**************************** choice=-1;Begin();while(choice!=0){ scanf(“%d”,&choice);switch(choice){ case 1://顺序队列

{

system(“cls”);InitSqueue1(&Q1);printf(“创建队列完成!n”);printf(“请输入数据个数j1=”);scanf(“%d”,&j1);for(i1=1;i1<=j1;i1++)//输入的数据个数不要超过MAXSIZE,多了的部分没有插入队列

{ printf(“请输入第%d个数据:”,i1);scanf(“%d”,&a1);Ensqueue1(&Q1,a1);

} printf(“对头为:%dn”,Q1.data[Q1.front]);printf(“队尾为:%dn”,Q1.data[Q1.front+j1-1]);display1(Q1);s1=-1;start1();while(s1!=0)

{

scanf(“%d”,&s1);switch(s1)

{ case 0:

system(“cls”);

choice=-1;

Begin();

break;case 1:

{

system(“cls”);printf(“请输入入队元素:n ”);scanf(“%d”,&x1);Ensqueue1(&Q1,x1);display1(Q1);

s1=-1;

start1();break;

} case 2:

{ system(“cls”);DeSqueue1(&Q1,&e1);display1(Q1);s1=-1;

start1();break;

} case 3:

{

system(“cls”);if(QueueEmpty1(Q1))printf(“此队列为空!n”);else printf(“此队列不为空!n”);

}

s1=-1;

start1();break;case 4:

{ system(“cls”);

Gethead1(&Q1,&e1);printf(“对头元素为:%dn”,e1);

s1=-1;

start1();break;

} case 5:

{ system(“cls”);display1(Q1);s1=-1;

start1();break;

}

}//switch

} //while

}//case1

break;//************************************************* case 2:

{

system(“cls”);

InitQueue2(&q);printf(“创建队列完成!n”);printf(“输入将建立链队列元素的个数:n2=”);scanf(“%d”,&n2);printf(“请输入队列的元素:n”);for(i2=1;i2<=n2;i2++)

{

printf(“请输入第%d个元素:”,i2);

scanf(“%d”,&e2);

EnQueue2(&q,e2);

} a2=-1;start2();while(a2!=0)

{

scanf(“%d”,&a2);

switch(a2)

{

case 1:system(“cls”);

QueueLength2(&q);

a2=-1;start2();

break;

case 2:{

system(“cls”);

printf(“请输入入队元素:”);

scanf(“%d”,&e2);EnQueue2(&q,e2);

output2(&q);a2=-1;start2();

}break;

case 3:

system(“cls”);

e2=DeQueue2(&q,e2);

output2(&q);

printf(“出队元素为:%dn”,e2);a2=-1;start2();

break;

case 4:DestroyQueue2(&q);printf(“队列已销毁!n”);

a2=0;system(“cls”);

choice=-1;

Begin();

break;

case 5:

Clear2(&q);printf(“队列已清空n”);

a2=0;system(“cls”);

choice=-1;

Begin();

break;

case 6:

system(“cls”);GetHead2(&q,&e2);

printf(“队头元素为:%dn”,e2);s2=-1;

start2();

break;

case 0: system(“cls”);

choice=-1;

Begin();

break;

}//switch }//while

}//case2

break;//**************************************************

case 3:

{

system(“cls”);

InitSqueue3(&Q);printf(“创建队列完成!n”);printf(“请输入数据个数j3=”);scanf(“%d”,&j3);for(i3=1;i3<=j3;i3++)//输入的数据个数不要超过MAXSIZE,多了的部分没有插入队列

{ printf(“请输入第%d个数据:”,i3);scanf(“%d”,&a3);Ensqueue3(&Q,a3);

} printf(“对头为:%dn”,Q.base[Q.front]);printf(“队尾为:%dn”,Q.base[Q.front+j3-1]);display3(&Q);s3=-1;start3();while(s3!=0)

{

scanf(“%d”,&s3);switch(s3)

{ case 0:

system(“cls”);

choice=-1;

Begin();

break;case 1:

{

system(“cls”);printf(“请输入入队元素:n ”);scanf(“%d”,&x3);Ensqueue3(&Q,x3);display3(&Q);

s3=-1;

start3();break;

} case 2:

{ system(“cls”);DeSqueue3(&Q,&e3);display3(&Q);s3=-1;

start3();break;

} case 3:

{ system(“cls”);if(QueueEmpty3(Q))printf(“此队列为空!n”);else printf(“此队列不为空!n”);

}

s3=-1;

start3();break;case 4:

{ system(“cls”);

Gethead3(&Q,&e3);printf(“对头元素为:%dn”,e3);

s3=-1;

start3();break;

} case 5:

{ system(“cls”);display3(&Q);s3=-1;

start3();break;

}

}//switch

} //while

}//case 3

break;

case 0:

printf(“ 谢谢使用!!n”);

break;

//***************************

}//switch }//while }//main

四.调试分析(xxx)

顺序队列

1.编译并调试,运行程序。

2.设计测试用例,分析测试结果,以验证所完成的系统是否达到预期效果。3.判断队列是否为空。队列是否为空的标志就是队头指针和队尾指针是否同时指向队列中的同一个位置,即队头指针和队尾指针是否相等。

4.队列满时候不能入队列,否则会出现溢出现象。即先要判断队列是否已经已满,因为队尾指针的最大值是MAXQSIZE,所以通过检查队尾指针rear是否等于MAXQSIZE来判断队列是否已满。在删除队首元素时,应首先通过队头指针和队尾指针是否相等判断队列是否已空。

5.在元素出队操作,先通过队头指针和队尾指针是否相等判断队列是否已空,空时不能操作,这是要注意的。

6.程序满足了本次试验的目的和任务要求,可以进行人机交互,在后来的程序中将会做些改进,以增强人机交互性。

7.本程序存在较多不足,如有问题,参考用户手册。

8.在程序语句中,原本使用了大量的生僻的函数名,经过改进,目前使用都是通俗易懂的函数名称,方便用户理解。

链队列

1.编译并调试,运行程序。2.设计测试用例,分析测试结果,以验证所完成的系统是否达到预期效果。

3.要注意设定一个在链队列添加一个头结点并令指针指向头结点。同时,删除不可以在最后面进行删除,但是插入可以最后一个进行插入,这点需要注意 4.需要分别指向队头和队尾的指针。

5.程序满足了本次试验的目的和任务要求,可以进行人机交互,在后来的程序中将会做些改进,以增强人机交互性。

6.本程序存在较多不足,如有问题,参考用户手册。

7.在程序语句中,原本使用了大量的生僻的函数名,经过改进,目前使用都是通俗易懂的函数名称,方便用户理解。

循环队列

1.编译并调试,运行程序。

2.设计测试用例,分析测试结果,以验证所完成的系统是否达到预期效果。

3.为了避免顺序队列造成的“假溢出”现象,我们通常采用顺序循环队列实现队列的顺序存储。4.队头指针和对尾指针与队列元素之间关系和顺序队列一样,不变。5.先判断队列是否为空。就是看队头指针和队尾指针是否同时指向队列中的同一个位置,即队头指针和队尾指针是否相等,空时不能操作,这是要注意的。

6.在将元素插入到队列之前首先要判断队列是否已经已满,根据顺序循环队列队满条件front==(rear+1)%MAXQSIZE来判断队列是否已满。在删除队首元素时,应首先通过队头指针和队尾指针是否相等判断队列是否已空。

6.程序满足了本次试验的目的和任务要求,可以进行人机交互,在后来的程序中将会做些改进,以增强人机交互性。

7.本程序存在较多不足,如有问题,参考用户手册。

8.在程序语句中,原本使用了大量的生僻的函数名,经过改进,目前使用都是通俗易懂的函数名称,方便用户理解。

五、用户手册(xx)1.链队列

(1)本程序的运行环境为DOS操作系统,执行文件名为:j.exe.(2)进入演示程序后即显示文本方式的用户界面,输入元素1,2,3,4,5创建队列。

(3)根据提示,选择操作2执行元素入队操作。回车,输入入队元素0,回车,将0插入到队列中。

(4)选择操作3执行元素出队操作,回车,队首元素1出队。

(5)选择操作1执行输出队列长度操作,回车,输出队列长度为5.(6)选择操作5执行清空队列操作,回车,清空。

(7)选择操作6执行输出队头元素操作,回车,输出元素2。

2.顺序队列

(1)创建队列,输入数据

1,2,3,4,5.(2)选择操作1,执行入队操作.输入入队元素0

(3)选择操作2,执行出队操作。

队首元素1出队.(4)选择操作3,判断对是否为空

(5)选择操作4,输出对头元素2.(6)选择操作5,显示队列元素

3、循环队列

(1)创建队列,输入数据 1,2,3,4,5.(2)选择操作1,执行入队操作.输入入队元素0

(3)选择操作2,执行出队操作。队首元素1出队.(3)选择操作3,判断对是否为空

(5)选择操作4,输出对头元素2.(6)选择操作5,显示队列元素为,2,3,4,5,0

六.测试结果(xxx)1.顺序队列的实现和运算

1)输入1即可进行进入到顺序队列

2)顺序队列的建立,输入元素的个数为5,输入的数据分别为1,2,3,4,5,对头为1,队尾为5,此时队列的数据为1 2 3

3)输入2即可进行入队运算,输入的入队元素为0,此时的队列的数据为1 2 3 4 5 0

4)输入3即可进行判断队列的是否为空,如下图:

5)输入4即可进行去的对头元素的算法,如下图所示:

6)此时的队列的数

0,如

7)输入0即可退出顺序队列,如下图:

8)输入3即可进行顺序队列的算法,如下图所示:

9)输入1即可进

应的入

算,如

10)输入2即可进行队列的出队运算,如下图所示:

:11)输入3

即可判断顺序队列是否为空的算法,如下图所示:

12)输入4即可进行去的头结点的运算,如下图所示:

13)输入5即可进行队列的输出显示的运算,如

14)输入0即可进行退出顺序队列的算法,如下图所示:

下图所示:2.链式队列的实现和运算

1)队列的建立以及队列的个数输入为5,输入的数据分别为1,2,3,4,5.如下图:

2)输入2即可进入到元素的入队运算,输入入队的元素的为0,输入3即可进行相应的元素的出队运算,出队元素为1.如下图:

3)则此时的队列的长度为5,输入4即可进行队列的销毁以及输入5即可进行队列的清空运算,如下图:

4)输入6即可进行输出队列的对头元素,输入0即可进行退出链队列的运算

3.循环队列的实现和运算

1)输入3即可进行循环队列的操作,输入5个数据,它们分别为1 2 3 4 5,输入1,即可进行入队操作,输入入队的元素为0,则此时的数据为1 2 3 4 5 0,如下图所示:

2)输入2即可进行出队运算,如下图所示:

3)输入3即可进行判断队列的是否为空,如下图所示:

4)输入4即可进行取得对头元素,如

5)输入5即可进行输出所有的数据显示,如下图所示:

所示图:

七.心得体会(xx)

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

7.东北大学数据结构实验 篇七

关键词:数据结构与算法,实验教学,改革

数据结构与算法是计算机专业的核心基础课程之一, 通过本门课程的学习, 可以使学生透彻地理解各种数据对象的特点, 学会数据的组织方法和实现方法, 并进一步培养良好的程序设计能力, 而该课程的实验课是学生验证、掌握和应用数据结构理论的重要途径。

一、数据结构与算法上机实验课程的现状

数据结构与算法课程涉及大量数据类型及算法, 理论性很强, 抽象难懂, 对学生的学习造成了一定的难度。受传统的教学模式的影响, 课程的实验教学一直处于从属地位, 同时因学生基本程序设计能力有待提高等因素影响, 实验效果不甚理想。如何使学生理论学习和实践学习相结合, 提高学生的实践能力, 已成为高等院校培养应用型本科人才的一项重要课题。

目前在数据结构与算法实验教学过程中发现的问题主要有以下几点:

1.学生对于上机实验的重要性认识不够。对于学生来说, 由于部分院校的教学资源所限, 数据结构与算法课程长期以来都是课堂和实验分开进行, 授课教师对于上机实验过程几乎不参与, 这就导致了学生重视课堂理论的讲授, 而忽视上机实验课程的重要性。

2.课程实验缺乏层次性。上机实验教学内容大多为简单的验证性实验, 缺乏综合性、应用型、设计性实验项目。增加论述。

3.课程理论性强、难度大。数据结构与算法课程理论性极强, 抽象难懂, 很多学生在课堂听课过程中不能够完全理解, 无法建立起数据结构和相应算法的概念, 长此以往导致学生对于这门课程的畏惧和抵触情绪, 同时也严重打击了学生上机实验的积极性。

4.学生对掌握程序语言的程度不够。学生对程序设计语言掌握得不理想, 也是导致学生上机实验缺乏积极性的一个重要原因。数据结构与算法是学生在学过一门或几门语言课程之后开设的, 其算法大都由C或C++语言描述, 要求学生能够使用某种程序设计语言对算法进行程序设计, 并且上机调试通过。以我学院为例, 学生在学习数据结构时, 虽然已经学过C语言, 但仅是初学, 并不精通。因此对于抽象的数据类型、动态分配存储空间等概念, 在理解上还是有一定困难的。由于对程序设计语言掌握得不好, 大部分学生在编程的过程中陷入迷茫的状态, 阻碍了他们对各类数据结构和算法等知识点的理解和应用, 使教学目标难以实现。

二、实验教学的改革和探索

(一) 实验教学内容的改革

数据结构与算法课程主要使学生掌握程序数据的结构、组织和管理技术以及在此基础上的算法设计与分析技术, 不仅为后续课程操作系统、编译原理、数据库原理、软件工程、人工智能等课程提供必要的知识准备, 更重要的是可以提高学生软件分析、设计、编程和数据组织的能力。根据数据结构与算法整个课程体系的划分, 本课程的上机实验主要分为以下几种类型:

1. 验证性实验。

这一类型的实验主要在上机实验课中完成。以西安交通大学城市学院为例, 本门课程有8个学时的上机实验, 主要任务是将课堂上讲过的内容以实验的形式贯穿起来, 所涉及的实验以教材中提及到的基本算法和例题为主, 基本都是验证性的实验。以单链表为例, 要求学生通过定义线性表的抽象数据类型, 在链式存储结构下完成单链表的建立、插入、删除、查找、求前驱节点和求后继节点等操作, 通过实验教学, 在加深学生对数据结构课程内容理解的同时, 达到理论联系实际的目的。

学生通过完成此类实验, 一方面可以强化基础知识, 另一方面也可以通过编写算法掌握高级语言程序, 同时还可以训练学生良好的编程风格、基本实验技能和科学严谨的实验作风。

2. 综合性实验。

综合性实验部分实在课程设计阶段来完成。主要任务是考查学生运用所学基本数据结构解决实际问题的能力。所设计的实验项目可以是课程设计指导书中提供的参考题目, 也可以是工程中的实际课题, 选题要与所学阶段性知识紧密联系, 任务有一定的难度和综合性, 对学生的编程思路和方法有启发作用的项目。例如:学习了栈和队列知识后可以要求学生设计一个停车场管理系统, 以栈模拟停车场, 以队列模拟车场外的便道, 按照从终端读入的输入数据序列进行模拟管理。又如:学习了图的路径的相关算法后, 可利用学生熟悉的当地交通情况、旅游景点等设计问路系统。这些问题与课本理论知识联系密切, 而且具有一定的实用价值。

3. 研究性实验。

此类实验是针对于学有余力的学生, 可安排一些研究性实验, 针对计算机专业学生的特点, 可以以软件开发的形式进行, 让学生以创新者的角色去做实验。所设计的实验项目都是实际工程中的课题, 题目的解法要求符合工程实际情况, 具有可行性。学生可以自己提出实验题目和开发工具, 自己设计实验过程等, 有条件者还可以进入工程实践中进一步提升实践能力。

(二) 实验教学方法的改革

根据我院学生的特点和学院培养应用性本科人才教育宗旨, 我们在实验教学的方法上进行了改革。

1. 先简后难, 循序渐进。

在上机实验课中, 主要以验证性试验为主, 针对堂课讲授的知识安排配套的练习。练习的内容以编写的数据结构与算法实验指导书的形式发给学生, 每节课明确实验任务、实验方法和结果要求, 使学生在有限的课堂时间中完成相应训练目标, 掌握基础知识, 夯实基础;在课程完成之后的课程设计阶段, 加大难度, 主要以综合性的题目为主, 对于程度特别好的学生也可以完成研究性的项目。针对这一阶段的训练, 我们也编写了相应的课程设计指导书, 提供给学生适合的参考题目和编程提示。有助于学生更好的完成项目要求。通过一系列的训练, 培养学生算法设计能力以及创造性思维, 以达到提高学生应用知识解决复杂问题能力的目标。

2. 启发式教学和分组实验。

在教学方法上, 把传统教法中老师讲, 学生听的“灌输法”转化为“启发式”的教学方法, 引导学生自主思考, 常常提问“WWW”, 即“What, Hao, Why”:这个问题做什么的?需要用的哪方面的知识?怎么去解决问题?如何解决?教师教给学生提出问题、分析问题和解决问题的方法, 学生自行探究问题和解决问题, 激发学生探求知识的欲望和积极的学习兴趣。

在训练的形式上, 改变传统的“集体化”路线, 根据程度的不同将2~4名学生分成多个小组, 任命一名学习能力强、组织能力好的学生担任项目组长, 以软件开发小组的形式协同工作, 合理分工, 共同学习, 通过团队讨论解决问题。各小组成员不仅要完成自己的工作, 还要与其他成员合作, 共同完成整个项目。教师应多给予学生鼓励, 激发学生的思维, 促进他们合作的欲望和热情, 使课堂活泼积极, 并且适时的提供必要的启发式帮助, 只提供意见, 不具体替学生完成。让学生从解决问题和团队合作中获得成就感和自我认同感, 在轻松的氛围中达到激发学生兴趣, 提高学生综合实践能力的目标。

(三) 项目答辩和实验报告结合的考核方法。

1. 项目答辩。

在课程设计实验结束时, 专门抽出时间对个小组成员的工作进行考核, 要求每个小组选派2名学生进行答辩, 在规定时间内陈述小组工作情况, 遇到的问题及解决的办法, 最终达到的效果及心得体会等。根据答辩情况, 给予优、良、中、差和不及格五档评分。通过这种团队合作和答辩的方式大大提升了学生的实践能力、组织和口头表达能力及合作精神。

2. 实验报告的规范。

课程设计实验结束后要求学生写出实验报告, 以作为实验环节评分的书面依据之一和存档材料。实验报告以规定格式的电子文档书写、打印并装订, 排版及图、表要清楚、工整。每个小组每个题目提交一份实验报告, 实验报告除介绍本小组成员所做工作外还应包括以下内容:

(1) 需求分析。以规范的技术文档语言陈述说明项目设计的任务并明确规定: (1) 输入的形式和输入值的范围; (2) 输出的形式; (3) 程序所能达到的功能; (4) 测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。

(2) 概要设计。说明本程序中用到的所有抽象数据类型的定义、主控程序的流程以及各程序模块之间的层次关系。

(3) 详细设计。本阶段的主要任务是实现概要设计中定义的所有数据类型, 对各操作、主程序和其他模块均要求写出伪码算法, 同时可以使用流程图或者N———S图进行描述, 画出函数和过程的调用关系图。

(4) 调试分析。在程序的调试过程中出现的问题以及解决办法, 回顾和讨论设计与实现过程中的相关问题。

(5) 测试结果。列出完整和严格的测试数据, 包括输入和输出。

(6) 用户使用说明。说明程序的使用方法, 并列出每一步的具体操作步骤。

(7) 代码注释。算法必须给出完整、正确的文字注释。

三、改革的效果

通过数据结构与算法实验教学的改革, 学生的学习热情和积极性得到了明显的提高, 学生的主动思考和积极实践的热情得以激发。学生能够在实验期间主动积极的参与并解决问题, 提高了学生的实践能力和编程能力。通过分组合作的方式进行项目训练, 培养了学生的团队合作意识和严谨的工作作风。通过小组答辩, 教师了解了每组学生的学习情况, 把握学生的学习状态和程度, 有助于在日后的教学中给予适当的指导。教师在此过程中不断总结问题, 积累经验, 使教学质量得到显著提高。

四、结束语

数据结构与算法在计算机课程体系中占据重要地位, 其实验环节的教学质量直接关系到本门课程的学习效果。在实验教学过程中必须以培养学生的综合实践能力为宗旨, 不断改进教学方法, 加大实验教学力度, 做到夯实基础, 提高能力, 为学生后续专业课程的学习打下良好的基础。

参考文献

[1]耿国华.数据结构——C语言描述[M].北京:高等教育出版社, 2006.

[2]赵玉霞.《数据结构》课程上机实验改革初探[J].福建电脑, 2007, (4) :213-214.

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

[4]宁正元, 王秀丽, 林大辉.与数据结构[M].北京:清华大学出版社, 2006.

8.实验数据的处理与分析 篇八

1. 实验数据筛选与处理

对实验数据筛选的一般方法和思路为“五看”:

一看数据是否符合测量仪器的精度特点,如托盘天平测得的质量的精度为0.1 g,若精度值超过了这个范围,说明所得数据是无效的;

二看数据是否在误差允许范围内,若所得的数据明显超出误差允许范围,要舍去;

三看反应是否完全,是否是过量反应物作用下所得的数据,只有完全反应时所得的数据,才能进行有效处理和应用;

四看所得数据的测试环境是否一致,特别是气体体积数据,只有在温度、压强一致的情况下才能进行比较、运算;

五看数据测量过程是否规范、合理,错误和违反测量规则的数据需要舍去。

例1 对硝基甲苯是医药、染料等工业的一种重要有机中间体,它常以浓硝酸为硝化剂,浓硫酸为催化剂,通过甲苯的硝化反应制备。

[CH3] [CH3] [CH3] [CH3][NO2][NO2][NO2] [+][+][硝化]

一种新的制备对硝基甲苯的实验方法是:以发烟硝酸为硝化剂,固体NaHSO4为催化剂(可循环使用),在CCl4溶液中加入乙酸酐(有脱水作用), 45℃时反应1 h。反应结束后,过滤,滤液分别用5%NaHCO3溶液、水洗至中性,再经分离提纯得到对硝基甲苯。

(1)上述实验中过滤的目的是 。

(2)滤液在分液漏斗中洗涤静置后,有机层处于 层(填“上”或“下”),放液时,若发现液体流不下来,其可能原因除分液漏斗活塞堵塞外,还有 。

(3)下表给出了催化剂种类及用量对甲苯硝化反应影响的实验结果。

[催

&]

①NaHSO4催化制备对硝基甲苯时,催化剂与甲苯的最佳物质的量之比为 ;

②与浓硫酸催化甲苯硝化相比,NaHSO4催化甲苯硝化的优点有 。

解析 本题主要考查的是物质的性质和制备,同时考查了数据的处理与分析能力,能够迅速在表中提取到有用信息,利用信息解决有关问题。(1)NaHSO4在该反应中作为催化剂,因此反应后过滤的目的是为了回收NaHSO4。(2)该反应是以CCl4作为有机溶剂,CCl4的密度比水大,故有机层在下层;分液漏斗里的液体放不下来,除了分液漏斗堵塞,还有可能是分液漏斗上口活塞未打开。(3)①从题给数据分析,当催化剂与甲苯的比例为0.32时,总产率最高且对硝基甲苯的含量最高;②用NaHSO4作催化剂的优点是在硝化物中对硝基甲苯的比例提高,同时催化剂用量少且能循环使用。

答案 (1)回收NaHSO4 (2)下 分液漏斗上口塞子未打开 (3)①0.32 ②在硝化产物中对硝基甲苯比例提高 催化剂用量少且能循环使用

2. 实验数据综合分析

如何用好、选好数据,是解决这类试题的关键所在。解决这类试题的一般方法为:比较数据,转变物质,分析利弊,确定方案。

a. 对数据进行比较是解决问题的突破口,注意比较数据的交点与重合区。

b. 转变物质则是实现实验目标的重要途径,在一些物质提纯与制备的问题中,往往会提供一些物质沉淀的pH范围、物质的沸点、密度、溶解性等呈现物质的物理性质的数据。在许多情况下,一些物质的相关数据是重叠的,且不利于问题的解决,一般可通过转变物质来解决(如CH3COOH与CH3CH2OH的沸点很接近,要分离两者的混合物,可以通过将CH3COOH转变为CH3COONa的方法,扩大其与CH3CH2OH沸点上的差异,然后通过蒸馏的方法进行分离)。

c. 在实际生产、生活中,除了涉及是否能够通过相应反应来实现实验目标外,还涉及经济效益的问题,在原理、环保等没有大的差异时,选择廉价原料完成相应的实验就成为首选。

例2 “卤块”的主要成分为MgCl2(含Fe2+、Fe3+、Mn2+等杂质离子),若以它为原料,按如下工艺流程图,即可制得“轻质氧化镁”。如果要求产品尽量不含杂质离子,而且成本较低,流程中所用试剂或pH控制可参考附表确定。

[物质&开始沉淀&沉淀完全&Fe(OH)3&2.7&3.7&Fe(OH)2&7.6&9.6&Mn(OH)2&8.3&9.8&Mg(OH)2&9.6&11.1&]

注:Fe2+氢氧化物呈絮状,不易从溶液中除去,所以常将它氧化成为Fe3+,生成Fe(OH)3沉淀而去除之。请填写以下空白:

(1)在步骤②加入试剂X,最佳选择应是 ,其作用是 ;

(2)在步骤③加入的试剂Y应是 ,之所以要控制pH=9.8,其目的是 ;

(3)在步骤⑤时发生的化学反应方程式是 。

解析 从表1可以看出,加入烧碱控制pH=9.8时,即可除去Fe2+、Fe3+、Mn2+,此时Mg2+也会因生成部分Mg(OH)2而进入沉淀中,但因卤块价格低,损失不大,这样做可以保证产品的纯度。将Fe2+氧化成Fe3+,可采用漂白液或H2O2,从价格上看,前者比后者便宜得多,故应选漂白液。

氯化镁制成氧化镁有两条路线:

烧碱路线:MgCl2[+NaOH]Mg(OH)2[灼烧]MgO

纯碱路线:MgCl2[+Na2CO3]MgCO3[灼烧]MgO

烧碱路线不可取,因为烧碱比纯碱的价格高,生成的中间产物Mg(OH)2是胶状沉淀,会造成过滤困难。纯碱价格低,生成的中间产物MgCO3呈粗颗粒状,易过滤,它在水中经一定时间加热后会有一部分水解,生成CO2。CO2的产生可使沉淀变得疏松,灼烧沉淀后可得到轻质MgO。

答案 (1)漂白液 将Fe2+氧化成Fe3+

(2)NaOH 将除Mg2+以外的各种杂质金属离子都生成相应的氢氧化物沉淀,以便过滤除去

(3)MgCO3+H2O[煮沸]Mg(OH)2↓+CO2↑

上一篇:质量工作考核汇报(区修改版)下一篇:妇幼保健院业务大楼介绍