数据结构算法实验6 堆的基本操作附源代码.docx
- 文档编号:9421458
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:14
- 大小:120.17KB
数据结构算法实验6 堆的基本操作附源代码.docx
《数据结构算法实验6 堆的基本操作附源代码.docx》由会员分享,可在线阅读,更多相关《数据结构算法实验6 堆的基本操作附源代码.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构算法实验6堆的基本操作附源代码
浙江大学城市学院实验报告
课程名称数据结构与算法
实验项目名称实验六堆的基本操作
实验成绩指导老师(签名)日期
一.实验目的和要求
1.掌握堆的基本概念。
2.掌握堆基本操作的实现。
二.实验内容
1.实现大根堆用顺序存储结构存储时基本操作的实现。
要求编写头文件Heap.h,包括堆的存储结构定义与基本操作实现函数;编写主函数文件test8_2.cpp,验证头文件中各个操作。
堆的顺序存储结构定义如下:
typedefstruct{
ElemType*heap;//指向动态申请空间的基地址
intlen;//堆的长度,即实际存储结点个数
intMaxSize;//动态申请空间的长度
}Heap;
大根堆的基本操作如下:
①voidInitHeap(Heap&HBT);
//初始化堆
②voidClearHeap(Heap&HBT);
//清除堆
③boolEmptyHeap(HeapHBT);
//检查一个堆是否为空
④voidInsertHeap(Heap&HBT,ElemTypeitem);
//向堆插入一个元素
⑤ElemTypeDeleteHeap(Heap&HBT);
//从堆中删除一个元素
2.选做:
编写一个函数,判断一棵顺序结构存储的完全二叉树是否是大根堆。
函数原型为boolIsHeap(HeapBT),将该函数添加到头文件Heap.h中,并在主函数文件test8_2.cpp中添加相应语句进行测试。
3.填写实验报告,实验报告文件取名为report6.doc。
4.上传实验报告文件report6.doc与源程序文件Heap.h及test8_2.cpp到Ftp服务器上你自己的文件夹下。
三.函数的功能说明及算法思路
包括每个函数的功能说明,及一些重要函数的算法实现思路
函数:
voidInitHeap(Heap&HBT)
功能:
初始化堆
思路:
将堆的最大容量设置为10,以此容量动态申请空间,并将堆的当前长度置为0
函数:
voidClearHeap(Heap&HBT)
功能:
清除堆
思路:
删除堆的heap指针所指向的空间,并将heap置为NULL,将堆的当前长度和最大容量都置为0
函数:
boolEmptyHeap(HeapHBT)
功能:
检查一个堆是否为空
思路:
返回堆的长度是否等于0的判断结果
函数:
voidInsertHeap(Heap&HBT,ElemTypeitem)
功能:
向堆插入一个元素
思路:
先把新元素加到堆尾,满足完全二叉树形状;然后从下往上调整堆元素,使符合堆的特性。
具体操作为:
保证堆的大小足够,插入的元素默认放在堆的最后,依次比较它和其双亲结点(若有)的值的大小,由于题目要求生成大根堆,所以调整位置时若当前结点比其双亲结点大时,将双亲结点的值赋给当前结点。
最后,将插入的值赋给找到的结点,并将堆的长度加1
函数:
ElemTypeDeleteHeap(Heap&HBT)
功能:
从堆中删除一个元素
思路:
即删除堆顶元素。
堆顶位置由堆尾元素来填补,使满足完全二叉树形状;然后需从上往下调整堆元素,使符合堆的特性。
具体操作为:
若新调整的元素值小于左右孩子值,则把左右孩子值中较大的一个往上移(即与新元素交换),否则调整过程结束。
函数:
voidPrintHeap(Heap&HBT)
功能:
打印堆
思路:
假如堆为空,则输出信息退出;若堆不为空,遍历heap指针所指向的所有结点空间,输出每个结点的结点值
函数:
boolIsHeap(HeapBT,inti)
功能:
选做:
判断一棵顺序结构存储的完全二叉树是否是大根堆。
思路:
采用从上往下的方式使用递归。
i代表当前比较的结点,分三种情况:
①当前比较的结点为叶结点,没有左右孩子,返回true;②当前结点有左右孩子,则若其比其中一个孩子小,返回false;否则递归调用函数,返回左右孩子是否为大根堆的情况;③当前结点只有左孩子,则若其比左孩子小,返回false,否则返回true。
四.实验结果与分析
包括运行结果截图等
【测试数据①】
输入结点:
2356406238551016
正确的大根堆如图:
第1次删除:
62
删除结果应为:
56385523164010
第2次删除:
56
删除结果应为:
553840231610
第3次删除:
55
删除结果应为:
4038102316
第4次删除:
40
删除结果应为:
38231016
第5次删除:
38
删除结果应为:
231610
第6次删除:
23
删除结果应为:
1610
第7次删除:
16
删除结果应为:
10
第8次删除:
10
删除结果应为:
提示堆为空
【选作部分】
按层序输入:
4820369541210
生成的二叉树如图,不为大根堆:
【测试数据②】
输入结点:
182225363520534274
正确的大根堆如图:
第1次删除:
74
删除结果应为:
5342363525202218
第2次删除:
53
删除结果应为:
42353618252022
第3次删除:
42
删除结果应为:
363522182520
第4次删除:
36
删除结果应为:
3525221820
第5次删除:
35
删除结果应为:
25202218
第6次删除:
25
删除结果应为:
222018
第7次删除:
22
删除结果应为:
2018
第8次删除:
20
删除结果应为:
18
第9次删除:
18
删除结果应为:
提示堆为空
【选作部分】
按层序输入:
48203615161210
生成的大根堆如图:
五.心得体会
记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。
【附录----源程序】
[Test8_2.cpp]
#include
#include
#include
#include
#include"Heap.h"
voidmain(){
HeapHBT;
intn,i;
ElemTypeitem;
InitHeap(HBT);
cout<<"请输入堆元素,以-1结尾:
"< while(scanf("%d",&item),item! =-1) InsertHeap(HBT,item); cout<<"生成的堆为: "; PrintHeap(HBT); cout< i=1; while(! EmptyHeap(HBT)){ cout<<"第"< "< cout<<"删除结果: "; PrintHeap(HBT); i++; } ClearHeap(HBT); cout< InitHeap(HBT); cout<<"请按层序输入一个堆,以-1结尾: "< i=0; while(scanf("%d",&HBT.heap[i]),HBT.heap[i++]! =-1); HBT.len=i-1; if(IsHeap(HBT,0)) cout<<"【√】是大根堆"< elsecout<<"【×】不是大根堆"< ClearHeap(HBT); } [Heap.h] typedefintElemType; typedefstruct{ ElemType*heap;//指向动态申请空间的基地址 intlen;//堆的长度,即实际存储结点个数 intMaxSize;//动态申请空间的长度 }Heap; //大根堆的基本操作如下: //①初始化堆 voidInitHeap(Heap&HBT) { HBT.MaxSize=10; HBT.heap=newElemType[HBT.MaxSize]; if(! HBT.heap){ cout<<"用于动态分配的内存空间用完,退出运行! "< exit (1); } HBT.len=0; } //②清除堆 voidClearHeap(Heap&HBT) { if(HBT.heap! =NULL){ delete[]HBT.heap; HBT.heap=NULL; HBT.len=0; HBT.MaxSize=0; } } //③检查一个堆是否为空 boolEmptyHeap(HeapHBT) { returnHBT.len==0; } //④向堆插入一个元素 voidInsertHeap(Heap&HBT,ElemTypeitem) { if(HBT.len==HBT.MaxSize){ intk=sizeof(ElemType); HBT.heap=(ElemType*)realloc(HBT.heap,2*HBT.MaxSize*k); if(HBT.heap==NULL){ cout<<"动态可分配的存储空间用完,退出运行! "< exit (1); } HBT.MaxSize=2*HBT.MaxSize; } inti,parent; i=HBT.len; parent=(i-1)/2; while(i! =0){ if(item>HBT.heap[parent]){ HBT.heap[i]=HBT.heap[parent]; i=parent; parent=(i-1)/2; } elsebreak; } HBT.heap[i]=item; HBT.len++; } //⑤从堆中删除一个元素 ElemTypeDeleteHeap(Heap&HBT) { if(HBT.len==0){ cerr<<"堆为空,退出运行! "< exit (1); } ElemTypetemp=HBT.heap[0]; ElemTypeadjust=HBT.heap[--HBT.len]; intparent,index; parent=0; index=1; while(index if(index if(adjust>=HBT.heap[index])break; HBT.heap[parent]=HBT.heap[index]; parent=index; index=index*2+1; } HBT.heap[parent]=adjust; returntemp; } //打印堆 voidPrintHeap(Heap&HBT) { inti; if(EmptyHeap(HBT)){ cout<<"堆为空"< return; } for(i=0;i cout< cout< } //选做: 判断一棵顺序结构存储的完全二叉树是否是大根堆。 boolIsHeap(HeapBT,inti) { //没有左右孩子,返回true if(i*2+1>=BT.len)returntrue; //有左右孩子 if(i*2+2 if(BT.heap[i*2+1]>BT.heap[i]||BT.heap[i*2+2]>BT.heap[i]) //当前结点比其中一个孩子小,返回false returnfalse; else //递归调用函数,返回左右孩子是否为大根堆的情况 returnIsHeap(BT,i*2+1)&&IsHeap(BT,i*2+2); } //只有左孩子 else{ //当前结点比左孩子小,返回false;否则返回true if(BT.heap[i*2+1]>BT.heap[i]) returnfalse; else returntrue; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构算法实验6 堆的基本操作附源代码 数据结构 算法 实验 基本 操作 源代码