#ifndef _BinHeap_H
struct Heapstruct;
typedef struct Heapstruct *PriorityQueue;
PriorityQueue Initialize(int MaxElements);
void Destroy(PriorityQueue h);
void MakeEmpty(PriorityQueue h);
void Insert(int x,PriorityQueue h);
int DeleteMin(PriorityQueue h);
int FindMin(PriorityQueue h);
int IsEmpty(PriorityQueue h);
int IsFull(PriorityQueue h);
void DecreaseKey(int position,int change,struct Binaryheap h);
void IncreaseKey(int position,int change,struct Binaryheap h);
#endif
#define MinData -1
struct Heapstruct{
int capacity;
int size;
int *a;
};
PriorityQueue Initialize(int MaxElements){
PriorityQueue h;
h = (PriorityQueue)malloc(sizeof(struct Heapstruct));
if(h == NULL){
printf("Out of Space\n");
return NULL;
}
h->a = (int *)malloc(sizeof(int)*MaxElements);
if(h->a == NULL){
printf("Out of Space\n");
return NULL;
}
h->capacity = MaxElements;
h->size = 0;
h->a[0] = MinData;
return h;
}
int IsEmpty(PriorityQueue h){
return h->size == 0;
}
int IsFULL(PriorityQueue h){
return h->size == h->capacity-1;
}
void Insert(int x,PriorityQueue h){
int i;
if(IsFULL(h)){
printf("Priority queue is full\n");
return ;
}
for(i = ++h->size;h->a[i/2]>x;i = i/2)
h->a[i] = h->a[i/2];
h->a[i] = x;
}
int DeleteMin(PriorityQueue h){
int min,last,child,i;
if(IsEmpty(h)){
printf("Priority queue is empty\n");
return -1;
}
min = h->a[1];
last = h->a[h->size--];
for(i = 1;2*i<=h->size;i = child){
child = 2*i;
if(child!=h->size&&h->a[child]>h->a[child+1])
child++;
if(h->a[child]<h->last)
h[i] = h->a[child];
else break;
}
h[i] = last;
return min;
}
void MakeEmpty(PriorityQueue h){
h->size = 0;
}
int FindMin(PriorityQueue h){
if(IsEmpty(h)){
printf("Priority queue is empty\n");
return -1;
}
return h->a[1];
}
void Destroy(PriorityQueue h){
free(h->a);
free(h);
}
<pre name="code" class="cpp">
void DecreaseKey(int position,int change,struct Binaryheap h){
int child,x;
if(h->size<position){
printf("The position is empty\n");
return;
}
h->a[position] += change;
x = h->a[position];
for(i=position;2*i<=h->size;i = child){
child = 2*i;
if(child!=h->size&&h->a[child]>h->a[child + 1])
child++;
if(h->a[child]<x)
h->a[i] = h->a[child];
else break;
}
h->a[i] = x;
}
void IncreaseKey(int position,int change,struct Binaryheap h){
if(h->size<position){
printf("The position is empty\n");
return;
}
x = h->a[position] - change;
for(i = position;h->a[i/2]>x;i = i/2;)
h->a[i] = h->a[i/2];
h->a[i] = x;
}