数据结构实验.docx

上传人:b****8 文档编号:11401239 上传时间:2023-02-28 格式:DOCX 页数:30 大小:33.17KB
下载 相关 举报
数据结构实验.docx_第1页
第1页 / 共30页
数据结构实验.docx_第2页
第2页 / 共30页
数据结构实验.docx_第3页
第3页 / 共30页
数据结构实验.docx_第4页
第4页 / 共30页
数据结构实验.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

数据结构实验.docx

《数据结构实验.docx》由会员分享,可在线阅读,更多相关《数据结构实验.docx(30页珍藏版)》请在冰豆网上搜索。

数据结构实验.docx

数据结构实验

 

《数据结构》

 

实验指导书

 

肇庆学院计算机科学系编

前言

数据结构是信息与计算科学专业中一门重要的专业基础课程。

当用计算机来解决实际问题时,就要涉及到数据的表示及数据的处理,而数据表示及数据处理正是数据结构课程的主要研究对象,通过这两方面内容的学习,为后续课程,特别是软件方面的课程打下了厚实的知识基础,同时也提供了必要的技能训练。

因此,数据结构课程在计算机应用专业中具有举足轻重的作用。

本书是针对《数据结构》教程的上机实验指导书,内容包括线性表、栈和队列、串、数组和稀疏矩阵、递归、树状结构、图、查找、排序等。

书后附录中给出了学生应提交的实验报告的格式。

本上机实验指导书旨在通过指导学生上机实践,对常用数据结构的基本概念及其不同的实现方法的理论得到进一步的掌握,并对在不同存储结构上实现不同的运算方式和技巧有所体会。

本实验指导书的内容都是基于C语言的,因此,要求学生对C语言要有一定的了解。

建议使用TurboC2.0或VC++作为实验平台。

根据学生的实际情况,本上机实验指导书的内容大多数为基本算法的综合验证,也包括部分算法设计。

本上机实验指导书共有9个实验内容,每个实验约为4课时。

由于作者对《数据结构》知识所知有限,书中难免存在错误,恳请读者及时加以指正,以便改进。

如有对于本书的意见和建议,请与编者联系,E-mail:

lg@。

衷心感谢!

编者

目录

前言

实验一顺序表1

实验二单链表3

实验三栈和队列5

实验四串7

实验五数组8

实验六树和二叉树10

实验七图12

实验八查找14

实验九排序16

参考资料18

附录1:

肇庆学院计算机系实验报告格式19

附录2:

上机实习注意事项21

实验一顺序表

一、预备知识

1.顺序表的存储结构形式及其描述

2.顺序表的建立、查找、插入和删除操作

二、实验目的

1.掌握顺序表的存储结构形式及其描述

2.掌握顺序表的建立、查找、插入和删除操作

三、实验内容

1.编写函数,输入一组整型元素序列,建立一个顺序表。

2.编写函数,实现对该顺序表的遍历。

3.编写函数,在顺序表中进行顺序查找某一元素,查找成功则返回其存储位置i,否则返回错误信息。

4.编写函数,实现在顺序表的第i个位置上插入一个元素x的算法。

5.编写函数,实现删除顺序表中第i个元素的算法。

6.编写利用有序表插入算法建立一个有序表的函数。

7.编写函数,利用以上算法,建立两个非递减有序表,并把它们合并成一个非递减有序表。

8.编写函数,实现输入一个元素x,把它插入到有序表中,使顺序表依然有序。

9.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。

四、实验说明

1.顺序表的存储定义

#defineMAXSIZE100//顺序表的最大元素个数

typedefintElemType;//顺序表的元素类型

typedefstructlist

{ElemTypeelem[MAXSIZE];//静态线性表

intlength;//顺序表的实际长度

}SqList;//顺序表的类型名

五、注意问题

1.插入、删除时元素的移动原因、方向及先后顺序。

2.理解不同的函数形参与实参的传递关系。

六、实验报告

根据实验情况和结果撰写并递交实验报告。

实验二单链表

一、预备知识

1.动态链表的存储结构形式及其描述

2.单链表的建立、查找、插入和删除操作

二、实验目的

1.掌握单链表的存储结构形式及其描述

2.掌握单链表的建立、查找、插入和删除操作

三、实验内容

1.编写函数,实现随机产生或键盘输入一组元素,建立一个带头结点的单链表(无序)。

2.编写函数,实现遍历单链表。

3.编写函数,实现把单向链表中元素逆置(不允许申请新的结点空间)。

4.编写函数,建立一个非递减有序单链表。

5.编写函数,利用以上算法,建立两个非递减有序单链表,然后合并成一个非递减链表。

6.编写函数,在非递减有序单链表中插入一个元素使链表仍然有序。

7.编写函数,实现在非递减有序链表中删除值为x的结点。

8.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。

四、实验说明

1.单链表的类型定义

#include

typedefintElemType;//单链表结点类型

typedefstructLNode

{ElemTypedata;

structLNode*next;

}LNode,*LinkList;

2.为了算法实现简单,最好采用带头结点的单链表。

五、注意问题

1.重点理解链式存储的特点及指针的含义。

2.注意比较顺序存储与链式存储的各自特点。

3.注意比较带头结点、无头结点链表实现插入、删除算法时的区别。

4.单向链表的操作是数据结构的基础,一定要注意对这部分的常见算法的理解。

六、实验报告

根据实验情况和结果撰写并递交实验报告。

实验三栈和队列

一、预备知识

1.栈的顺序存储和链式存储结构的类型定义方法及其基本操作算法

2.队列的顺序存储和链式存储结构的类型定义方法及其基本操作算法

二、实验目的

1.掌握栈、队列的思想及其存储实现

2.掌握栈、队列的常见算法的程序实现

三、实验内容

1.编写函数,采用链式存储实现栈的初始化、入栈、出栈操作。

2.编写函数,采用顺序存储实现栈的初始化、入栈、出栈操作。

3.编写函数,采用链式存储实现队列的初始化、入队、出队操作。

4.编写函数,采用顺序存储实现队列的初始化、入队、出队操作。

5.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。

四、实验说明

1.顺序栈的类型定义

#defineMAX100//栈的最大值

typedefstruct

{ElemType*base;

inttop;

}SqStack;

2.链栈的类型定义

typedefstructSqNode

{SElemTypedata;

SqNode*Link;

}*Sqptr;

typedefstruct

{Sqptrtop;//栈项指针

}

3.顺序队列的类型定义

#defineMAX100//队列的最大长度

typedefstruct

{ElemType*base;

intfront,rear;

}SqQueue;

4.单链队列的类型定义

typedefstructQNode

{QElemTypedata;

structQNode*next;

}*QueuePtr;

typedefstruct

{QueuePtrfrout;//队头指针

QueuePtrrear;//队尾指针

}

五、注意问题

1.重点理解栈、队列的算法思想,能够根据实际情况选择合适的存储结构。

2.明确栈、队列均是特殊的线性表。

3.栈、队列的算法是后续实验的基础(广义表、树、图、查找、排序等)。

六、实验报告

根据实验情况和结果撰写并递交实验报告。

实验四串

一、预备知识

1.字符串的基本概念

2.字符串的模式匹配算法

二、实验目的

1.理解字符串的模式匹配算法(包括KMP算法)

三、实验内容

1.编写函数,实现字符串的模式匹配算法。

四、实验说明

1.从键盘输入主串和子串元素,调用字符串的模式匹配算法,判断子串是否在主串中,若在,返回起始位置,否则显示否定信息。

五、注意问题

1.明确串也是特殊的线性表,掌握其特殊性所在。

六、实验报告

根据实验情况和结果撰写并递交实验报告。

实验五数组

一、预备知识

1.稀疏矩阵的三元组表压缩存储结构

2.稀疏矩阵的三元组表表示方法下的相乘算法

二、实验目的

1.掌握稀疏矩阵的三元组表存储结构的实现

2.实现稀疏矩阵的三元组表表示下的相乘算法

三、实验内容

1.编写程序,实现利用三元组表进行两个稀疏矩阵相乘的算法。

四、实验说明

1.三元组表的类型定义

