树-堆结构

来源:互联网 发布:网络被劫持了怎么办 编辑:程序博客网 时间:2024/06/09 23:46

think:
1 今天上午学习了树中的堆结构将一些对结构的基本操作写了写,记录下来,后续继续优化。

#include <stdio.h>#include <string.h>#include <stdlib.h>#define ElementType int#define MAXDATA 20000/* 根据具体情况定义为大于堆中所有可能元素的值*/#define MINDATA -1/* 根据具体情况定义为小于堆中所有可能元素的值*/typedef struct HNode *Heap;///堆的类型定义struct HNode{    ElementType *Data;//存储元素的数组    int Size;//堆中当前元素个数    int Capacity;//堆的最大容量};typedef Heap MaxHeap;//最大堆typedef Heap MinHeap;//最小堆MaxHeap CreatHeap(int MaxSize){/* 创建容量为MaxSize的空的最大堆*/    MaxHeap H = (MaxHeap)malloc(sizeof(struct HNode));    H->Data = (ElementType *)malloc((MaxSize+1)*sizeof(ElementType));    H->Size = 0;    H->Capacity = MaxSize;    //H->Data[0] = MAXDATA;    return H;}void MaxInsert(MaxHeap H, ElementType X){//将元素X插入最大堆H    H->Data[0] = MAXDATA;//定义“哨兵”    int i;    i = ++H->Size;    for(;H->Data[i/2] < X; i /= 2)    {        H->Data[i] = H->Data[i/2];    }    H->Data[i] = X;}void MinInsert(MinHeap H, ElementType X){//将元素X插入最小堆H    H->Data[0] = MINDATA;//定义“哨兵”    int i;    i = ++H->Size;    for(;H->Data[i/2] > X; i /= 2)    {        H->Data[i] = H->Data[i/2];    }    H->Data[i] = X;}ElementType DeleteMax(MaxHeap H){/* 从最大堆中取出键值为最大的元素,并删除一个结点*/    int Parent, Child;    ElementType MaxItem, X;    MaxItem = H->Data[1];    X = H->Data[H->Size--];    for(Parent = 1; Parent*2 <= H->Size; Parent = Child)    {        Child = Parent*2;        if((Child != H->Size) && H->Data[Child] < H->Data[Child+1])            Child++;        if(X >= H->Data[Child])            break;        else            H->Data[Parent] = H->Data[Child];    }    H->Data[Parent] = X;    return MaxItem;}ElementType DeleteMin(MinHeap H){/* 从最小堆中取出一个键值最小的元素,并删除一个结点*/    int Parent, Child;    ElementType MinItem, X;    MinItem = H->Data[1];    X = H->Data[H->Size--];    for(Parent = 1; Parent*2 <= H->Size; Parent = Child)    {        Child = Parent*2;        if((Child != H->Size) && H->Data[Child] > H->Data[Child+1])            Child++;        if(X <= H->Data[Child])            break;        else            H->Data[Parent] = H->Data[Child];    }    H->Data[Parent] = X;    return MinItem;}void PercDown1(MaxHeap H, int p){/* 下滤, 将H中以H->Data[p]为根的子堆调整为最大堆*/    int Parent, Child;    ElementType X;    X = H->Data[p];//取出根节点存放的值    for(Parent = p; Parent*2 < H->Size; Parent = Child)    {        Child = Parent*2;        if((Child != H->Size) && H->Data[Child] < H->Data[Child+1])            Child++;/* Child指向左右结点中的较大者*/        if(X >= H->Data[Child])//找到了合适的位置            break;        else//下滤X            H->Data[Parent] = H->Data[Child];    }    H->Data[Parent] = X;}void BuildHeap1(MaxHeap H){/* 调整H->Data[]中的元素,使得满足最大堆的有序性*/ /* 这里假设所有H->Size个元素已经存在H->Data[]中*/    int i;    /* 从最后一个结点的父结点开始,到根结点1*/    for(i = H->Size/2; i > 0; i--)        PercDown1(H, i);}void PercDown2(MinHeap H, int p){/* 下滤, 将H中以H->Data[p]为根的子堆调整为最小堆*/    int Parent, Child;    ElementType X;    X = H->Data[p];//取出根节点存放的值    for(Parent = p; Parent*2 <= H->Size; Parent = Child)    {        Child = Parent*2;        if((Child != H->Size) && H->Data[Child] > H->Data[Child+1])            Child++;/* Child指向左右结点中的较小者*/        if(X <= H->Data[Child])//找到了合适的位置            break;        else//下滤X            H->Data[Parent] = H->Data[Child];    }    H->Data[Parent] = X;}void BuildHeap2(MinHeap H){/* 调整H->Data[]中的元素,使得满足最小堆的有序性*/ /* 这里假设所有H->Size个元素已经存在H->Data[]中*/    int i;    /* 从最后一个结点的父结点开始,到根结点1*/    for(i = H->Size/2; i > 0; i--)        PercDown2(H, i);}
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 春季脸上起皮怎么办 手上起白皮屑怎么办 手背起皮干燥怎么办 不会读的英语怎么办 中学生不准时回家怎么办 汽车轮胎锈住了怎么办 新轮胎不好装怎么办 学it找不到工作怎么办 血液里有微生物怎么办 机械硬盘不显示怎么办 六安建筑机械租赁公司怎么办 别墅楼梯太陡怎么办 不锈钢楼梯太陡怎么办 真皮白色鞋脏了怎么办 白色牛皮包脏了怎么办 白色羊皮鞋脏了怎么办 白色真皮染色了怎么办 白色漆皮鞋脏了怎么办 对鉴定结果不服怎么办 洗衣机入水口堵塞怎么办 华科办临时饭卡怎么办 血浆乳酸测定高怎么办 olay大红瓶过敏怎么办 饥一顿饱一顿怎么办 朝鲜人向去韩国怎么办? 我是超级大方脸怎么办 被精神病砍断四根筋怎么办 40小时不睡觉怎么办 边防转业军人安置不好怎么办 转业军人孩子读书怎么办玉环 军官证丢了怎么办 飞行学员停飞了怎么办 丹东港债券违约怎么办 对村党支部贿选怎么办 马自达2油耗高怎么办 马自达1.5油耗高怎么办 马自达5停产配件怎么办 期货账户休眠了怎么办 低于二本线怎么办 听力测试不过关怎么办 安装的天正过期怎么办