堆的介绍与调整

本文主要是实现动态的创建一个堆,并且动态地向堆中插入元素,以及删除堆顶元素。

堆的创建与删除操作分为大根堆与小根堆两种实现。

头文件

#include

#include

#include

#include

#include

数据结构

typedef struct

{

uint32_t cursize;

uint32_t maxsize;

uint32_t *element;

}heap_t;

typedef enum

{

false,

true

}bool;

公共方法

/*申请堆,入参为堆中元素的个数*/

heap_t *heap_malloc(uint32_t size)

{

heap_t * heap = NULL;

uint32_t *data = NULL;

heap = (heap_t*)malloc(sizeof(heap_t));

if(NULL == heap)

{

return NULL;

}

memset(heap, 0x0, sizeof(heap_t));

data = (uint32_t*)malloc(sizeof(uint32_t)*size);

memset(data, 0x0, sizeof(uint32_t)*size);

if(NULL == data)

{

free(heap);

heap = NULL;

return NULL;

}

heap->cursize = 0;

heap->maxsize = size;

heap->element = data;

return heap;

}

/*释放堆所占用的资源*/

void heap_free(heap_t *heap)

{

free(heap->element);

heap->element = NULL;

free(heap);

heap = NULL;

}

/*判断堆是否已满*/

bool heap_full(heap_t *heap)

{

if(heap->cursize >= heap->maxsize)

return true;

else

return false;

}

/*判断堆是否为空*/

bool heap_empty(heap_t *heap)

{

if(heap->cursize == 0)

return true;

else

return false;

}

/*按顺序输出堆元素*/

void heap_out(heap_t *heap)

{

int i = 0;

for(i=0; i < heap->cursize; i++)

{

printf("%d\t",heap->element[i]);

}

printf("\n");

}

小根堆

/*向堆中插入一个元素*/

void heap_insert(heap_t *heap, uint32_t elem)

{

int i = 0;

if(heap_full(heap))

{

printf("heap is full, insert failed.\n");

return;

}

for(i = heap->cursize; heap->element[i/2] > elem; i /=2)

{

heap->element[i] = heap->element[i/2];

}

heap->element[i] = elem;

heap->cursize++;

return;

}

/*删除根节点*/

void heap_delete(heap_t *heap)

{

int i = 0, child = 0;

uint32_t minelem = 0, lastelem = 0;

if(heap_empty(heap))

{

printf("heap is empty, delete failed.\n");

return;

}

minelem = heap->element[0];

lastelem = heap->element[heap->cursize-1];

for(i = 0; i*2 < heap->cursize; i = child)

{

child = i*2 + 1;

if(child != heap->cursize && heap->element[child+1] < heap->element[child])

child++;

if(lastelem > heap->element[child])

heap->element[i] = heap->element[child];

else

break;

}

heap->element[i] = lastelem;

heap->cursize--;

return;

}

测试程序

int main(int argc, char *argv[])

{

int i = 0;

heap_t *heap = heap_malloc(20);

if(heap == NULL)

return 0;

for(i = 0; i < 10; i++)

{

heap_insert(heap, i);

}

heap_insert(heap, 5);

heap_out(heap);

heap_free(heap);

return 0;

}

测试结果

[[email protected] heap]# ./test

0 1 2 3 4 5 6 7 8 9 5

大根堆

原文:http://blog.csdn.net/pngynghay/article/details/22101359

大根堆的删除c语言,小根堆大根堆的动态创建与堆顶元素删除相关推荐

  1. javascript动态创建表格:新增、删除行和列

    利用js来动态创建表格有两种格式,appendChild()和insertRow.insertCell().两种方式其实差不多,但第一种有可能在IE上有问题,所以推荐大家使用第二种了,直接说吧. 1. ...

  2. javascript 动态创建表格:新增、删除行和单元格

    2019独角兽企业重金招聘Python工程师标准>>> 利用js来动态创建表格有两种格式,appendChild()和insertRow.insertCell().两种方式其实差不多 ...

  3. c语言二维数组的删除,C语言课设1、二维数组的应用2、删除指定字符3、楼盘管.doc...

    课程设计任务书 学院信息科学与工程学院专业电子信息科学与技术 姓名学号 1 题目 二维数组的应用 删除指定字符 楼盘管理程序的设计 2 内容及要求 1 编写函数 求一个二维数组周边元素的最大值和最小值 ...

  4. 大根堆的删除c语言,大根堆和小根堆的C语言实现

    大根堆小根堆的实现:以PPT形式呈现大根堆构建的理论过程 1.首先涉及到一个堆的调整,这也是算法的核心部分.假设树中,节点i的子树已经为两个大根堆.这两个子树再加上i节点的话,可能是大根堆也可能不是, ...

  5. 大根堆的删除c语言,二叉堆(一)之 C语言详解

    本文介绍二叉堆,二叉堆就是通常我们所说的数据结构"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现: ...

  6. 堆——神奇的优先队列 大根堆小根堆详解,附小根堆C++代码实现与STL相关

    文章目录 前置知识 堆操作 小根堆插入 代码实现 小根堆删除 代码实现 测试代码 STL实现--priority_queue 1.使用 2.创建 3.成员函数 前置知识 堆是一个完全二叉树(最后一层可 ...

  7. 算法笔记-堆相关、堆的定义、大小根堆、算法程序实现、堆的算法题、C#写法

    内容概述 1,堆结构就是用数组实现的完全二叉树结构 2,完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 3,完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 4,堆结构的heaplnsert与h ...

  8. c语言中栈堆,全程剖析C语言中堆和栈的区别

    C语言中堆和栈的区别 1.申请方式 (1)栈(satck):由系统自动分配.例如,声明在函数中一个局部变量int b;系统自动在栈中为b开辟空间. (2)堆(heap):需程序员自己申请(调用mall ...

  9. 数据结构排序算法 内部排序(冒泡、鸡尾酒、选择、简单插入、二分插入、快排、希尔、归并、堆排)C语言实现

    文章目录 排序 冒泡排序 鸡尾酒排序 选择排序: 简单插入排序: 二分插入排序 快速排序: 希尔排序: 归并排序: 堆排序: 排序 点击以下图片查看大图: 冒泡排序 1.比较相邻的元素,如果前一个比后 ...

最新文章

  1. jquery jcrop java_jcrop基本参数一览
  2. Flash Builder 4快速入门----学习笔记
  3. oracle执行计划走索引类型,SQL执行计划问题:where条件是主键(NUMBER类型字段)LIKE  :VAR,为什么执行计划不走索引?...
  4. ubuntu 配置dns访问外网
  5. 健康很重要 程序员应该坚持正确的坐姿工作
  6. Linux安全移除U盘,Windows 10用户可以快速移除U盘
  7. CMD各段定义与分配方法指引
  8. 如何使用PowerShell创建简单SQL Server数据库登录对话框
  9. 这是一篇测试博文的文章
  10. 网络干货,无论是运维还是开发都要知道的网络知识系列之(八)
  11. 《团队作业第三、第四周》五小福团队作业--Scrum 冲刺阶段--Day1--领航
  12. BlackBerry 9900刷机
  13. 新浪微博发布文章html,微博网页版如何发布头条文章
  14. 天津理工大学物联网通信技术实验1:数字基带信号(NRZ、NRZ-I、AMI、HDB3信道编码)
  15. ICMP增强型snort规则
  16. 柳絮飘,往事忆:前言
  17. python3.8如何正确安装使用ExcelLibrary
  18. python里使用正则表达式搜索单词
  19. 《2021年IT行业项目管理调查报告》发布
  20. 华为云免费试用_如何试用华为云服务器

热门文章

  1. 醍醐灌顶 | 我们谈论的Exactly once到底是什么?
  2. Demuxed:编解码器和压缩的未来
  3. configure脚本分析
  4. Java 函数式接口以及Lambda举例
  5. ubuntu 16.04 安装MXNet GPU版本
  6. 树的宽度 递归法和非递归法
  7. maven项目创建过慢解决
  8. P8实战(二):分布式锁前置技能 etcd 集群搭建
  9. C 语言结构体_点运算符( . )和箭头运算符( - )的区别
  10. 架构之:微服务和单体服务之争