运行结果正确
实际上,建堆和删除堆是一样的。

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include<malloc.h>
//构造结构堆
typedef struct node *heap;
struct node {
//这是一个数组
int *base;
int max;
int size;
};
//遍历这个堆
void tra(heap h){
for(int i=1;i<=h->size;i++){
printf("%d ",h->base[i]);
}
printf("\n");
}
//初始化(第一个节点是守门员)
heap init(int val){
heap h=(heap)malloc(sizeof(struct node));
h->base=(int*)malloc((val+1)*sizeof(int));
h->max=val;
h->size=0;
h->base[0]=-1;
return h;
}
//给一个无序的序列建堆
//先整合子堆(pos代表当前节点的位置)
void fix_son(heap h,int pos){
//实际上,对于一个最小堆来说,就只有根,左儿子,右儿子 。
//我们只要把这三个排好序就好了
//记录根节点对应的值,把根置空
int root=h->base[pos];
int child,parent;
for(parent=pos;parent*2<=h->size;parent=child){
child=2*parent;
//如果有两个儿子,比较取最小
if(child!=h->size&&(h->base[child]>h->base[child+1])){
child++;
}
//最小的儿子和取出来的根比较
if(h->base[child]<root){
//如果儿子小
h->base[parent]=h->base[child];
}
//如果根小 ,空穴没了,直接退出
else{
break;
}
}
h->base[parent]=root;
}
//对每一个子堆都整合
void build_heap(heap h){
//子堆从最后往前整合
for(int i=h->size/2;i>0;i--){
fix_son(h,i);
}
}
int main(){
//自己建一个无序堆
heap h=init(100);
h->base[1]=5;
h->base[2]=4;
h->base[3]=3;
h->base[4]=2;
h->base[5]=1;
h->size=5;
tra(h);
//整合成最小堆
build_heap(h);
tra(h);
return 0;
}
这篇博客探讨了如何在C语言中构建堆数据结构。文章指出,建立堆和删除堆的过程在实现上具有相似性。
3608





