代码如下:

typedef struct HNode *Heap; /* 堆的类型定义 */
struct HNode {ElementType *Data; /* 存储元素的数组 */int Size;          /* 堆中当前元素个数 */int Capacity;      /* 堆的最大容量 */
};
typedef Heap MaxHeap; /* 最大堆 */
typedef Heap MinHeap; /* 最小堆 */#define MAXDATA 1000  /* 该值应根据具体情况定义为大于堆中所有可能元素的值 */MaxHeap CreateHeap( int MaxSize )
{ /* 创建容量为MaxSize的空的最大堆 */MaxHeap H = (MaxHeap)malloc(sizeof(struct HNode));H->Data = (ElementType *)malloc((MaxSize+1)*sizeof(ElementType));H->Size = 0;H->Capacity = MaxSize;H->Data[0] = MAXDATA; /* 定义"哨兵"为大于堆中所有可能元素的值*/return H;
}bool IsFull( MaxHeap H )
{return (H->Size == H->Capacity);
}bool Insert( MaxHeap H, ElementType X )
{ /* 将元素X插入最大堆H,其中H->Data[0]已经定义为哨兵 */int i;if ( IsFull(H) ) { printf("最大堆已满");return false;}i = ++H->Size; /* i指向插入后堆中的最后一个元素的位置 */for ( ; H->Data[i/2] < X; i/=2 )H->Data[i] = H->Data[i/2]; /* 上滤X */H->Data[i] = X; /* 将X插入 */return true;
}#define ERROR -1 /* 错误标识应根据具体情况定义为堆中不可能出现的元素值 */bool IsEmpty( MaxHeap H )
{return (H->Size == 0);
}ElementType DeleteMax( MaxHeap H )
{ /* 从最大堆H中取出键值为最大的元素,并删除一个结点 */int Parent, Child;ElementType MaxItem, X;if ( IsEmpty(H) ) {printf("最大堆已为空");return ERROR;}MaxItem = H->Data[1]; /* 取出根结点存放的最大值 *//* 用最大堆中最后一个元素从根结点开始向上过滤下层结点 */X = H->Data[H->Size--]; /* 注意当前堆的规模要减小 */for( Parent=1; Parent*2<=H->Size; Parent=Child ) {Child = Parent * 2;if( (Child!=H->Size) && (H->Data[Child]<H->Data[Child+1]) )Child++;  /* Child指向左右子结点的较大者 */if( X >= H->Data[Child] ) break; /* 找到了合适位置 */else  /* 下滤X */H->Data[Parent] = H->Data[Child];}H->Data[Parent] = X;return MaxItem;
} /*----------- 建造最大堆 -----------*/
void PercDown( MaxHeap H, int p )
{ /* 下滤:将H中以H->Data[p]为根的子堆调整为最大堆 */int Parent, Child;ElementType X;X = H->Data[p]; /* 取出根结点存放的值 */for( Parent=p; Parent*2<=H->Size; Parent=Child ) {Child = Parent * 2;if( (Child!=H->Size) && (H->Data[Child]<H->Data[Child+1]) )Child++;  /* Child指向左右子结点的较大者 */if( X >= H->Data[Child] ) break; /* 找到了合适位置 */else  /* 下滤X */H->Data[Parent] = H->Data[Child];}H->Data[Parent] = X;
}void BuildHeap( MaxHeap H )
{ /* 调整H->Data[]中的元素,使满足最大堆的有序性  *//* 这里假设所有H->Size个元素已经存在H->Data[]中 */int i;/* 从最后一个结点的父节点开始,到根结点1 */for( i = H->Size/2; i>0; i-- )PercDown( H, i );
}

