template<typename ElementType>
struct HeapStruct{
int Capacity;
int Size;
ElementType *Elements;
}
typedef struct HeapStruct* PriorityQueue;
PriorityQueue Initialize(int MaxElements ){
PriorityQueue H;
H=malloc(sizeof(struct HeapStruct));
if(H==NULL)
FatalError("out of space!");
H->Elements=malloc((MaxElements+1)*sizeof(ElementType));
if(H->Elements==NULL)
FatalError("out of space!");
H->Capacity=MaxElements;
H->Size=0;
H->Elements[0]=MinData;
return H;
}
void Insert(ElementType x,PriorityQueue H){
if(IsFull(H))
{
Error("priority queue is full!");
return;
}
int i;
for(i=++H->Size;H->Elements[i/2]>x;i/=2)
{
H->Elements[i]=H->Elements[i/2];
}
H->Elements[i]=x;
}
ElementType DeleteMin(PriorityQueue H){
if(IsEmpty(H))
{
error("the priority is empty!");
return H->Elements[0];
}
ElementType MinElement,LastElement;
MinElement=H->Elements[1];
LastElement=H->Elements[H->Size--];
int i,child;
for(i=1;i<H->Size;i*=2;)
{
child=i*2;
if(child!=H->Size && H->Elements[child+1] < H->Elements[child] )
{
child++;
}
if(LastElement > H->Elements[child])
H->Elements[i]=H->Elements[child];
else
break;
}
H->Elements[i]=LastElement;
return MinElement;
}