#defineMAXSIZE1000//非零元素个数的最大值

typedefstruct

{introw,col;//非零元素的行下标和列下标

ElemTypee;//非零元素的值

}Triple;

typedefstruct

{Tripledata[MAXSIZE+1];

//非零元素的三元组表,data[0]未用

intmu,nu,tu;//矩阵的行数、列数和非零元素个数

}TSMatrix;

五、注意问题

1.首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。

可设矩阵的行数和列数均不超过20。

2.程序可以对三元组的输入顺序加以限制,例如,按行优先,以便提高计算效率。

3.在用三元组表示稀疏矩阵时,相加或相减所得结果矩阵应该另生成,乘积矩阵也可用二维数组存放。

4.三元组表是线性表的一种应用,通过它可以更好地理解线性表的存储结构。

同时矩阵又是图的重要的存储方式,所以这个实验对更好地掌握线性表对将来对图的理解都有极大的帮助。

六、实验报告

根据实验情况和结果撰写并递交实验报告。

实验六树和二叉树

一、预备知识

1.二叉树的二叉链表存储结构

2.二叉树的常见算法

二、实验目的

1.掌握二叉树的存储实现

2.掌握二叉树的遍历思想

3.掌握二叉树的常见算法的程序实现

三、实验内容

1.编写函数,输入字符序列,建立二叉树的二叉链表。

2.编写函数,实现二叉树的中序递归遍历算法。

(最好也能实现前缀和后缀遍历算法)

3.编写函数,实现二叉树的中序非递归遍历算法。

4.编写函数,借助队列实现二叉树的层次遍历算法。

5.编写函数,求二叉树的高度。

6.编写函数,求二叉树的结点个数。

7.编写函数,求二叉树的叶子个数。

8.编写函数,交换二叉树每个结点的左子树和右子树。

9.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。

四、实验说明

1.二叉链表的类型定义

#defineElemTypechar//二叉链表结点类型

typedefstructBiTNode

{ElemTypedata;

structBiTNode*lchild,*rchild;

}BiTNode,*BiTree;

2.元素类型可以根据实际情况选取。

五、注意问题

1.注意理解递归算法的执行步骤。

2.注意字符类型数据在输入时的处理。

3.重点理解如何利用栈结构实现非递归算法

六、实验报告

根据实验情况和结果撰写并递交实验报告。

实验七图

一、预备知识

1.图的邻接矩阵和邻接表存储结构

2.图的深度优先搜索遍历和广度优先搜索遍历算法

二、实验目的

1.掌握图的存储思想及其存储实现

2.掌握图的深度、广度优先遍历算法思想及其程序实现

3.掌握图的常见应用算法的思想及其程序实现

三、实验内容

1.编写函数,采用邻接矩阵表示法,构造一个无向网。

2.编写函数,实现从键盘输入数据,建立一个有向图的邻接表。

3.编写函数,输出该邻接表。

4.编写函数,采用邻接表存储实现无向图的深度优先非递归遍历。

5.编写函数,采用邻接表存储实现无向图的广度优先遍历。

6.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。

四、实验说明

1.邻接表的类型定义

#defineMAX_VERTEX_NUM10//顶点最大个数

typedefstructArcNode

{intadjvex;

structArcNode*nextarc;

intweight;//边的权

}ArcNode;//表结点

#defineVertexTypeint//顶点元素类型

typedefstructVNode

{intdegree,indegree;//顶点的度,入度

VertexTypedata;

ArcNode*firstarc;

}VNode/*头结点*/,AdjList[MAX_VERTEX_NUM];

typedefstruct

{AdjListvertices;

intvexnum,arcnum;//顶点的实际数,边的实际数

}ALGraph;

2.上述类型定义可以根据实际情况适当调整。

五、注意问题

1.注意理解各算法实现时所采用的存储结构。

六、实验报告

根据实验情况和结果撰写并递交实验报告。

实验八查找

一、预备知识

1.查找的不同方法,图的邻接矩阵和邻接表存储结构

2.二叉排序树的构造和查找方法

二、实验目的

1.掌握各种不同查找算法的思想及高级语言程序实现

