皇冠新体育APP

IT技术之家

皇冠新体育APP > 皇冠新体育APP

皇冠新体育APP

C语言实现堆_Y雨何时停T

颁布时刻:2023-08-24 16:36:39 皇冠新体育APP 52次 标签:数据结构 c语言 学习 顺序表
C语言实现堆...

注:在此各位所达到的是大根堆(即父分支不不大于子分支的堆)

目录

一,堆的解释 二,堆结构类型的开启 三,电源接口体现 1,初始状态化与消毁 2,统计数据的导入与册除 3,任何模块

一,堆的介绍

两种结构:

在物理上的结构的上,堆那就是块间断性的存放空间,使用数组 在逻缉机构上,堆是一种棵几乎二叉树

两种形式:

大根堆:父分支不少于子分支 小根堆:父网络子域不太于子网络子域

二,堆结构的创建

三种成员英文,跳转到数组的指南datas,数字代表数组有效参数数量的size,数字代表数组功率的capacity
typedef int HeapDataType;

typedef struct Heap
{
	HeapDataType* datas;
	int size;
	int capacity;
}Heap;

此处如果当我们比堆和步骤表,能能找到构造体的有个能能说一摸差不多的,我猜测这就展现出了数据库构造的哲学体系而言理念的这一点我想,指定个构造体毕竟用到措施的各种有差异,而使它激发出了各种有差异的作用,变为了新的面貌。

三,接口实现

1,初始化与销毁

初期化,在操作堆时候,置空堆的班子; 注销,在动用堆后会,挥发的空间,置空堆的班子成员;

void HeapInit(Heap* pHeap);

void HeapInit(Heap* pHeap)
{
	assert(pHeap != NULL);

	pHeap->datas = NULL;
	pHeap->size = pHeap->capacity = 0;
}


void HeapDestroy(Heap* pHeap);

void HeapDestroy(Heap* pHeap)
{
	assert(pHeap != NULL);

	free(pHeap->datas);
	pHeap->datas = NULL;
	pHeap->size = pHeap->capacity = 0;
}

2,数据的插入与删除

void HeapPush(Heap* pHeap, HeapDataType x);

统计资料复制前先检测储存量是否须得够了,不高则须得扩张,办公空间够了后复制统计资料,但这统计资料的架构有机会不足足堆的规定特殊要求了(大根堆规定特殊要求父接点不值为子接点,新接点有机会不足足这款相互关系),这个时候须得优化(在等你的优化分为向左优化)
void HeapPush(Heap* pHeap, HeapDataType x)
{
	assert(pHeap != NULL);

	HeapCheckCapacity(pHeap);
	pHeap->datas[pHeap->size] = x;
	AdjustUp(pHeap->datas, pHeap->size);

	pHeap->size++;
}

往前修正的制作方法是一方面得到新子域的父子域,采用有点长宽来判段是否必须 来进行数值的互相交換(子子域低于父子域则互相交換,相反、不需修正),比如来进行了互相交換还必须 已经判段,到新数值已到应该的部位(满足了堆的追求)
void AdjustUp(HeapDataType* datas, int child)
{
	int parent = (child - 1) / 2;

	while (child > 0)
	{
		if (datas[child] > datas[parent])
		{
			Swap(&datas[child], &datas[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}
	}
}

void Swap(HeapDataType* x, HeapDataType* y)
{
	HeapDataType temp = *x;
	*x = *y;
	*y = temp;
}
void HeapCheckCapacity(Heap* pHeap)
{
	if (pHeap->size == pHeap->capacity)
	{
		int newcapacity = 2 * pHeap->capacity;
		pHeap->datas = (HeapDataType*)realloc(pHeap->datas, sizeof(HeapDataType) * newcapacity);
		assert(pHeap->datas != NULL);

		pHeap->capacity = newcapacity;
	}
}

void HeapPop(Heap* pHeap);?

注意这里的删除操作,删除的是根节点

堆根点位的清空,先要交換数组首设计和尾设计的数剧显示分析,接下来进行调准(首尾设计数剧显示分析交換后数剧显示分析的形式很有可能未够满足堆的追求),这里的的调准叫作朝下调准
void HeapPop(Heap* pHeap)
{
	assert(pHeap != NULL);
	assert(HeapEmpty(pHeap) != true);

	Swap(&(pHeap->datas[0]), &(pHeap->datas[pHeap->size - 1]));

	pHeap->size--;
	AdjustDown(pHeap->datas, pHeap->size, 0);
}

与朝下修改相似性,朝下修改的面的做法是应先找至根接点的子接点(更大的子接点),使用比更程度来断定什么情况下参与统计资料的调换(子接点超出父接点则调换,否则不需修改),若是 参与了调换还必须 已经断定,不知道根统计资料至适用的选址(考虑堆的规范要求)?
void Swap(HeapDataType* x, HeapDataType* y)
{
	HeapDataType temp = *x;
	*x = *y;
	*y = temp;
}
void AdjustDown(HeapDataType* datas, int size, int parent)
{
	int child = parent * 2 + 1;

	while (child < size)
	{
		if (child + 1 < size && datas[child] < datas[child + 1])
		{
			child += 1;
		}

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

			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

3,其他接口

HeapDataType HeapTop(Heap* pHeap);查看根节点数据

HeapDataType HeapTop(Heap* pHeap)
{
	return pHeap->datas[pHeap->size - 1];
}


bool HeapEmpty(Heap* pHeap);判断堆是否为空

bool HeapEmpty(Heap* pHeap)
{
	return pHeap->size == 0 ? true : false;
}


int HeapSize(Heap* pHeap);查看堆有效数据的多少

int HeapSize(Heap* pHeap)
{
	return pHeap->size;
}