手搓堆(C语言)

news/2024/9/20 7:01:17/ 标签: 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.ppmy.cn/news/1451962.html

相关文章

深入理解 LinkedList 及底层源码分析

LinkedList 是基于链表结构的一种 List&#xff0c;在分析 LinkedList 源码前我们先对对链表结构做一个简单的了解。 一、链表的概念 链表是由一系列非连续的节点组成的存储结构&#xff0c;简单分下类的话&#xff0c;链表又分为_单向链表和双向链表&#xff0c;而单向 / 双…

nginx--第三方模块安装上传下载服务

第三方模块安装 准备 cd /usr/local/src/ yum install git -y git clone https://github.com/openresty/echo-nginx-module.git cd nginx-1.24.0 yum -y install perl-devel perl-ExtUtils-Embed zlib-devel gcc-c libtool openssl openssl-devel 编译安装 ./configure \--p…

SQL注入漏洞扫描---sqlmap

what SQLMap是一款先进的自动执行SQL注入的审计工具。当给定一个URL时&#xff0c;SQLMap会执行以下操作&#xff1a; 判断可注入的参数。判断可以用哪种SQL注入技术来注入。识别出目标使用哪种数据库。根据用户的选择&#xff0c;读取哪些数据库中的数据。 更详细语法请参考…

C语言:指针详解(3)

目录 一、字符指针 二、数组指针 1.数组指针的定义 2.数组指针的初始化 3. 二维数组传参的本质 三、函数指针 1.函数指针的创建 2.函数指针的使用 3.有趣的代码(1) 4.有趣的代码(2) 四、typedef关键字 1.typedef的使用方法 2.typedef和#define的区别 五、函数指针…

Ubuntu22.04安装Nvidia 550驱动和CUDA toolkit 12.4.1

1. 安装显卡驱动550版本&#xff1a; wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt-get update sudo apt-get -y install cuda-drivers 命令来源于&…

牛客Xorto

Xorto 题目描述 给定一个长度为n的整数数组&#xff0c;问有多少对互不重叠的非空区间&#xff0c;使得两个区间内的数的异或和为0。 输入描述: 第一行一个数n表示数组长度&#xff1b; 第二行n个整数表示数组&#xff1b; 1<n<1000,0<数组元素<100000。 输出…

【Android学习】简易计算器的实现

1.项目基础目录 新增dimens.xml 用于控制全部按钮的尺寸。图片资源放在drawable中。 另外 themes.xml中原来的 <style name"Theme.Learn" parent"Theme.MaterialComponents.DayNight.DarkActionBar">变为了&#xff0c;加上后可针对button中增加图片…

Angular中的管道(Pipe)

Angular中的管道(Pipe) 文章目录 Angular中的管道(Pipe)前言一、内置管道1. date管道格式化日期2. currency管道格式化货币3. uppercase和lowercase管道转换字符串大小写4. 小数位数5. JavaScript 对象序列化6. slice7. 管道链 二、自定义管道 前言 Angular中的管道&#xff0…

[蓝桥杯2024]-PWN:ezheap解析(堆glibc2.31,glibc2.31下的double free)

查看保护 查看ida 大致就是只能创建0x60大小的堆块&#xff0c;并且uaf只能利用一次 完整exp&#xff1a; from pwn import* #context(log_leveldebug) pprocess(./ezheap2.31)def alloc(content):p.sendlineafter(b4.exit,b1)p.send(content) def free(index):p.sendlineaft…

Qt扫盲-Qt D-Bus概述

Qt D-Bus概述 一、概述二、总线三、相关概念1. 消息2. 服务名称3. 对象的路径4. 接口5. 备忘单 四、调试五、使用Qt D-Bus 适配器1. 在 D-Bus 适配器中声明槽函数1. 异步槽2. 只输入槽3. 输入输出槽4. 自动回复5. 延迟回复 一、概述 D-Bus是一种进程间通信(IPC)和远程过程调用…

ubuntu Qt打包

在Linux 下如何打包免安装的QT程序&#xff1f;-CSDN博客 [教程][Ubuntu][Qt]将Qt程序打包成deb文件&#xff0c;发布、安装及使用_qt生成deb-CSDN博客

前端关于location的方法以属性

目录 一、location是用来做什么的&#xff1f; 二、location的属性和方法能实现什么功能&#xff1f; 功能一&#xff1a;获取当前页面的URL信息 功能二&#xff1a;页面跳转 location.assign() 附&#xff1a;其他页面跳转的方法 1.location.href 2.window.open() …

QAnything知识库问答系统离线部署(LLM+RAG)

一、QAnything介绍 &#xff08;一&#xff09;简介 QAnything 是网易有道开源的一个问答系统框架&#xff0c;支持私有化部署和SaaS服务两种调用形式。它能够支持多种格式的文件或数据库&#xff0c;提供准确、快速和可靠的问答体验。目前已支持的文件格式包括PDF、Word、PP…

微信小程序开发:深入实现地图导航功能【含代码示例】

微信小程序开发&#xff1a;深入实现地图导航功能【含代码示例】 一、引言二、准备工作三、集成地图SDK四、实现地图显示五、添加标记点和路线 一、引言 微信小程序作为一种轻量级的应用程序&#xff0c;凭借其无需安装、即用即走的特点&#xff0c;迅速在移动应用市场中占据了…

【软件工程】概要设计

目录 前言软件设计简介概要设计模块化模块化的评价耦合内聚 面向对象设计原则Liskov替换原则&#xff08;LSP&#xff09;开放-封闭原则&#xff08;OCP&#xff09;单一职责原则&#xff08;SRP&#xff09;接口隔离原则&#xff08;ISP&#xff09;依赖倒置原则&#xff08;D…

关于springboot内置tomcat最大请求数配置的一些问题

前言 springboot内置了tomcat。那么一个springboot web应用&#xff0c;最大的请求链接数是多少呢&#xff1f;很早以前就知道这个是有个配置&#xff0c;需要的时候&#xff0c;百度一下即可。但&#xff0c;事实并非如此&#xff0c;有几个问题我想大多数人还真不知道。比如…

基于Sping Boot集成的websocket实现聊天室

Spring Boot整合WebSocket实现聊天室 Spring Boot 提供了 Websocket 组件 spring-boot-starter-websocket&#xff0c;用来支持在 Spring Boot环境下对Websocket 的使用。 下面我们就以多人在线聊天室为例&#xff0c;演示 Spring Boot 是如何整合Websocket 实现服务端消息推…

python(abi)是什么,有什么作用呢

python(abi) 是一个特殊的提供项&#xff0c;用于指定软件包所支持的Python ABI&#xff08;Application Binary Interface&#xff09;版本。 Python ABI是一种约定&#xff0c;用于定义Python解释器和扩展模块之间的二进制接口。它确保了不同版本的Python解释器和扩展模块之…

如何使用提示测试为LLMs构建单元测试?

原文地址&#xff1a;how-to-build-unit-tests-for-llms-using-prompt-testing 确保您的人工智能交付&#xff1a;快速测试完美生成应用程序的基本指南 2024 年 4 月 26 日 如果你曾经编写过软件&#xff0c;你就会知道测试是开发过程中必不可少的一部分。特别是单元测试&#…

JavaWeb--1.Servlet

Servlet&#xff08;基础&#xff09; 1、配置依赖&#xff1a; ​ 在pom.xml文件中加入相关依赖 <dependencies><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>5.0.0&l…