数据结构学习——二叉堆ADT(程序化)

参考书籍《数据结构与算法分析——C语言描述》

关于堆的一些基本概念,可参见小zz的另一篇博文。

/*本例程实现的是最小堆,最大堆类似*/
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>

#define MAX 13

typedef struct BHeap
{
    int Capacity;//堆的最大容量
    int Size;//当前堆大小
    int *bh;//堆的数组实现
}BHeap,*BH;

BH Init_BH(int Max);//堆的初始化
bool IsFull(BH H);//判断堆是否满
void Insert(int data,BH H);//插入操作
int DeletMin(BH H);//删除最小元
bool IsEmpty(BH H);//判断是否是空
void PrintHeap(BH H);

int main()
{
    int i=0;
    int data[11]={0,14,19,26,65,32,31,21,68,16,13};
    BH Heap;
    Heap=Init_BH(MAX);
    for(i=1;i<=10;i++)
    {
        Insert(data[i],Heap);
    }
    PrintHeap(Heap);
    DeletMin(Heap);
    PrintHeap(Heap);

    return 0;
}

BH Init_BH(int Max)
{
    BH H;
    H=malloc(sizeof(BHeap));
    if(H==NULL)
        printf("Out of space!\n");

    H->bh=malloc(sizeof(int)*(Max+1));
    memset(H->bh,0,sizeof(int)*(Max+1));
    if(H->bh==NULL)
        printf("Out of space!\n");

    H->Capacity=Max;
    H->Size=0;
    H->bh[0]=0;

    return H;
}

bool IsFull(BH H)
{
    if(H->Capacity==H->Size)
        return true;//已满
    else return false;//未满
}

void Insert(int data,BH H)
{
    int i;
    if(IsFull(H))
    {
        printf("Binary Heap is full!\n");
        return;
    }

    for(i=++H->Size;H->bh[i/2]>data;i=i/2)//上滤
    {
            H->bh[i]=H->bh[i/2];
    }
    H->bh[i]=data;
}

bool IsEmpty(BH H)
{
    if(H->Size==0)
        return true;//空堆
    else return false;
}

int DeletMin(BH H)
{
    int i,Child;
    int Min,Last;
    if(IsEmpty(H))
    {
        printf("Heap is empty!\n");
        return H->bh[0];
    }

    Min=H->bh[1];
    Last=H->bh[H->Size--];

    for(i=1;i*2<=H->Size;i=Child)
    {
        Child=i*2;//左儿子
        if((Child<H->Size)&&(H->bh[Child]>H->bh[Child+1]))
            Child++;
        if(Last>H->bh[Child])
            H->bh[i]=H->bh[Child];
        else
            break;
    }
    H->bh[i]=Last;
    return Min;
}

void PrintHeap(BH H)
{
    int i=0;
    for(i=1;i<=H->Size;i++)
    {
        printf("%d\t",H->bh[i]);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值