C实现堆

HeadList.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<malloc.h>

typedef struct Head
{
	int* a;
	int capa;
	int size;
}Head;

void HeadInit(Head* hp, int* a, int n);
void HeadCheckCapacity(Head* hp, int n);
void HeadPrintf(Head* hp,int n);
void HeadPush(Head* hp, int x);
void HeadPop(Head* hp, int x);

void ShiftUp(int* hp, int child);
void ShiftDown(int* a, int n, int root);
void Swap(int* pa, int* pb);

void HeadDestory(Head* hp);
void HeadSort(Head* hp, int n);

HeadList.c

#include"HeadList.h"

void HeadInit(Head* hp, int* a, int n)
{
	assert(hp && a);
	int i = 0;
	hp->capa = hp->size = 0;
	HeadCheckCapacity(hp, n);
	for (i = 0; i < n; i++)
	{
		hp->a[i] = a[i];
		hp->size++;
	}
	i = (n - 2) / 2;
	while (i >= 0)
	{
		ShiftDown(hp->a, n, i);
		i--;
	}
}

void HeadCheckCapacity(Head* hp,int n)
{
	assert(hp);
	if (hp->size == hp->capa)
	{
		int newCapacity = n;
		if(hp->capa == 0)
		{
			hp->a = (int *)malloc(newCapacity * sizeof(int));
			hp->capa = hp->capa + newCapacity;
		}
		else
		{ 
            hp->a = (int* )realloc(hp->a, (hp->capa + 1) * sizeof(int));
			hp->capa = hp->capa + newCapacity;
		}
		assert(hp->a);
	}
}

void HeadPush(Head* hp, int x)
{
	assert(hp);
	HeadCheckCapacity(hp, 1);
	hp->a[hp->size] = x;
	hp->size++;
	ShiftUp(hp->a, (hp->size - 1));
}

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

void HeadPop(Head* hp, int x)
{
	int i = 0;
	int pos;
	for (i = 0; i < hp->size; i++)
	{
		if (hp->a[i] == x)
		{
			pos = i;
			break;
		}
	}
	Swap(&hp->a[pos], &hp->a[hp->size - 1]);
	hp->size--;
	ShiftDown(hp->a, hp->size, pos);
}

void ShiftDown(int* a, int n, int root)
{
	assert(a);
	int parent = root;
	int child = 2 * parent + 1;
	while (child < n)
	{
		if (child + 1 < n && a[child + 1] > a[child])
		{
			++child;
		}
		if (a[child] > a[parent])
		{
			Swap(&a[child], &a[parent]);
			parent = child;
			child = 2 * parent + 1;
		}
		else
		{
			break;
		}
	}
}

void ShiftUp(int* a, int child)
{
	assert(a);
	int parent = (child - 1) / 2;
	while (child > 0)
	{
		if ( a[child] > a[parent])
		{
			Swap(&a[child], &a[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}
	}

}


void HeadPrintf(Head* hp, int n)
{
	assert(hp);
	for (int i = 0; i < n; i++)
	{
		printf("%d ", hp->a[i]);
	}
	printf("\n");
}

void HeadSort(Head* hp, int n)
{
	assert(hp);
	for (int i = 0; i < n ; i++)
	{
		Swap(&hp->a[0], &hp->a[n - 1 - i]);
		ShiftDown(hp->a, hp->size - 1 - i, 0);
	}
}


void HeadDestory(Head* hp)
{
	free(hp->a);
	hp->a = NULL;
}


void test()
{
	int a[] = { 1,5,3,8,7,6 };
	Head hp;
	int n = sizeof(a) / sizeof(a[0]);

	HeadInit(&hp, a, n);
	HeadPrintf(&hp, n);
	HeadPush(&hp, 10);
	HeadPrintf(&hp, hp.size);
	HeadPop(&hp, 10);
	HeadPrintf(&hp, hp.size);
	HeadSort(&hp, hp.size);
	HeadPrintf(&hp, hp.size);

	HeadDestory(&hp);
}

int main()
{
	test();
	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值