Heap.h
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef int HPDateType;
typedef struct Heap
{
HPDateType* a;
int size;
int capacity;
}HP;
void HPInit(HP* php);
void HPDestroy(HP* php);
void Swap(HPDateType* p1, HPDateType* p2);
void AdjustUp(HPDateType* a, int child);
void HPPush(HP* php, HPDateType x);
void AdjustDown(HPDateType* a, int n, int parent);
void HPPop(HP* php);
HPDateType HPTop(HP* php);
int HPSize(HP* php);
bool HPEmpty(HP* php);
Heap.c
#include"Heap.h"
void HPInit(HP* php)
{
assert(php);
php->a = NULL;
php->size = php->capacity = 0;
}
void HPDestroy(HP* php)
{
assert(php);
free(php->a);
php->a = NULL;
php->size = php->capacity = 0;
free(php);
php = NULL;
}
void Swap(HPDateType* p1, HPDateType* p2)
{
HPDateType* tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void AdjustUp(HPDateType* a, int child)
{
int parent = (child - 1) / 2;
while (parent >= 0 && child != 0)
{
if (a[parent] > a[child])
{
Swap(&a[parent], &a[child]);
child = parent;
parent = (child - 1) / 2;
}
else
{
break;
}
}
}
void HPPush(HP* php, HPDateType x)
{
assert(php);
if (php->size == php->capacity)
{
int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;
HPDateType* tmp = (HPDateType*)realloc(php->a, sizeof(HPDateType) * newcapacity);
if (tmp == NULL)
{
perror("realloc fail:");
exit(1);
}
php->a = tmp;
php->capacity = newcapacity;
}
php->a[php->size++] = x;
AdjustUp(php->a, php->size - 1);
}
void AdjustDown(HPDateType* a, int n, int parent)
{
int child = parent * 2 + 1;
while (child < n)
{
if (child + 1 < n && a[child] > a[child + 1])
{
child++;
}
if (a[parent] > a[child])
{
Swap(&a[parent], &a[child]);
parent = child;
child = (parent + 1) * 2;
}
else
{
break;
}
}
}
void HPPop(HP* php)
{
assert(php);
assert(php->size > 0);
Swap(&php->a[0], &php->a[php->size - 1]);
php->size--;
AdjustDown(php->a, php->size, 0);
}
HPDateType HPTop(HP* php)
{
assert(php);
assert(php->size > 0);
return php->a[php->size - 1];
}
int HPSize(HP* php)
{
assert(php);
return php->size;
}
bool HPEmpty(HP* php)
{
assert(php);
return HPSize(php);
}