堆的定义与操作(C语言)相关推荐

  1. 数据库实验一:数据定义与操作语言实验

    实验一 数据定义与操作语言实验 实验 1.1 数据库定义实验 1.实验目的 理解和掌握数据库DDL语言,能够熟练地使用SQL DDL语句创建.修改和删除数据库.模式和基本表. 2.实验内容和要求 理解 ...

  2. 数据库1:数据库、DDL数据库定义语言、DML操作数据库语言、DQL条件查询语句

    数据库 SQL(Structure Query Language)语言是数据库的核心语言. SQL语言共分为四大类:数据查询语言DQL,数据操做语言DML,数据定义语言DDL,数据控制语言DCL. 1 ...

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

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

  4. 单片机c语言实训例子基于mega16,基于AVR单片机的mega16内部EEPROM操作C语言程序设计...

    原标题:基于AVR单片机的mega16内部EEPROM操作C语言程序设计 #include #include #include #define uchar unsigned char #define ...

  5. 数据库实验二 SQL数据定义和操作

    SQL数据定义和操作 欢迎阅读本教程 一.数据定义 二.数据更新 三.数据查询 欢迎阅读本教程 掌握关系数据库语言 SQL 的使用. 使所有的 SQL 作业都能上机通过. 实现内容如下: 数据定义:表 ...

  6. 《C++Primer》第九章-顺序容器-学习笔记(1)-顺序容器定义与操作

    <C++Primer>第九章-顺序容器-学习笔记(1) 文章目录 <C++Primer>第九章-顺序容器-学习笔记(1) 摘要 顺序容器的定义 容器元素的初始化 将一个容器初始 ...

  7. 大神带你理解堆的定义及用法

    定义 优先队列:一种特殊的队列,队列中元素出栈的顺序是按照元素的优先权大小,而不是元素入队的先后顺序. heap 堆的特性: 必须是完全二叉树 用数组实现 任一结点的值是其子树所有结点的最大值或最小值 ...

  8. C++字符串定义与操作

    本篇介绍字符串的定义和常见操作:复制.连接.长度.大小.首字母定位等. /* * Author:W: * 字符串定义与操作 * 1.C语言风格的字符串 * 2.C++语言风格的字符串 *///引入头文 ...

  9. Python|并发编程|爬虫|单线程|多线程|异步I/O|360图片|Selenium及JavaScript|Scrapy框架|BOM 和 DOM 操作简介|语言基础50课:学习(12)

    文章目录 系列目录 原项目地址 第37课:并发编程在爬虫中的应用 单线程版本 多线程版本 异步I/O版本 总结 第38课:抓取网页动态内容 Selenium 介绍 使用Selenium 加载页面 查找 ...

最新文章

  1. 从生命周期去看互联网金融产品的风险管理框架
  2. PHP发起POST DELETE GET POST 请求
  3. linux常见面试题
  4. 【算法基础】数据结构导论第六章-查找.pptx
  5. 通过netstat+rmsock查找AIX端口对应进程
  6. linux arm9开发环境,ARM9开发板Qt环境的搭建
  7. 编译原理用C语言编写递归下降分析程序,编译原理递归下降分析器(C语言).pdf
  8. 各大互联网大厂JAVA实习招聘岗位要求
  9. Reentrantlock和背后金主AQS —————— 开开开山怪
  10. 企业如何管理终端软件安装
  11. Kubernetes kubeadm 证书到期,更新证书
  12. php a链接跳转下载,PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而不是通过浏览器直接打开下载的文件...
  13. 第四讲:1.定时、延时任务控制小台灯打开/关闭
  14. 自媒体人如何搜集写作素材?建立自己的素材库
  15. c++中CreateEvent函数解析(2)
  16. SAAS服务商如何低成本采购云服务器?企业海量采购云服务器省钱指南
  17. Android高级工程师每日面试题精选,offer拿到手软
  18. PuTTY 中文教程A
  19. 华硕主板B85-PRO GAMER关机后鼠标、键盘仍亮着问题的解决办法
  20. 大乐透号码生成器python_python随机生成 双色球 大乐透

热门文章

  1. [转]RxHttp 一条链发送请求,新一代Http请求神器(一)
  2. 【遥感数字图像处理】基础知识:第二章 遥感知识回顾、遥感数字图像处理基础知识
  3. 个人空间风格模版php,ThinkPHP 模板布局
  4. Pytorch快速入门笔记
  5. 王道408数据结构——第四章 串(KMP算法)
  6. 世界上最美的40个小镇,每一个都犹如仙境!
  7. 我看你还能坚持多久?!
  8. 甜蜜助攻!情侣之间,到底能有多甜甜甜甜甜甜甜甜
  9. 超级智能玩具《小小机器人》|全新50种玩法,创造力之源
  10. 马云害怕的事还是发生了