手搓堆(C语言)

Heap.h

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include <string.h>
typedef int HPDataType;
typedef struct Heap
{HPDataType* a;int size;int capacity;
}Heap;//初始化
void HeapInit(Heap* php);
//堆的构建
void HeapCreate(Heap* php, HPDataType* a, int size);
//销毁
void HeapDestroy(Heap* php);
//向上调整
void AdjustUp(HPDataType* a, int child);
//插入
void HeapPush(Heap* php, HPDataType data);
//向下调整
void AdjustDown(HPDataType* a, int parent, int size);
//删除
void HeapPop(Heap* php);
//取堆顶数据
HPDataType HeapTop(Heap* php);
//堆的大小
int HeapSize(Heap* php);
//是否为空
bool HeapEmpty(Heap* php);
//打印函数
void Print(Heap* php);

Heap.c

#include "Heap.h"//初始化
void HeapInit(Heap* php)
{assert(php);php->a = NULL;php->size = 0;php->capacity = 0;
}//堆的构建
void HeapCreate(Heap* php, HPDataType* a, int size)
{assert(php);php->a = (HPDataType*)malloc(sizeof(HPDataType) * size);if (php->a == NULL){perror("HeapCreate");exit(-1);}php->size = size;php->capacity = size;//插入memcpy(php->a, a, sizeof(HPDataType) * size);//向下调整建堆int i;for (i = (size - 2) / 2; i >= 0; i--){AdjustDown(php->a, i, size);}
}
//销毁
void HeapDestroy(Heap* php)
{assert(php);free(php->a);php->a = NULL;php->size = 0;php->capacity = 0;
}void Swap(HPDataType* x, HPDataType* y)
{assert(x && y);HPDataType tmp = *x;*x = *y;*y = tmp;
}//向上调整
void AdjustUp(HPDataType* a, int child)
{assert(a);while (child > 0){int parent = (child - 1) / 2;//小堆if (a[child] < a[parent]){Swap(&a[child], &a[parent]);child = parent;}else{break;}}
}//插入
void HeapPush(Heap* php, HPDataType data)
{assert(php);//扩容if (php->size == php->capacity){int NewCapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = (HPDataType*)realloc(php->a, sizeof(HPDataType) * NewCapacity);if (tmp == NULL){perror("HeapPush");exit(-1);}php->a = tmp;php->capacity = NewCapacity;}//插入php->a[php->size++] = data;//建堆AdjustUp(php->a, php->size - 1);}//向下调整
void AdjustDown(HPDataType* a, int parent, int size)
{assert(a);int SChild = parent * 2 + 1;while (SChild < size){//小堆if (SChild + 1 < size && a[SChild + 1] < a[SChild]){++SChild;}if (a[SChild] < a[parent]){Swap(&a[SChild], &a[parent]);parent = SChild;SChild = parent * 2 + 1;}else{break;}}
}//删除堆顶数据
void HeapPop(Heap* php)
{assert(php);assert(php->size > 0);Swap(&php->a[0], &php->a[php->size - 1]);php->size--;//建堆AdjustDown(php->a, 0, php->size);}//取堆顶数据
HPDataType HeapTop(Heap* php)
{assert(php);assert(php->size > 0);return php->a[0];
}//堆的大小
int HeapSize(Heap* php)
{assert(php);return php->size;
}//是否为空
bool HeapEmpty(Heap* php)
{return php->size == 0;
}//打印函数
void Print(Heap* php)
{assert(php);int i;for (i = 0; i < php->size; ++i){printf("%d ", php->a[i]);}printf("\n");}

test.c

#include "Heap.h"void test1()
{Heap hp;//初始化HeapInit(&hp);Print(&hp);//插入数据HeapPush(&hp, 9);Print(&hp);HeapPush(&hp, 2);Print(&hp);HeapPush(&hp, 7);Print(&hp);HeapPush(&hp, 8);Print(&hp);HeapPush(&hp, 3);Print(&hp);HeapPush(&hp, 1);Print(&hp);HeapPush(&hp, 0);Print(&hp);HeapPush(&hp, 5);Print(&hp);//堆的大小printf("HeapSize = %d\n", HeapSize(&hp));//堆排序while (!HeapEmpty(&hp)){//打印堆顶数据printf("%d ", HeapTop(&hp));//删除堆顶数据HeapPop(&hp);}printf("\n");//销毁HeapDestroy(&hp);
}void test2()
{Heap hp;int arr[] = { 5,11,7,2,3,17 };int sz = sizeof(arr) / sizeof(arr[0]);//用数据初始化HeapCreate(&hp, arr, sz);Print(&hp);//插入数据HeapPush(&hp, 6);Print(&hp);HeapPush(&hp, 9);Print(&hp);//堆的大小printf("HeapSize = %d\n", HeapSize(&hp));//堆排序while (!HeapEmpty(&hp)){//打印堆顶数据printf("%d ", HeapTop(&hp));//删除堆顶数据HeapPop(&hp);}//销毁HeapDestroy(&hp);
}
int main()
{test1();//test2();return 0;
}

测试示例

普通初始化:

用数据初始化:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/6238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

node.js中的fs模块,读写语法讲解

本文分享node.js的入门知识&#xff0c;使用 fs 模块封装的方法读写文件内容 node中的fs 模块&#xff1a;封装了与本机文件系统进行交互的&#xff0c;方法和属性&#xff0c;使用语法如下&#xff1a; 1、加载 fs 模块&#xff0c;得到 fs 对象 const fs require(fs) 2、…

软件工程习题答案2024最新版

习题一答案 一、选择题 软件的主要特性是(A B C)。 A) **无形 **B) 高成本 C) **包括程序和文档 ** D) 可独立构成计算机系统 软件工程三要素是(B)。 A) 技术、方法和工具 B) 方法、工具和过程 C) 方法、对象和类 D) 过程、模型、方法 包含风险分析的软件工程模型是(A)…

