本实验取材于浙江大学《数据结构》mooc。
本次实验在mooc课后源码里有,但是要将其联系成线,需要课下花时间,下面给出源码分析。
听课的速度不代表你吃透知识的速度,相信大家一直坚信功夫在课外!
#include<stdio.h>
#include<stdlib.h>
#define MaxData 1001
typedef struct HeapStruct *MaxHeap;
typedef int ElementType;
typedef int Boolean;
struct HeapStruct{
ElementType *Elements; //存储堆元素的数组
int Size; //堆的当前元素个数
int Capacity;//堆的最大容量
};
MaxHeap Create(int MaxSize);//创建一个空的最大堆
Boolean IsFull(MaxHeap H);//判断最大堆H是否已满.
void Insert(MaxHeap H,ElementType item);//将元素item插入最大堆H
Boolean IsEmpty(MaxHeap H);//判断最大堆是否为空
ElementType DeleteMax(MaxHeap H);//返回H中最大元素(高优先级)
MaxHeap Create(int MaxSize)
{
//创建容量为MaxSize的空的最大堆
MaxHeap H = (MaxHeap )malloc(sizeof(struct HeapStruct));
H->Elements = (int *)malloc((MaxSize + 1)*sizeof(ElementType));
H->Size = 0;
H->Capacity = MaxSize;
H->Elements[0]=MaxData;
///定义“哨兵”为大于堆中所有可能元素的值,便于以后更快操作
return H;
}
Boolean IsFull(MaxHeap H)
{
return (H->Size==H->Capacity);
}
Boolean IsEmpty(MaxHeap H)
{
return (H->Size == 0 );
}
//将新增结点插入到从其父结点到根结点的有序序列中
void Insert(MaxHeap H,ElementType item)
{//将元素item插入最大堆H,其中H->ElementType[0]已经定义为哨兵
int i;
if(IsFull(H)){
printf("Heap is full!\n");
return ;
}
i = ++H->Size;//i指向插入后堆中的最后一个元素的位置
for(;H->Elements[i/2]<item;i/=2){
H->Elements[i]=H->Elements[i/2];//向下过滤结点
}
H->Elements[i]=item;//进行插入
}
ElementType DeleteMax(MaxHeap H){
//从最大堆H中取出键值为最大的元素,并删除一个结点*/
int Parent,Child;
ElementType MaxItem,temp;
if(IsFull(H)){
printf("Heap is full!\n");
return -1;
}
MaxItem = H->Elements[1];//取出根节点最大值
temp = H->Elements[H->Size--];
//用最大堆中最后一个元素从根结点开始向上过滤下层结点
for(Parent=1;Parent*2<=H->Size;Parent=Child){
Child = Parent * 2;
if((Child != H->Size) && (H->Elements[Child] < H->Elements[Child+1]))
Child++;//child指向左右子节点的较大值
if(temp>=H->Elements[Child]) break;
else //移动temp元素到下一层
H->Elements[Parent] = H->Elements[Child];
}
H->Elements[Parent] = temp;
return MaxItem;
}
int main()
{
MaxHeap H = Create(10);
Insert(H,1);
Insert(H,5);
Insert(H,7);
Insert(H,6);
int m = DeleteMax(H);
printf("Delete Elements:%d",m);
return 0;
}