/* 前言: 好多天前准备记录下自己的坎坷修仙的点滴,以后希望能留下【珍贵的回忆】,萌新的日常代码,大佬互喷*/
代码写的比较繁琐,多多见谅,萌新每天都在努力改变自己
堆的检索输出要用队列为了省事我直接看内存的位置了,没有写队列输出 QaQ
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
struct HeapStruct
{
int Capacity;//容量
int CurrentSize;//当前长度
int *pElements;//数据域
};
HeapStruct* InitLisze(int);//初始化长度
HeapStruct* DestroyHeap(HeapStruct*);
void MakeEmptyHeap(HeapStruct*);
void InsertHeap(int, HeapStruct*);
int DeleteMin(HeapStruct*);
bool HeapIsEmpty(HeapStruct*);
bool HeapIsFull(HeapStruct*);
void trvalHeap(HeapStruct*);
int main(void)
{
HeapStruct*pHeap=InitLisze(20);
InsertHeap(2, pHeap);
InsertHeap(3, pHeap);
InsertHeap(-2, pHeap);
InsertHeap(-13, pHeap);
InsertHeap(-22, pHeap);
InsertHeap(16, pHeap);
InsertHeap(42, pHeap);
InsertHeap(33, pHeap);
InsertHeap(12, pHeap);
printf("\n");
trvalHeap(pHeap);
DeleteMin(pHeap);//删除最小堆元素
trvalHeap(pHeap);//检索
system("pause");
return 0;
}
HeapStruct* InitLisze(int MaxInitSize)//初始化长度
{
HeapStruct*pHeap = (HeapStruct*)malloc(sizeof(HeapStruct));
if (!pHeap)
{
printf("\nERROR:Out of Space !!\n");
exit(-1);
}
pHeap->Capacity = MaxInitSize;
pHeap->CurrentSize = 0;
pHeap->pElements = NULL;
pHeap->pElements = (int*)malloc(sizeof(int)*(MaxInitSize + 1));//多一个是给哨兵 sentinel
if (!pHeap->pElements)
{
printf("\nERROR:Out of Space!!\n");
exit(-1);
}
return pHeap;
}
HeapStruct* DestroyHeap(HeapStruct*pHeap)
{
if (!pHeap)
return NULL;
free(pHeap->pElements);
free(pHeap);
return (pHeap = NULL);
}
void MakeEmptyHeap(HeapStruct*pHeap)
{
if (!pHeap)
return;
pHeap->CurrentSize = 0;
}
void InsertHeap(int InsetNum, HeapStruct*pHeap)
{
if (!pHeap)
return;
if ((pHeap->CurrentSize + 1) <= pHeap->Capacity)//当前长度+1小于容量
{
int CurrentPosition = ++(pHeap->CurrentSize);//当前位置为当前长度+1(当前长度+1)
int pFather = CurrentPosition / 2;
while (pFather > 0)//该值有父亲开始渗透
{
if (pHeap->pElements[pFather] < InsetNum)//父亲<当前值,渗透结束
break;
else
{
pHeap->pElements[CurrentPosition] = pHeap->pElements[pFather];//否则下渗父亲
CurrentPosition = pFather;//父亲位成为当前位
pFather = CurrentPosition / 2;//找出当前位的父亲
}
}//while
pHeap->pElements[CurrentPosition] = InsetNum;//将值插入
}
else
printf("\nERROR:The Heap is Full ,Out of Space \n");
return;
}
int DeleteMin(HeapStruct*pHeap)
{
if (!pHeap)
return 999;
int DeleteNum = pHeap->pElements[1];
int CurrentPosition = 1;//从一开始下渗
int LastPositionNum = pHeap->pElements[pHeap->CurrentSize--];//取最后的数并自减
int Child = 2 * CurrentPosition;
while (Child <= pHeap->CurrentSize)//孩子在长度范围内那么父定在
{
if ((Child!=pHeap->CurrentSize)&&(pHeap->pElements[Child] > pHeap->pElements[Child + 1]))
Child++;
pHeap->pElements[CurrentPosition] = pHeap->pElements[Child];//将当前孩子位的值放进首位
CurrentPosition = Child;//当前位置就是Child位
Child = CurrentPosition * 2;//找出当前位置的Child(必定是左)
}
pHeap->pElements[CurrentPosition] = LastPositionNum;
return DeleteNum;//将删除值返回
}