#include <stdio.h>
#include <malloc.h>
#define MaxData 1000
typedef struct HeapStruct *MaxHeap;
struct HeapStruct{
int *Elements;
int Size;
int Capacity;
};
MaxHeap Create(int MaxSize);
void Insert(MaxHeap H,int item);
int DeleteMax(MaxHeap H);
int IsEmpty(MaxHeap H);
int IsFull(MaxHeap H);
int IsFull(MaxHeap H){
if(H->Size == H->Capacity){
return 1;
}else{
return 0;
}
}
int IsEmpty(MaxHeap H){
if(H->Size == 0){
return 1;
}else{
return 0;
}
}
int DeleteMax(MaxHeap H){
int MaxItem,temp,parent,child;
if(IsEmpty(H)){
printf("堆为空");
return 0;
}
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++;
}
if( temp >= H->Elements[child]){
break;
}
else{
H->Elements[parent] = H->Elements[child];
}
}
H->Elements[parent] = temp;
return MaxItem;
}
void Insert(MaxHeap H,int item){
int i;
if(IsFull(H)){
printf("最大堆已满");
return;
}
for(i = ++H->Size;H->Elements[i/2] < item;i/=2){
H->Elements[i] = H->Elements[i/2];
}
H->Elements[i] = item;
}
MaxHeap Create(int MaxSize){
MaxHeap H = malloc(sizeof(struct HeapStruct));
H->Elements = malloc( (MaxSize + 1) * sizeof(struct HeapStruct));
H->Size = 0;
H->Capacity = MaxSize;
H->Elements[0] = MaxData;
return H;
}
int main () {
int MaxSize,x,i,result;
MaxHeap heap;
scanf("%d",&MaxSize);
heap = Create(MaxSize);
for(i = 0;i < MaxSize;i++){
printf("输入第%d个数据:\n",i);
scanf("%d",&x);
Insert(heap,x);
}
printf("最大堆为:\n");
for(i = 1;i <= MaxSize;i++){
printf("%d\n",heap->Elements[i]);
}
result = DeleteMax(heap);
printf("删除堆顶的元素为:%d\n",result);
printf("\n");
printf("删除堆顶元素之后的堆为:\n");
for(i = 1;i < MaxSize;i++){
printf("%d\n",heap->Elements[i]);
}
}