Java注解处理器:自定义注解的自动化处理

引言 在Java编程中&#xff0c;注解&#xff08;Annotation&#xff09;是一种重要的元数据&#xff0c;它为代码提供了额外的信息。注解处理器&#xff08;Annotation Processor&#xff09;是Java编译过程中的一部分&#xff0c;它可以在编译时期读取注解信息并执行特定的处…

深度学习之基于Matlab BP神经网络烟叶成熟度分类

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 烟叶的成熟度是评估烟叶品质的重要指标之一&#xff0c;它直接影响着烟叶的口感、香气和理化特性。传…

python基础算法题0502

数字反转 无论是字符串反转还是数字反转&#xff0c;其实都一样。 需求 代码 class Solution:def reverse(self, x: int) -> int:if 0 < x < 2 ** 31 - 1:m str(x)[::-1]if int(m)<2**31-1:return int(m)else:return 0if 0 > x > -2 ** 31:y -xn str(y…

uniapp 监听APP切换前台、后台插件 Ba-Lifecycle

监听APP切换前台、后台 Ba-Lifecycle 简介&#xff08;下载地址&#xff09; Ba-Lifecycle 是一款uniapp监听APP切换前台、后台的插件&#xff0c;简单易用。 截图展示 也可关注博客&#xff0c;实时更新最新插件&#xff1a; uniapp 常用原生插件大全 使用方法 在 script…

华为机考入门python3--(19)牛客19- 简单错误记录

分类&#xff1a;字符串 知识点&#xff1a; 分割字符串 my_str.split(\\) 字符串只保留最后16位字符 my_str[-16:] 列表可以作为队列、栈 添加元素到第一个位置 my_list.insert(0, elem) 增加元素到最后一个位置 my_list.append(elem) 删除第一个 my_list.pop(0)…

SAP_SD模块-销售批次策略应用记录

一、销售批次查找策略的重要性 批次查找策略允许企业在销售过程中根据预定义的规则自动选择最适合的产品批次。这种策略的实施&#xff0c;对企业尤其是那些涉及到严格产品质量与安全标准的行业&#xff08;如食品、药品及化工产品&#xff09;具有以下几方面的重要意义&#x…

[方法] Unity 实现仿《原神》第三人称跟随相机 v1.0

参考网址&#xff1a;【Unity中文课堂】RPG战斗系统Plus 在Unity游戏引擎中&#xff0c;实现类似《原神》的第三人称跟随相机并非易事&#xff0c;但幸运的是&#xff0c;Unity为我们提供了强大的工具集&#xff0c;其中Cinemachine插件便是实现这一目标的重要工具。Cinemachi…

从键入网址到网页显示,期间发生了什么?

