数据结构实验报告.docx
《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
![数据结构实验报告.docx](https://file1.bdocx.com/fileroot1/2023-5/26/b7aba58a-5c83-433e-b73f-27b68824f6bb/b7aba58a-5c83-433e-b73f-27b68824f6bb1.gif)
数据结构实验报告
苏州科技学院
数据结构(C语言版)
实验报告
专业班级地信0912
学号0920209210
姓名吕俊
实习地点C1机房
指导教师史守正
实验一线性表
一、程序设计的基本思想,原理和算法描述:
(包括程序的结构,数据结构,输入/输出设计,符号名说明等)
线性表是最常用且最简单的一种数据结构。
简言之,一个线性表是n个数据元素的有限序列。
至于每个数据元素的具体含义,在不同的情况下各不相同,它可以是一个数或者一个符号,也可以是一页书,甚至其他更复杂的信息。
线性表是一个相当灵活的数据结构,它的长度可根据需要增长或者缩短,即对线性表的数据元素不仅访问,还可以进行插入和删除等。
二、源程序及注释(打包上传):
三、运行输出结果:
1、建立线性表
2、插入元素
3、删除元素
4、查找元素
四、调试和运行程序过程中产生的问题及采取的措施:
问题:
在调试过程中只要碰到了程序检查无误,却不能运行?
解决:
经过多次反复的检查和修改,发现是指针出了问题,最终正常运行了程序。
五、对算法的程序的讨论、分析,改进设想,其它经验教训:
分析,改进设想:
整个算法在运行复杂程度上还有许多需要改进,可以通过查阅资料度分段功能程序进行简化。
经验教训:
上课听老师在上面说的时候自己听的懂,感觉很简单,也不记笔记,然后上机自己去做程序的时候发现自己不知道该怎么动手。
发现自己还是没有完全了解这个程序,以后要勤动手,不做语言的巨人。
实验二栈和队列
一、程序设计的基本思想,原理和算法描述:
(包括程序的结构,数据结构,输入/输出设计,符号名说明等)
栈的定义和特点
定义:
限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈
特点:
先进后出(FILO)或后进先出(LIFO)
队列的定义及特点
定义:
队列是限定只能在表的一端进行插入,在表的另一端进行删除的线性表。
队尾(rear)——允许插入的一端
队头(front)——允许删除的一端
队列特点:
先进先出(FIFO)
循环队列入队操作:
算法说明:
删除队头元素,返回其值x并修改队头指针
分析:
(1)在删除前应当判断队列是否空?
if(q->front=q->rear)returnfalse;
(2)删除动作分析;
前面约定指针front指向队首元素的位置,故:
x=q->data[q->front];
q->front=(q->front+1)%Maxsize
二、源程序及注释(打包上传):
三、运行输出结果:
1、建立栈:
构造一个空栈,并插入元素
2、入栈,插入元素
3、出栈,删除元素
4、取栈顶元素
5、输出显示栈内元素,从栈底到栈顶
四、调试和运行程序过程中产生的问题及采取的措施:
问题:
队列队尾指针已经移到了最后,再有元素入队就会出现溢出,而事实上此时队中并未真的“满员”。
解决:
队列的数据区data[0..MAXSIZE-1]看成头尾相接的循环结构,头尾指针的关系不变,将其称为“循环队”。
五、对算法的程序的讨论、分析,改进设想,其它经验教训:
讨论、分析,改进设想:
栈和队列是两种常见的数据结构,它们都是运算受限的线性表。
经验教训:
栈的输入和删除都在栈顶进行,它是后进先出线性表。
队列的插入在队尾,而删除在队头,它是先进先出的线性表。
当解决具有先进先出(或后进先出)特性的实际问题时,可以使用队列(或栈)这种数据结构来解决。
实验三树和二叉树
一、程序设计的基本思想,原理和算法描述:
(包括程序的结构,数据结构,输入/输出设计,符号名说明等)
结点的度:
结点具有的子树数称为该结点的度(Degree)。
叶子结点:
度为0的结点,即没有子树的结点。
分支结点:
度大于零的结点。
内部结点:
除根结点外的分支结点。
树的度:
一棵树中各个结点度数的最大值。
二叉树或为空树,或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。
算法基本思想:
首先读入当前根结点数据,如果是’#‘,则表示当前树根置为空,否则申请一个新结点,存入当前根结点的数据,分别用当前根结点的左子域和右子域进行递归调用,创建左、右子树。
BiTreeCreateBiTree()
{charch;BiTreeNode*p;
ch=getchar();
if(ch==‘#’)returnNULL;
else
{p=(BiTreeNode*)malloc(sizeof(BiTreeNode));
p->data=ch;
p->LChild=CreateBiTree();
p->RChild=CreateBiTree();
return(p);
}
}
二、源程序及注释(打包上传):
三、运行输出结果:
1、建立二叉树,插入节点
2、先序遍历二叉树
3、中序遍历二叉树
4、后序遍历二叉树
5、二叉树的结点总数
6、二叉树叶子数
7、二叉树的深度
四、调试和运行程序过程中产生的问题及采取的措施:
问题:
在第一步建立二叉树,插入结点的时候会搞错数据的输入顺序,搞错结点。
从而不能成功建立二叉树。
措施:
看书,理解书上如何来区分结点顺序,正确的输入数据。
五、对算法的程序的讨论、分析,改进设想,其它经验教训:
讨论、分析,改进设想:
感觉没什么好改进的。
经验:
1.熟练掌握二叉树的结构特性,了解相应的证明方法。
熟悉二叉树的各种存储结构的特点及适用范围。
不然在自己做的时候感觉有点模糊不清。
实验四
一、程序设计的基本思想,原理和算法描述:
(包括程序的结构,数据结构,输入/输出设计,符号名说明等)
程序设计的基本思想,原理和算法描述:
基本操作:
1.构造有向图G
2.构造有向网G
3.构造无向图G
4.构造无向网G
1、建立无向网的邻接矩阵存储并输出,参考程序清单,实现无向图的邻接矩阵表示。
1、建立图的邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历
三、运行输出结果:
四、调试和运行程序过程中产生的问题及采取的措施:
问题:
这个实验做的让人做的迷迷糊糊,无从下手。
措施:
跟同学相互间合作,相互讨论最后成功运行代码。
五、对算法的程序的讨论、分析,改进设想,其它经验教训:
讨论、分析、改进设想、经验教训:
我们在做数据结构实验的时候,我们不能急,有时候编程出现问题的时候,要静下心来慢慢去编程,越急越不能做好。
当一个人不会做的时候,跟同学相互交流一下自己的体会,或许就会豁然开朗的,就像这次,自己一个人在机房做的时候百思不得其解,跟同学相互讨论一下之后,就发现自己理解了,不仅加深了对本实验的理解更是同学之间的交流。
实验五查找
一、程序设计的基本思想,原理和算法描述:
(包括程序的结构,数据结构,输入/输出设计,符号名说明等)
基本操作:
1、建立二叉排序树2、插入结点3、删除结点4、查找结点
基本思想:
查找是根据给定的某个值,在查找表中确定一个其关键字等于给定值的记录或数据元素。
对查找表经常进行的操作有:
1)查询某个“特定的”数据元素是否在查找表中;2)检索某个“特定的”数据元素的各种属性3)在查找表中删去某个数据元素。
若对查找表只能做前两种统称为“查找”的操作,则称谓静态查找表。
若在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除以存在的某个数据元素,称为动态查找表。
三、运行输出结果:
1、建立二叉排序树
2、插入结点
3、删除结点
4、查找结点
四、调试和运行程序过程中产生的问题及采取的措施:
问题:
程序运行时,数据指针出现错误,没有得到输入的值。
措施:
把指针删掉就可以了。
五、对算法的程序的讨论、分析,改进设想,其它经验教训:
讨论、分析,改进设想、经验教训:
查找包括静态查找表和动态查找表。
静态查找表又包括:
1)顺序表的查找2)有序表的查找3)静态数表的查找4)索引顺序表的查找。
动态查找表:
1)二叉排序树和平衡二叉树2)B-树和B+树3)键树
对于这种查找问题,当完成的时候会发现很简单,但自己做的时候就是不知道为什么不会,看书自己复习看的也是迷迷糊糊,以后上数据机构的课要认真听,不然就快要听不懂了。
实验六排序
一、程序设计的基本思想,原理和算法描述:
(包括程序的结构,数据结构,输入/输出设计,符号名说明等)
排序:
计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键词有序的序列。
基本操作:
1、建立线性表2、直接插入3、冒泡排序4、快速排序5、简单选择排序6、堆排序
直接插入排序:
一种最简单的排序方法,它的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。
快速排序:
基本思想:
通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一程序记录的关键字小,则可分别对这两部分记录继续排序,以达到整个序列有序。
简单选择排序:
基本思想:
每一趟在n-i+1个记录中选取关键字最小的记录作为有序序列中第i个记录。
堆排序:
只需要一个记录大小的辅助空间,每个待排序的记录仅占有一个存储空间。
二、源程序及注释(打包上传):
三、运行输出结果:
1、建立线性表
2、直接插入
3、冒泡排序
4、快速排序
5、简单选择排序
6、堆排序
四、调试和运行程序过程中产生的问题及采取的措施:
问题:
第一个排序算法对输入数据排序后,后两个排序所要排的序列已拍好。
措施:
再次定义了两个数组,将输入的数据分别复制到另外两个数组,对三个数组的相同数据序列用三个排序算法排序。
五、对算法的程序的讨论、分析,改进设想,其它经验教训:
讨论、分析,改进设想经验教训:
由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序方法分为两大类:
一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程,另一类是外部排序,指的是待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。
内部排序根据不同的原则对内部排序进行分类,可大致分为插入排序。
交换排序、选择排序、归并排序和计数排序等五类。
根据工作量来排序可分为三类:
1)、简单的排序方法,2)、先进的排序方法,3)、基数排序。