码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-04-15 23:27:29      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:数据结构      c语言   

参考书籍《数据结构与算法分析——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]);
    }
}


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

标签:数据结构      c语言   

原文地址:http://blog.csdn.net/u010275850/article/details/45065195

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!