二叉树---堆的现实

news/2024/5/20 9:35:32 标签: android, 数据结构,

目录

一、头文件的声明

二、功能函数的实现

void Swap(HPDateType* pa, HPDateType* pb);

void HPInit(HP* php);

void HPDestory(HP* php)

bool HPEmpty(HP* php)

void AdjustUP(HPDateType* a, int child)

void AdjustDown(HPDateType* a, int n, int parent)

void HPPush(HP* php, HPDateType x)    

void HPPop(HP* php)

int HPSize(HP* php)

HPDateType HPTop(HP* php)

三、注意点


一、头文件的声明

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>


typedef int HPDateType;

typedef struct heap
{
	int size;
	int capacity;
	HPDateType* a;
}HP;

void Swap(HPDateType* pa, HPDateType* pb);


//固定

void HPInit(HP* php);
void HPDestory(HP* php);
bool HPEmpty(HP* php);


//算法

void AdjustUP(HPDateType* a, int child);
void AdjustDown(HPDateType* a, int n, int parent);

//Push、Pop

void HPPush(HP* php, HPDateType x);
void HPPop(HP* php);

//特殊元素

int HPSize(HP* php);
HPDateType HPTop(HP* php);

二、功能函数的实现

void Swap(HPDateType* pa, HPDateType* pb);
 


void Swap(HPDateType* pa, HPDateType* pb)
{
	assert(pa);
	HPDateType tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}

void HPInit(HP* php);

void HPInit(HP* php)
{
	assert(php);		//别忘了assert
	php->a = NULL;
	php->capacity = 0;
	php->size = 0;
}

void HPDestory(HP* php)
 



void HPDestory(HP* php)
{
	assert(php);

	free(php->a);
	php->a = NULL;
	php->capacity = 0;
	php->size = 0;
}

bool HPEmpty(HP* php)
 


bool HPEmpty(HP* php)
{
	assert(php);
	return php->size == 0;
}

void AdjustUP(HPDateType* a, int child)
 




void AdjustUP(HPDateType* a, int child)
{
	assert(a);

	int parent = (child - 1) / 2;

	while (child > 0)
	{
		if (parent > 0 && a[child] < a[parent])
		{
			Swap(&a[child], &a[parent]);


			//迭代
			child = parent;
			parent = (child - 1) / 2;
		}

		else
			break;

	}

}

void AdjustDown(HPDateType* a, int n, int parent)
 


void AdjustDown(HPDateType* a, int n, int parent)
{
	assert(a);


	//建大:假设左孩子大
	int child = parent * 2 + 1;			//先× 2,再 + 1

	while (child < n)		//n是大小,不是下标
	{
		//向下调整需要找大孩子

		if (child + 1 < n
			&& a[child + 1] < a[child])
		{
			child++;	//变成右孩子
		}

		if (a[child] < a[parent])
		{
			Swap(&a[child], &a[parent]);

			//在循环中,让parent与child不断迭代
			parent = child;
			child = parent * 2 + 1;
		}
		else
			break;

	}
}

void HPPush(HP* php, HPDateType x)    

1.判断是否满          ------              开辟空间

开辟完成之后,需要capacity更新,空间更新

	//void初始化,一级指针,没法开辟空间
{
	assert(php);

	//空间:都用realloc

	if (php->capacity == php->size)
	{
		int newcapacity = php->capacity == 0 ? 4 : 2 * (php->capacity);

		HPDateType* tmp = (HPDateType*)realloc(php->a, sizeof(HPDateType) * newcapacity);
		if (tmp == NULL)	//判断是否开辟失败
		{
			perror("realloc fail");
			return;	
		}
		php->a = tmp;

		php->capacity = newcapacity;		//除了空火箭开辟,开需要对php->capacity进行修改
	}
		//size是结构元素 , php->size才合法
	php->a[php->size] = x;

	php->size++;

	AdjustUP(php->a, php->size - 1);		//size是结构元素 , php->size才合法

}

