左倾堆 C 代码
左倾堆 C 代码
#include "leftheap.h"
#include "fatal.h"
#include <stdlib.h>
struct TreeNode
{
ElementType Element;
PriorityQueue Left;
PriorityQueue Right;
int Npl;
};
PriorityQueue
Initialize( void )
{
return NULL;
}
static PriorityQueue Merge1( PriorityQueue H1, PriorityQueue H2 );
/* START: fig6_26.txt */
PriorityQueue
Merge( PriorityQueue H1, PriorityQueue H2 )
{
/* 1*/ if( H1 == NULL )
/* 2*/ return H2;
/* 3*/ if( H2 == NULL )
/* 4*/ return H1;
/* 5*/ if( H1->Element < H2->Element )
/* 6*/ return Merge1( H1, H2 );
else
/* 7*/ return Merge1( H2, H1 );
}
/* END */
void
SwapChildren( PriorityQueue H )
{
PriorityQueue Tmp;
Tmp = H->Left;
H->Left = H->Right;
H->Right = Tmp;
}
/* START: fig6_27.txt */
static PriorityQueue
Merge1( PriorityQueue H1, PriorityQueue H2 )
{
/* 1*/ if( H1->Left == NULL ) /* Single node */
/* 2*/ H1->Left = H2; /* H1->Right is already NULL,
H1->Npl is already 0 */
else
{
/* 3*/ H1->Right = Merge( H1->Right, H2 );
/* 4*/ if( H1->Left->Npl < H1->Right->Npl )
/* 5*/ SwapChildren( H1 );
/* 6*/ H1->Npl = H1->Right->Npl + 1;
}
/* 7*/ return H1;
}
/* END */
/* START: fig6_29.txt */
PriorityQueue
Insert1( ElementType X, PriorityQueue H )
{
PriorityQueue SingleNode;
/* 1*/ SingleNode = malloc( sizeof( struct TreeNode ) );
/* 2*/ if( SingleNode == NULL )
/* 3*/ FatalError( "Out of space!!!" );
else
{
/* 4*/ SingleNode->Element = X; SingleNode->Npl = 0;
/* 5*/ SingleNode->Left = SingleNode->Right = NULL;
/* 6*/ H = Merge( SingleNode, H );
}
/* 7*/ return H;
}
/* END */
/* START: fig6_30.txt */
/* DeleteMin1 returns the new tree; */
/* To get the minimum, use FindMin */
/* This is for convenience */
PriorityQueue
DeleteMin1( PriorityQueue H )
{
PriorityQueue LeftHeap, RightHeap;
/* 1*/ if( IsEmpty( H ) )
{
/* 2*/ Error( "Priority queue is empty" );
/* 3*/ return H;
}
/* 4*/ LeftHeap = H->Left;
/* 5*/ RightHeap = H->Right;
/* 6*/ free( H );
/* 7*/ return Merge( LeftHeap, RightHeap );
}
/* END */
ElementType
FindMin( PriorityQueue H )
{
if( !IsEmpty( H ) )
return H->Element;
Error( "Priority Queue is Empty" );
return 0;
}
int
IsEmpty( PriorityQueue H )
{
return H == NULL;
}
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《左倾堆 C 代码》
本文地址:http://www.xiupu.net/archives-7839.html
关注公众号:
微信赞赏
支付宝赞赏