2.掌握二叉排序树的查找、插入、删除算法的思想及程序实现

三、实验内容

1.编写函数,建立有序表,采用折半查找实现某一已知的关键字的查找。

(采用顺序表存储结构)

2.编写函数,随机产生一组关键字,利用二叉排序树的插入算法建立二叉排序树。

3.编写函数,在以上二叉排序树中删除某一指定关键字元素。

4.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。

四、实验说明

1.二叉排序树的类型定义//二叉排序树的存储结构采用二叉链表作为存储结构

#defineElemTypechar//二叉链表结点类型

typedefstructBiTNode

{ElemTypedata;

structBiTNode*lchild,*rchild;

}BiTNode,*BiTree;

2.各种关键字数据输入可利用随机函数自动产生,以便节省上机时间。

五、注意问题

1.注意理解折半查找的适用条件(思考:

链表能否实现折半查找?

)。

2.注意建立二叉排序树相同元素的处理。

3.注意理解静态查找、动态查找概念。

4.比较各种查找算法的各自特点,能够根据实际情况选择合适的查找方法。

六、实验报告

根据实验情况和结果撰写并递交实验报告。

实验九排序

一、预备知识

1.排序算法(插入排序、交换排序、选择排序、归并排序、基数排序等)的思想、特点及其适用条件

二、实验目的

1.掌握常见的排序算法(插入排序、交换排序、选择排序、归并排序、基数排序等)的思想、特点及其适用条件

2.熟练掌握常见的排序算法的程序实现

三、实验内容

输入一组关键字序列,分别实现下列排序算法:

1.编写函数,实现简单选择排序、直接插入排序和冒泡排序算法。

2.编写函数,实现希尔排序算法。

3.编写函数,实现快速排序算法。

4.编写函数,实现堆排序算法。

5.编写函数,实现折半插入排序算法。

6.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。

四、实验说明

1.排序序列的类型定义

#defineMAXSIZE100/*参加排序元素的最大个数*/

typedefstructlist

{intkey;

}RedType;

typedefstruct

{RedTyper[MAXSIZE+1];

intlength;/*参加排序元素的实际个数*/

}SqList;

五、注意问题

1.注意理解各种算法的思想、了解算法的适用情况及时间复杂度,能够根据实际情况选择合适的排序方法。

六、实验报告

根据实验情况和结果撰写并递交实验报告。

参考资料

《数据结构(C语言版)》,严蔚敏、吴伟民著(编),清华大学出版社,1999

《数据结构习题集(C语言版)》,严蔚敏、吴伟民著(编),清华大学出版社,1999

《数据结构与算法》,许卓群、杨冬青、唐世渭、张铭著(编),高等教育出版社,2004

《数据结构-C语言描述》,耿国华著(编),高等教育出版社,2005

《数据结构与程序设计——C++语言描述(影印版)》,RobertL.Kurse,AlexandeerJ.Ryba著(编),高等教育出版社,2001

附录1:

肇庆学院计算机系实验报告格式

肇庆学院计算机科学系

实验报告

专业_________班级__________姓名__________学号__________课程名称_____________

学年200--200学期1□/2□课程类别专业必修□限选□任选□实践□

●实验内容:

实验时间:

200年月日

 

●实验目的及要求:

 

●实验内容、方法与步骤:

(使用附页填写并附在本页后)

 

●实验结果:

 

●小结:

分数:

批阅老师:

200年月日

第页/共页

肇庆学院计算机科学系

实验报告(附页)

 

分数:

批阅老师:

200年月日

第页/共页

附录2:

上机实习注意事项

一、关于上机实习的建议

上机实习应该按照一定的步骤和规范进行,从以往的教学实习的经验来看,在初学阶段执行严格的实习步骤规范(包括上机操作规范),会大大提高上机时间的利用率,有助于养成良好的程序编制风格,培养严谨、科学、高效的工作方式。

在以往的教学实践中,经常有学生不屑于按实习步骤规范去做,甚至对于实习步骤的要求和建议看都不看一遍,这是极其害的。

实习步骤规范不但可以培养科学化的工作作风,而且还能有效地避免错误。

