堆的实现
1、头文件
(堆.h)
#pragma once
/*
* 堆的基本操作--使用二叉堆画图描述,底层使用数组实现
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MIN_HEAP_SIZE 5
#define MIN_DATA -999
struct Heap* init(int maxElements);
void insert(int x, struct Heap* h);
int deleteMin(struct Heap* h);
void printHeap(struct Heap* h);
bool isEmpty(struct Heap* h);
bool isFull(struct Heap* h);
struct Heap
{
int capacity;
int size;
int* elements;
};
2、main函数
#include "堆.h"
int main()
{
struct Heap* h;
//初始化堆
h = init(20);
//插入元素
insert(13, h);
insert(4, h);
insert(33, h);
insert(2, h);
insert(29, h);
insert(11, h);
printHeap(h);
//删除最小值
deleteMin(h);
printHeap(h);
return 0;
}
3、函数的实现
3.1 init.c
#include "堆.h"
struct Heap* init(int maxElements)
{
if (maxElements < MIN_HEAP_SIZE) {
printf("Heap size is too small!\n");
return NULL;
}
struct Heap* heap = malloc(sizeof(struct Heap));
if (NULL == heap) {
printf("Out of space!\n");
return NULL;
}
heap->capacity = maxElements;
heap->size = 0;
heap->elements = malloc(sizeof(int) * (heap->capacity + 1));
if (NULL == heap->elements) {
printf("Out of space!\n");
return NULL;
}
heap->elements[0] = MIN_DATA;
return heap;
}
3.2 insert.c
#include "堆.h"
void insert(int x, struct Heap* h)
{
if (isFull(h)) {
printf("Heap is Full\n");
return;
}
h->size++;
int temp;
temp = h->size;
while (h->elements[temp / 2] > x) {
h->elements[temp] = h->elements[temp / 2];
temp = temp / 2;
}
h->elements[temp] = x;
}
3.3 deleteMin.c
#include "堆.h"
int deleteMin(struct Heap* h)
{
if (isEmpty(h)) {
printf("Heap is empty!\n");
return 0;
}
int last = h->elements[h->size];
h->size--;
int temp = 1;
int temp2;
while (temp * 2 < h->size) {
int minSon = h->elements[temp * 2];
temp2 = temp * 2;
if (temp2 != h->size && minSon > h->elements[temp * 2 + 1]) {
minSon = h->elements[temp * 2 + 1];
temp2 = temp2 + 1;
}
if (last < minSon) {
h->elements[temp] = last;
return 0;
}
h->elements[temp] = minSon;
temp = temp2;
}
h->elements[temp] = last;
return 0;
}
3.4 printHeap.c
void printHeap(struct Heap* h)
{
for (int i = 1; i <= h->size; i++) {
printf("%d ", h->elements[i]);
}
printf("\n");
}
3.5 isEmpty.c
#include "堆.h"
bool isEmpty(struct Heap* h)
{
return 0 == h->size;
}
3.6 isFull.c
#include "堆.h"
bool isFull(struct Heap* h)
{
return h->capacity == h->size;
}
4、写在最后
为方便大家的学习,我已经将原码上传到GitHub,欢迎大家下载,链接:link