这个堆的实现采用数组存储的完全二叉树实现。

最近有点烦躁,先是跳槽到了一个外包公司,感觉2016有点坑,另外一件事就是老婆怀孕了,但是在家里没人照顾,很担心。

这个堆的实现就暂时不优化了,基本的插入,删除实现。

还有,NJ,这个城市真热。

这周希望把剩下的几个数据结构给写了@2016-08-11 00:08:22

 #include <stdio.h>

 //#define PF  printf("____________in Function___________ %s\n", __FUNCTION__)
#define PF #define HAVETWOSON 1 //表示其有2个子节点
#define HAVEONLYLSON 2 //只有1个左孩子节点 /*堆的实现采用数组,首先是构建完全二叉树的规则
1.完全二叉树的性质
2.子节点的value小于父节点
3.为了保持数组下标和完全二叉树的对应关系,数组下标选择从1开始处理,第1个数组元素置为heap的大小
4.最近比较事多,老婆怀孕,家里没人照顾,好烦躁。这个堆的实现push和pop有好的方法去实现,但是没心情去好好想,就偷懒了,具体的想法就是,push和pop操作的元素只是i,2i, 2i+1,希望有时间来改改吧。
*/
void RevHeap(int *top, int *l, int *r);
int GetMin(int *t, int *l, int *r, int *min);
void PopEle(int *heap);
void PrintBHeapWh(int *top);
void PrintBHeapEl(int *top);
int CheckHeap(int *heap, int pos);
void ConsBHeap(int *heap);
void PushEle(int *heap, int newEle); void PushEle(int *heap, int newEle)
{
*heap = *heap + ;
*(heap + *heap) = newEle;
}
int GetMin(int *t, int *l, int *r, int *min)
{
PF;
//min = (int *)malloc(sizeof(int));
*min = *t;
if(*min > *l)
{
*min = *l;
}
if(*min > *r)
{
*min = *r;
}
if(*min == *l)
{
return ;
}
else if(*min == *r)
{
return ;
}else
{// min = *t
return ;
}
}
void PopEle(int *heap)
{
//PF;
*(heap+) = *(heap + *heap);
--(*heap);
} void PrintBHeapWh(int *top)
{
//PF;
int i ;
for(i=; i<*top+; i++)
{
printf("%d ", *(top+i));
}
printf("\n");
} void PrintBHeapEl(int *top)
{
//PF;
int i ;
for(i=; i<*top+; i++)
{
printf("%d ", *(top+i));
}
printf("\n"); } void RevHeap(int *top, int *l, int *r)
{ int *min = NULL;
min = (int *)malloc(sizeof(int));
int ret = -;
int tmp;
if(r != NULL)
{
ret = GetMin(top, l, r, min); if(ret ==)
{
//l is the min
tmp = *top;
*top = *l;
*l = tmp;
}
else if(ret ==)
{
tmp = *top;
*top = *r;
*r = tmp;
}
}
else
{
*min = *top;
if(*min > *l)
{
tmp = *l;
*l =*min;
*min = tmp;
}
*top = *min;
}
return ;
}
int CheckHeap(int *heap, int pos)
{
//PF;
if(pos*+ <= *heap)
{
if((*(heap +pos) > *(heap + pos*))
|| (*(heap +pos) > *(heap + pos*+)))
{ return HAVETWOSON;
}
}
//只有左子树
//if((pos*2 <= size)&&(pos*2+1 > size))
if((pos* == *heap))
{
if(*(heap +pos) > *(heap + pos*))
// || (*heap +pos > *heap + pos*2+1))
{
return HAVEONLYLSON;
}
}
return ;
} void ConsBHeap(int *heap)
{
PF;
int i ;
int isNeedCon = ; for(i = ; i < *heap+; i++)
{
if(CheckHeap(heap, i)==HAVETWOSON)
{
//printf("proc [%d]th elem [%d]\n", i, *(heap+i));
RevHeap(heap +i, (heap + *i), (heap+ *i+));
//printf("i=[%d] %d %d %d \n", i, *(heap+i), *(heap + 2*i), *(heap+ 2*i+1));
isNeedCon = ;
}
else if(CheckHeap(heap, i)== HAVEONLYLSON)
{
RevHeap(heap+i, (heap + *i), NULL);
//printf("i=[%d] %d %d \n", i, *(heap+i), *(heap + 2*i) );
isNeedCon = ;
}
//printf("[%d]th change.", i);
//PrintBHeapEl(heap);
}
printf("\n"); //用递归好写,偷点懒
if(isNeedCon)
{
ConsBHeap(heap);
}
return;
}
int main(void)
{
//int arr[12]={0,4, 5, 2, 1,3, 6, 8, 9, 7, 22, 11};
int arr[]={, , , , ,, }; //PrintBHeapEl(arr);
printf("Berfore process the heap:\n");
PrintBHeapWh(arr); ConsBHeap(arr);
printf("Consturcct the heap:\n");
PrintBHeapWh(arr); PopEle(arr);
printf("Pop the heap:\n");
PrintBHeapWh(arr);
ConsBHeap(arr);
printf("Pop Con the heap:\n");
PrintBHeapWh(arr); PushEle(arr, );
printf("Pop the heap:\n");
PrintBHeapWh(arr);
ConsBHeap(arr);
printf("Push Con the heap:\n");
PrintBHeapWh(arr); return ;
}

