左式堆 C实现

left_heap.h

#ifndef _Left_Heap_H
#define _Left_Heap_H

typedef int Item;
typedef struct Left_Heap{
	
	struct Left_Heap *left;
	struct Left_Heap *right;
	Item item;
	int Npl; 
} *heap;

heap initial(void);
int isEmpty(heap H);
heap merge(heap H1,heap H2);             //驱动例程 
heap insert1(Item it,heap H);
heap deleteMin1(heap H);
static heap merge1(heap H1,heap H2);
static void swapChild(heap H);

#define deleteMin(H) (H=deleteMin1(H))
#define insert(it,H) (H=insert1(it,H))

#endif
 

left_heap.c

#include"left_heap.h"
#include<stdlib.h>
#include<stdio.h>

heap initial(){
	heap H=malloc(sizeof(struct Left_Heap));
	if(H==NULL){
		puts("arrange left_heap fail");
		exit(1);
	}
	H->left=H->right=NULL;
	H->Npl=0;
}

int isEmpty(heap H){
	return H==NULL;	
}

heap merge(heap H1,heap H2){
	if(H1==NULL)
	  return H2;
	else if(H2==NULL)
	  return H1;
	else if(H1->item > H2->item)
	  return merge1(H2,H1);
	else return merge1(H1,H2);
	
}            

heap insert1(Item it,heap H){
	heap H1;
	H1=malloc(sizeof(struct Left_Heap));
	if(H1==NULL){
		puts("arrange left_heap fail");
		exit(1);
	}
	H1->left=H1->right=NULL;
	H1->Npl=0;
	H1->item=it;
	H=merge(H1,H);
	return H;
}

heap deleteMin1(heap H){
	if(H==NULL){
		printf("heap null");
		exit(1);
	}
	heap H1,H2;
	H1=H->left;
	H2=H->right;
	free(H);
	return merge(H1,H2);
	
}

static heap merge1(heap H1,heap H2){
	if(H1->left==NULL)
	  return H2;
	else {
		H1->right=merge(H2,H1->right);
		if(H1->left->Npl < H1->right->Npl)
		  swapChild(H1);
		H1->Npl=H1->right->Npl+1;
	}
	return H1;
}

static void swapChild(heap H){
	heap tmp;
	tmp=H->left;
	H->left=H->right;
	H->right=tmp;
	
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值