从键入网址到网页显示&#xff0c;期间发生了什么&#xff1f; 孤单小弟【HTTP】真实地址查询【DNS】指南帮手【协议栈】可靠传输【TCP】远程定位【IP】两点传输【MAC】出口【网卡】送别者【交换机】出境大门【路由器】互相扒皮【服务器与客户端】相关问答 不少小伙伴在面试过程…

常用外贸营销软件推荐

在外贸营销中&#xff0c;选择合适的软件工具可以极大地提高工作效率和营销效果。以下是一些常用的外贸营销软件推荐&#xff1a; 易谷歌地图数据采集大师&#xff1a;专为做外贸的朋友开发的一款基于谷歌地图数据采集的软件&#xff0c;可以采集任意国家、任意地区的公司地址、…

《21天学通C++》(第十五章)标准模板库简介

本章简单介绍STL容器、迭代器和算法的基本概念&#xff0c;之后几章会分别详述 1.STL容器 STL容器是STL中用于存储集合数据的组件&#xff0c;它们可以被看作是模板类&#xff0c;允许开发者定义特定类型的容器发&#xff0c;这里按照C11标准分为四类&#xff1a;顺序容器、关…

Qt5 框架学习及应用 — 对象树

Qt 对象树 对象树概念Qt为什么使用对象树 &#xff1f;将对象挂到对象树上 对象树概念 对象树&#xff1a;对于树的概念&#xff0c;相信许多学过数据结构的同学应该都不会陌生。在学习数据结构的时候我们所接触的什么二叉树、多叉树、哈夫曼树、AVL树、再到红黑树、B/B树………

ubuntu-meta-22.04桌面版+ros2-humble 镜像

ubuntu-meta-22.04桌面版ros2-humble 镜像 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1PSBe4EqWch44OQUlkCCEig?pwdknty 提取码&#xff1a;knty 镜像文件较大&#xff0c;分成了两个压缩包&#xff0c;下载后直接解压ubuntu22.04-desk-meta-ros2-arm (…

vue处理查询框清除后无法查询问题,举例为日期选择

例如 在对应的查询方法添加 //我这里获取的是date&#xff0c;如果是其他参数改为其他的即可 if (query.date && query.date.length > 2) {conditions.noedate query.date[0] || conditions.noedate;//获取开始时间conditions.twodate query.date[1] || conditi…

数据库漫谈-发展简史

数据管理最早都是开发者自行定义的&#xff0c;应用和数据管理是一体的&#xff0c;没有独立的数据管理系统。1961年为了支持阿波罗计划的执行&#xff0c;IBM开发了ICS数据库&#xff0c;这是个层次数据库&#xff0c;是最早的大型数据库。另一个巨头GE公司看到ICS的问题&…

实验14 MVC

二、实验项目内容&#xff08;实验题目&#xff09; 编写代码&#xff0c;掌握MVC的用法。【参考课本 例1 】 三、源代码以及执行结果截图&#xff1a; example7_1.jsp&#xff1a; <% page contentType"text/html" %> <% page pageEncoding "ut…

PHP医院安全(不良)事件报告系统源码 vue2+element支持11大类不良事件上报、审核处理、分析改进

PHP医院安全&#xff08;不良&#xff09;事件报告系统源码 vue2element支持11大类不良事件上报、审核处理、分析改进 医院安全&#xff08;不良&#xff09;事件管理系统采用无责的、自愿的填报不良事件方式&#xff0c;有效地减轻医护人员的思想压力&#xff0c;实现以事件为…

某招聘网站搜索结果接口之acw_sc__v2逆向

上文链接 某招聘网站搜索结果接口逆向之webpack扣取 分析参数 acw_sc__v2 663449dacb63fbe529520fb21063cf354dbce1cf 既然在Cookie中那么需要借助Hook脚本 (function() {//严谨模式 检查所有错误use strict;var cookieTemp "";Object.defineProperty(document,…

基于SpringBoot的考务管理系统 - 源码免费(私信领取)

1. 研究目的 本项目旨在设计并实现一个基于Spring Boot的考务管理系统&#xff0c;以提高考试管理的效率&#xff0c;简化考试流程&#xff0c;确保考试的顺利进行。 2. 研究要求 a. 需求分析 通过深入了解考务管理流程和需求&#xff0c;分析用户对考试管理系统的需求&…