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;
}