二、上机实验的步骤和规范

1.问题分析和任务的定义

充分地分析和理解问题本身,明确问题要求做什么,限制做什么(本步骤强调做什么,而不是怎么做)。

对问题的描述应避开算法和所涉及的数据类型,而是对所要完成的任务做出明确的回答。

如输入数据的类型、值的范围以及输入的形式;输出数据的类型、值得范围及输出的形式;还应该为调试程序准备好测试数据,包括合法的输入数据和非法形式的输入数据。

2.数据类型定义和系统设计

本设计步骤可分逻辑设计和详细设计两步实现。

逻辑设计指的是,为问题的描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主模块和各抽象数据类型;详细设计则为定义相应的存储结构并写出各函数的伪码算法。

在这个过程中,要综合考虑系统的功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据的封装,基本操作的规格说明尽可能的明确和具体。

作为逻辑设计的结果。

应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的规格说明),各个主要模块的算法,并画出模块之间的调用关系图。

详细设计的结果是对数据结构和基本操作的规格说明做出进一步的求精,写出数据存储结构的类型定义,按照算法书写规范用类C语言写出函数形式的算法框架。

3.编码实现和静态检查

本步骤的目的是对详细设计的结果进一步求精,用高级语言把详细设计的构思表示出来,并且对设计进行静态检查,自己用一组数据手动执行程序,以全面地了解该程序的逻辑。

4.上机准备和上机调试

上机前要熟悉机器的用户手册,熟悉常用的命令。

准备调试的工具,考虑调试方案。

上机调试应采用自底向上方法,先调试底层模块,再调试上层模块。

最后,整个程序进行联调。

调试正确后将源程序和运行结果加以打印输出。

5.总结和整理实习报告

实习报告的整理步骤:

(1)需求及规格说明

问题描述,求解的问题是什么。

(2)设计

设计思想:

存储结构,主要的算法思想。

设计表示:

子程序(过程或函数)的规格说明,通过调用关系图表示它们之间的调用关系。

实现注释:

详细设计表示:

主要算法的框架。

用户手册:

使用说明。

调试报告:

问题是如何解决的,讨论与分析,改进设想,经验与体会,时空复杂度等。

(3)附录

源程序清单和结果:

源程序必须有注释,以及必要的测试数据和运行结果数据。

实验报告要求

在程序开发过程中,逐步形成各种必要的文档及资料。

可以写在实验报告纸上,或以电子文档的形式进行书写。

实验六:

矩阵的压缩存储

    

        {

          if(M.data[total].i==row&&M.data[total].j==col)

          {printf("%-5d",M.data[total].e);

            total++;

          }

          elseprintf("%-5d",0);

        }

        printf("\n");

    }

}

TSMatrixTransposeSMatrix(TSMatrixA)          /*转置函数;*/

{TSMatrixB;

    intcol,k,p=0;

    B.mu=A.nu;

    B.nu=A.mu;

    B.tu=A.tu;

    if(A.tu)

    {

      for(col=1;col<=A.nu;col++)

        for(k=0;k

          if(A.data[k].j==col)

              {B.data[p].i=A.data[k].j;

                B.data[p].j=A.data[k].i;

                B.data[p].e=A.data[k].e;

                p++;

              }

    

        }

      returnB;  

}

    

TSMatrixAddTriTuple(TSMatrixA,TSMatrixB)  

    {      TSMatrixC;                                /*三元组表表示的稀疏矩阵A,B相加;*/

        intk=0,l=0,t=0;    

        inttemp;

        C.mu=A.mu;

        C.nu=A.nu;

        while(k

        {if((A.data[k].i==B.data[l].i)&&(A.data[k].j==B.data[l].j))

          {temp=A.data[k].e+B.data[l].e;

              if(temp)

                  {C.data[t].i=A.data[k].i;

                    C.data[t].j=A.data[k].j;

                    C.data[t].e=temp;

                    k++;l++;t++;

                  }

              else{k++;l++;}

          }

        

          elseif((A.data[k].i==B.data[l].i)&&(A.data[k].j

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 商业计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1