skewheap.h
#ifndef _SKEWHEAP_H_
#define _SKEWHEAP_H_
#define Insert(X,H) (H=Insert((X),H))
struct TreeNode;
typedef struct TreeNode *PriorityQueue;
typedef int ElementType;
PriorityQueue Initialize();
ElementType FindMin(PriorityQueue H);
int IsEmpty(PriorityQueue H);
PriorityQueue Merge(PriorityQueue H1, PriorityQueue H2);
PriorityQueue Insert1(ElementType X, PriorityQueue H);
PriorityQueue DeleteMin(PriorityQueue H);
#endif
skewheap.c
#include<stdio.h>
#include<stdlib.h>
#include"skewheap.h"
struct TreeNode
{
ElementType Element;
PriorityQueue Left;
PriorityQueue Right;
};
PriorityQueue Initialize()
{
PriorityQueue H;
H = (PriorityQueue)malloc(sizeof(TreeNode));
if (H == NULL)
{
printf("FAILURE!\n");
exit(EXIT_FAILURE);
}
H->Left = H->Right = NULL;
H->Element = 0;
return H;
}
ElementType FindMin(PriorityQueue H)
{
if (!H)
return H->Element;
return 0;
}
int IsEmpty(PriorityQueue H)
{
return H->Left == NULL && H->Right == NULL;
}
void SwapChildren(PriorityQueue H)
{
PriorityQueue Temp;
Temp = H->Left;
H->Left = H->Right;
H->Right = Temp;
}
static PriorityQueue Merge1(PriorityQueue H1, PriorityQueue H2)
{
if (H1->Left == NULL)
H1->Left = H2;
else
{
H1->Right = Merge(H1->Right, H2);
SwapChildren(H1);
}
return H1;
}
PriorityQueue Merge(PriorityQueue H1, PriorityQueue H2)
{
if (H1 == NULL)
return H2;
if (H2 == NULL)
return H1;
if (H1->Element < H2->Element)
return Merge1(H1, H2);
else
return Merge1(H2, H1);
}
PriorityQueue Insert1(ElementType X, PriorityQueue H)
{
PriorityQueue SingleNode;
SingleNode = Initialize();
SingleNode->Element = X;
H=Merge(SingleNode, H);
return H;
}
PriorityQueue DeleteMin(PriorityQueue H)
{
PriorityQueue LeftHeap, RightHeap;
if (IsEmpty(H))
{
printf("ERROR!\n");
exit(EXIT_FAILURE);
}
LeftHeap = H->Left;
RightHeap = H->Right;
free(H);
return Merge(LeftHeap, RightHeap);
}