//最大堆的创建
typedef struct HeapStruct *MaxHeap;
struct HeapStruct{
ElenmentType Elements; //存放堆元素的数组
int Size; //堆当前大小
int Capacity; //堆得最大容量
}
MaxHeap Create(int MaxSize)
{
MaxHeap H = malloc(sizeof(struct HeapStruct));
H->Elements = malloc((MaxSize + 1) * sizeof(ElementType)); //创建数组的大小,堆从1开始存放数据所以示MaxSize+1
H->Size = 0;
H->Capacoty = MaxSize;
H->Elements[0] = MaxData; //设置哨兵
return H;
}
//插入数据
void Insert(HeapStruct H, ElementType item)
{
int i;
if(IsFull(H))
{
printf("堆已满");
return;
}
i = ++H->Size;
for(; H->Elements[i / 2] < item; i / 2)
{
H->Elements[i] = H->Elements[i / 2]; //向下过滤结点
}
H->Elements[i] = item;
}
//删除最大结点
ElmentType DeleteMax(MaxHeap H)
{
int Parent, Child,
ElementType MaxItem, temp;
if(IsEmpty(H))
{
printf ("堆为空");
return;
}
MaxItem = H->Elements[1];
temp = H->Elements[H->Size]; //把最后一个数据放到根结点
H->Size--; //大小-1
for(Parent = 1; Parent <= H->Size; Parent = Child) //从根结点向下遍历,查找合适的位置插入数据
{
Child = Parent * 2; //左子树根结点
if((Child != H->Size) && H->Elements[Child] < H->Elements[Child + 1])
Child++; //选择左右子树根结点中较大的
if(temp >= H->Elements[Child])
break; //找到合适位置,退出
else
H->Elements[Parent] = H->Elements[Child]; //继续向下遍历
}
H->Elements[Child] = temp;
return MaxItem;
}