数据结构(堆)源码

故事扮演 提交于 2019-12-29 13:14:08
#include <stdio.h>
#define MaxData 200
typedef struct Heap *MaxHeap;
struct Heap{
 int *Elements;//存储堆的数组 
 int size;//当前元素个数 
 int capacity;//堆的最大容量 
}; 
MaxHeap create(int Maxsize){
 MaxHeap H=new Heap;
 H->Elements=new int;
 H->size=0;
 H->capacity=Maxsize;
 H->Elements[0]=MaxData;//定义哨兵,为大于堆中所有可能元素的值
 return H; 
} 
void Insert(MaxHeap H,int item){
 int i;
 if(H->size==H->capacity){
  printf("堆已经满了");
  return; 
 }
 i=++H->size;
 for(;H->Elements[i/2]<item;i=i/2){
  H->Elements[i]=H->Elements[i/2];//让父节点移动下来 
 }
 H->Elements[i]=item;
}
int DeleteMax(MaxHeap H){
 int parent,child;
 int Maxitem,temp;
 if(H->size==0){
  printf("栈为空");
  return 0; 
 }
 Maxitem=H->Elements[1];//取出根节点最大值
 temp=H->Elements[H->size--];//保存最后一个点的值
 for(parent=1;parent*2<=H->size;parent=child){
  child=parent*2;
  if((child!=H->size)&&(H->Elements[child]<H->Elements[child+1])){
   child++;//找到两个儿子中较大的那个 
  }
  if(temp>H->Elements[child]){
   break;//如果最后那个值比左右两边都大直接插入。 
  } 
  else
   H->Elements[parent]=H->Elements[child];
 } 
 H->Elements[parent]=temp;
 return Maxitem;
}
void percdown(MaxHeap H,int p){
 int parent,child;
 int temp=H->Elements[p];
 for(parent=p;parent*2<=H->size;parent=child){
  child=parent*2;
  if((child!=H->size)&&(H->Elements[child+1]>H->Elements[child])){
   child++;
  }
  if(temp>=H->Elements[child]) break;
  else{
   H->Elements[parent]=H->Elements[child];
  }
 }
 H->Elements[parent]=temp;
}
void BuildHeap(MaxHeap H){
 int i;
 for(i=H->size/2;i>0;i--){
  percdown(H,i);//从最后一个节点的父节点开始 
 }
}
int main(){
 MaxHeap H=create(10);
 for(int i=1;i<=10;++i){
  scanf("%d",&H->Elements[i]);
  H->size++;
 }
 BuildHeap(H); 
 for(int i=1;i<=H->size;++i){
  printf("%d ",H->Elements[i]);
 }
 return 0;
} 

From 浙大数据结构网课(用于自己复习)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!