void HPPop(HP* php)
 

1.头尾交换

2.删除数据

3.向下调整


void HPPop(HP* php)
{
	assert(php);
	assert(!HPEmpty(php));		//调用函数需要传参

	Swap(php->a, &php->a[php->size - 1]);

	php->size--;	//size是结构体成员

	AdjustDown(php->a, php->size, 0);		//php->size	需要传数组的大小
}

int HPSize(HP* php)
 


int HPSize(HP* php)
{
	assert(php);

	return php->size;
}

HPDateType HPTop(HP* php)
 


HPDateType HPTop(HP* php)
{
	assert(php);
	assert(!HPEmpty(php));		//内部调用函数,需要传参!!!
	
	return php->a[0];
}

三、注意点

需要注意的是,在函数内部调用HPEmpty函数时,需要传参!


http://www.niftyadmin.cn/n/5481330.html

相关文章

【今日刷题】LeetCode 199.二叉树的右视图(中等)

今日刷题&#xff1a;LeetCode 199.二叉树的右视图&#xff08;中等&#xff09; 题目描述&#xff1a; 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,…

【vim 学习系列文章 20 -- a:mode 的值有哪些?】

请阅读【嵌入式开发学习必备专栏 之 Vim】 文章目录 a:mode 的值有哪些?举例Vim 底部状态栏设置 a:mode 的值有哪些? 在 Vim 脚本语言中&#xff0c;a:mode 常常用于函数内部&#xff0c;以获取该函数被调用时 Vim 正处于的模式。它主常用于那些可以从不同模式下被调用的函数…

ABB、FANUC机器人点位加速度用法

机器人在点位与点位之间的运动&#xff0c;会存在速度上的变化&#xff0c;加速度指令的添加可以减小机器人在运动中&#xff0c;由高速到低速间惯性的带来的影响&#xff0c;修正机器人的路径误差&#xff0c;让机器人的运动更加顺滑。 一、ABB机器人指令添加 ABB机器人加速…

GoLand 2024 for Mac/Win:卓越的GO语言集成开发工具环境

在数字化时代&#xff0c;编程语言的选择对于开发者的工作效率和项目质量至关重要。而GO语言&#xff0c;以其高效、简洁和并发的特性&#xff0c;成为越来越多开发者的优选。为了让GO语言开发者能够更高效地编写代码&#xff0c;GoLand 2024应运而生&#xff0c;它是一款专为M…

物联网可视化平台

随着数字化转型的深入&#xff0c;物联网技术正在成为企业实现智能化、高效化运营的重要工具。物联网可视化平台&#xff0c;作为连接物理世界与数字世界的桥梁&#xff0c;为企业提供了直观、实时的数据展示和监控能力&#xff0c;从而在数字化转型中扮演着关键角色。 一、物…

【Canvas与艺术】绘制磨砂黄铜材质Premium Quality徽章

【关键点】 渐变色的使用、斜纹的实现、底图的寻觅 【成果图】 ​​​​​​​ 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><tit…

MySQL 用来查询表结构的 SQL 语句

文章目录 背景&#xff1a; 在项目的总体设计中&#xff0c; 关于数据库设计中的逻辑设计&#xff0c; 需要用到表结构&#xff0c;可以使用如下 SQL 语句直接查询。 SELECTTABLE_SCHEMA as 数据库名,TABLE_NAME as 表名,ORDINAL_POSITION as 序号,COLUMN_NAME as 字段名,COLUM…

IDM激活步骤-亲测可用

前言&#xff1a;我试了3种方法&#xff0c;仅以下方法激活成功&#xff0c;其他都是30天试用 使用步骤&#xff1a; 1.从官网下载IDM并安装&#xff1a;https://www.internetdownloadmanager.com/ 2.下载激活工具&#xff1a;https://wwif.lanzouw.com/iSY2N16s81xi &#…