运行结果贴下:

Berfore process the heap:
6 4 5 2 1 3 6

Consturcct the heap:
6 1 2 4 5 3 6
Pop  the heap:
5 6 2 4 5 3

Pop Con the heap:
5 2 3 4 5 6
Pop  the heap:
6 2 3 4 5 6 1

Push Con the heap:
6 1 3 2 5 6 4

堆(Heap)-c实现的更多相关文章

  1. JVM的堆(heap)、栈(stack)和方法区(method)

    JVM主要由类加载器子系统.运行时数据区(内存空间).执行引擎以及与本地方法接口等组成.其中运行时数据区又由方法区Method Area.堆Heap.Java stack.PC寄存器.本地方法栈组成. ...

  2. [转]JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

    这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题: 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(h ...

  3. 堆heap和栈Stack(百科)

    堆heap和栈Stack 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈 ...

  4. (转)Java里的堆(heap)栈(stack)和方法区(method)(精华帖,多读读)

    [color=red][/color]<一> 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收.   引用数据类型,需要用new来创建,既在栈 ...

  5. Java中堆(heap)和栈(stack)的区别

    简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分 ...

  6. 优先队列Priority Queue和堆Heap

    对COMP20003中的Priority queue部分进行总结.图片来自于COMP20003 queue队列,顾名思义特点先进先出 priority queue优先队列,出来的顺序按照优先级prio ...

  7. python数据结构之堆(heap)

    本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...

  8. 纸上谈兵: 堆 (heap)

    纸上谈兵: 堆 (heap)   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 堆(heap)又被为优先队列(priority ...

  9. JVM 内存初学 堆(heap)、栈(stack)和方法区(method)

    这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题:先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(he ...

  10. 转:JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

    原文地址:JVM 内存初学 (堆(heap).栈(stack)和方法区(method) ) 博主推荐 深入浅出JVM 这本书 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(heap).栈( ...

随机推荐

  1. java导出html页面

    http://blog.csdn.net/zhyh1986/article/details/8727523#t6 http://blog.csdn.net/zuozuofuwaiwai/article ...

  2. [NOIP2004提高组]虫食算

    题目:洛谷P1092.codevs1064.Vijos P1099. 题目大意:给你一个$n$进制.每个数都是$n$位的三个数a,b,c,这些数的数位由字母表示(共$n$个字母,从‘A’开始),所有数 ...

  3. 页面下载文件方法,post与get

    一般下载文件,常见使用的是window.open('url'):方法进行下载.若需要带参数,直接在url后面拼接参数,进行传递.window.open方法仅可以进行get方法进行参数提交. 若需要进行 ...

  4. [POJ3233]Matrix Power Series 分治+矩阵

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia [POJ3233]Matrix Power Series 分治+矩阵 题目大意 A为n×n(n<= ...

  5. [AngularJS]Chapter 5 与服务器交互

    第八章有关于缓存的东西. [通过$http交互] 传统的AJAX请求如下 var xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange ...

  6. JAVA集合类型(二)

    JAVA集合类型 (现代的变量集群) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0J ...

  7. [Chromium]怎样安全的使用PostTask

    PostTask參数决策树 怎样传递绑定的对象 官方的解释总是最权威.有疑问看这里或者直接看代码中的说明: bind_helpers.h. 传值方式 描写叙述 this 或 对象指针 假设对象本身是一 ...

  8. openfiler作为文件server,实现ISCSI共享存储

    还是不能发图.这是第二篇.图文在这个地址:http://download.csdn.net/detail/weimingyu945/8089893 1      登陆 首先登陆openfiler的we ...

  9. UESTC 1143 数据传输 网络流 最大流 Dinic

    数据传输 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  Sta ...

  10. poj 2777 Count Color(线段树、状态压缩、位运算)

    Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38921   Accepted: 11696 Des ...