1.最小堆的数据结构
2.最小堆的创建算法
3.最小堆的插入算法
4.最小堆的删除算法
#include<stdio.h>
#include<stdlib.h>
typedef struct HNode * Heap;
struct HNode{
int * Data;
int Size;
int Capacity;
};
typedef Heap MinHeap;
typedef Heap MinHeap;
//最小堆的创建
#define MINDATA -1
MinHeap CreateHeap(int MaxSize){
MinHeap H = (MinHeap)malloc(sizeof(struct HNode));
H->Data = (int *)malloc ((MaxSize+1)*sizeof(int));
H->Size=0;
H->Capacity=MaxSize;
H->Data[0]=MINDATA;
return H;
}
//最小堆的插入
bool IsFull(MinHeap H){
return (H->Size==H->Capacity);
}
bool Insert(MinHeap H,int X){
int i;
if(IsFull(H)){
printf("最小堆已满\n");
return false;
}
i=++H->Size;
for(;H->Data[i/2]>X;i/=2){
H->Data[i]=H->Data[i/2];
}
H->Data[i]=X;
return true;
}
//最小堆的删除
#define ERROR -1
bool IsEmpty(MinHeap H){
return (H->Size==0);
}
int DeleteMin(MinHeap H){
int Parent,Child;
int MaxItem,X;
if(IsEmpty(H)){
printf("最大堆为空\n");
return false;
}
MaxItem=H->Data[1];
X=H->Data[H->Size--];
for(Parent=1;Parent*2<=H->Size;Parent=Child){
Child=Parent*2;
if((Child!=H->Size)&&(H->Data[Child]>H->Data[Child]+1))
Child++;
if(X<=H->Data[Child]) break;
else{
H->Data[Parent]=H->Data[Child];
}
}
H->Data[Parent]=X;
return MaxItem;
}
int main(){
MinHeap mp = CreateHeap(10);
int i,n,z;
printf("您要插入几个数:");
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&z);
Insert(mp,z);
}
printf("最小堆遍历:\n");
for(i=1;i<=mp->Size;i++)
printf("%d ",mp->Data[i]);
printf("\n");
printf("最小 堆删除后的遍历: \n");
DeleteMin(mp);
for(i=1;i<=mp->Size;i++)
printf("%d ",mp->Data[i]);
return 0;
}
运行结果: