大根堆的删除c语言,小根堆大根堆的动态创建与堆顶元素删除
堆的介绍与调整
本文主要是实现动态的创建一个堆,并且动态地向堆中插入元素,以及删除堆顶元素。
堆的创建与删除操作分为大根堆与小根堆两种实现。
头文件
#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语言,小根堆大根堆的动态创建与堆顶元素删除相关推荐
- javascript动态创建表格:新增、删除行和列
利用js来动态创建表格有两种格式,appendChild()和insertRow.insertCell().两种方式其实差不多,但第一种有可能在IE上有问题,所以推荐大家使用第二种了,直接说吧. 1. ...
- javascript 动态创建表格:新增、删除行和单元格
2019独角兽企业重金招聘Python工程师标准>>> 利用js来动态创建表格有两种格式,appendChild()和insertRow.insertCell().两种方式其实差不多 ...
- c语言二维数组的删除,C语言课设1、二维数组的应用2、删除指定字符3、楼盘管.doc...
课程设计任务书 学院信息科学与工程学院专业电子信息科学与技术 姓名学号 1 题目 二维数组的应用 删除指定字符 楼盘管理程序的设计 2 内容及要求 1 编写函数 求一个二维数组周边元素的最大值和最小值 ...
- 大根堆的删除c语言,大根堆和小根堆的C语言实现
大根堆小根堆的实现:以PPT形式呈现大根堆构建的理论过程 1.首先涉及到一个堆的调整,这也是算法的核心部分.假设树中,节点i的子树已经为两个大根堆.这两个子树再加上i节点的话,可能是大根堆也可能不是, ...
- 大根堆的删除c语言,二叉堆(一)之 C语言详解
本文介绍二叉堆,二叉堆就是通常我们所说的数据结构"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现: ...
- 堆——神奇的优先队列 大根堆小根堆详解,附小根堆C++代码实现与STL相关
文章目录 前置知识 堆操作 小根堆插入 代码实现 小根堆删除 代码实现 测试代码 STL实现--priority_queue 1.使用 2.创建 3.成员函数 前置知识 堆是一个完全二叉树(最后一层可 ...
- 算法笔记-堆相关、堆的定义、大小根堆、算法程序实现、堆的算法题、C#写法
内容概述 1,堆结构就是用数组实现的完全二叉树结构 2,完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 3,完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 4,堆结构的heaplnsert与h ...
- c语言中栈堆,全程剖析C语言中堆和栈的区别
C语言中堆和栈的区别 1.申请方式 (1)栈(satck):由系统自动分配.例如,声明在函数中一个局部变量int b;系统自动在栈中为b开辟空间. (2)堆(heap):需程序员自己申请(调用mall ...
- 数据结构排序算法 内部排序(冒泡、鸡尾酒、选择、简单插入、二分插入、快排、希尔、归并、堆排)C语言实现
文章目录 排序 冒泡排序 鸡尾酒排序 选择排序: 简单插入排序: 二分插入排序 快速排序: 希尔排序: 归并排序: 堆排序: 排序 点击以下图片查看大图: 冒泡排序 1.比较相邻的元素,如果前一个比后 ...
最新文章
- jquery jcrop java_jcrop基本参数一览
- Flash Builder 4快速入门----学习笔记
- oracle执行计划走索引类型,SQL执行计划问题:where条件是主键(NUMBER类型字段)LIKE :VAR,为什么执行计划不走索引?...
- ubuntu 配置dns访问外网
- 健康很重要 程序员应该坚持正确的坐姿工作
- Linux安全移除U盘,Windows 10用户可以快速移除U盘
- CMD各段定义与分配方法指引
- 如何使用PowerShell创建简单SQL Server数据库登录对话框
- 这是一篇测试博文的文章
- 网络干货,无论是运维还是开发都要知道的网络知识系列之(八)
- 《团队作业第三、第四周》五小福团队作业--Scrum 冲刺阶段--Day1--领航
- BlackBerry 9900刷机
- 新浪微博发布文章html,微博网页版如何发布头条文章
- 天津理工大学物联网通信技术实验1:数字基带信号(NRZ、NRZ-I、AMI、HDB3信道编码)
- ICMP增强型snort规则
- 柳絮飘,往事忆:前言
- python3.8如何正确安装使用ExcelLibrary
- python里使用正则表达式搜索单词
- 《2021年IT行业项目管理调查报告》发布
- 华为云免费试用_如何试用华为云服务器