1. 熟悉堆的概念以及特性
堆的概念:堆可以看做是一颗树的数组对象---完全二叉树
完全二叉树:在按层序遍历时遇到的第一个NULL指针就作为结尾的二叉树
堆的特性:1.根结点最大的值称之为大堆,根结点最小的堆称小堆;
2.堆是非线性结构,相当于一维数组,有两个直接后继;
3.从根结点到任意结点路径都是有序的;
注意:堆和堆内存是两个完全不同的概念,堆内存是存储块状,大小不一的空
闲链表,而堆数据结构则是树结构,并且是完全二叉树 [详情见下]
2.数据结构中堆与内存堆区的区别
- 内存中堆是存储数据的内存空间,它是确切存在的一个物理结构,数据结构中的堆是组织或管理数据的一种工具,两者本质没联系
- 内存中的堆是不连续的内存区域,在操作系统中一般由程序员分配和释放,若程序员不释放,程序结束时由OS回收,分配方式是一个专门存储空闲地址的链表;数据结构中的堆是———对数据项按序排列的特殊数据结构;
代码
1.包含头文件和结构体
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
typedef int DataType;
typedef struct Heap
{
DataType* array;
int capacity;
int size;
} Heap;
2.空间不够时----扩容
//扩容
void checkcapacity(Heap* hp)
{
if (hp->capacity > hp->size){
return;}
int newcapacity = hp->capacity * 2;
DataType* newarray =
(int*)malloc(sizeof(DataType)*newcapacity);
for (int i = 0; i < hp->size; ++i)
{
newarray[i] = hp->array[i];
}
free(hp->array);
hp->array = newarray;
hp->capacity = newcapacity;
}
3.初始化堆的同时创建堆
//堆的初始化
void InitHeap(Heap* hp, DataType* a, int len)
{
assert(hp && a);
hp->array = (DataType*)malloc(sizeof(DataType)*len);
assert(hp->array);
hp