#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NIL 99999
#define RAND 1000
typedef struct _skew
{
int key;
// int dis;
struct _skew *left;
struct _skew *right;
}skew;
typedef struct _wrapskew
{
struct _wrapskew *next;
skew real;
}wrapskew;
wrapskew global[RAND];
wrapskew *head;
wrapskew *tail;
void skew_init( )
{
int i;
for(i=0;i<RAND-1;i++)
{
global[i].next=&global[i+1];
}
head=&global[0];
tail=&global[RAND-1];
}
skew *mycalloc ( )
{
skew *temp=&head->real;
temp->left=temp->right=NULL;
head=head->next;
return temp;
}
void myfree (skew *node)
{
wrapskew *temp = (wrapskew *)( (int)node- sizeof (wrapskew *) );
temp->next=0;
node->left=node->right=node->key=0;
tail->next=temp;
tail=temp;
return ;
}
skew *newconstruct ( int key)
{
skew *obj=(skew *)mycalloc ( );
obj->key=key;
return obj;
}
/*
skew *nilstruct ( )
{
static skew *obj=NULL;
if (!obj )
{
obj=newconstruct ( NIL);
obj->key=NIL;
obj->dis=0;
}
else
{
}
return obj;
}
*/
skew *skew_adjust ( skew *left)
{
skew *tmp;
/*
if(!left->left)
{
}
else
{
if(left->left->dis>= left->right->dis)
{
left->dis=left->right->dis+1;
return left;
}
}
*/
tmp=left->left;
left->left=left->right;
left->right=tmp;
/*
if(!left->right)
{
left->dis=0;
}
else
{
left->dis=left->right->dis+1;
}
*/
return left;
}
skew * skew_merge ( skew *left ,skew *right)
{
if(!left)
{
return right;
}
if (!right)
{
return left;
}
if (left->key < right->key)
{
left->right=skew_merge ( left->right ,right );
return skew_adjust (left);
}
else
{
right->right=skew_merge ( left ,right->right);
return skew_adjust ( right );
}
}
skew *skew_pop ( skew **head)
{
skew *result=*head;
*head=skew_merge ( result->left ,result->right );
return result;
}
int main()
{
int i;
int skew_count=0;
skew *head=NULL;
skew *newobj=NULL;
skew_init( );
while(1)
{
printf("\n\ninto insert mode\n\n");
while(skew_count < RAND *3/4)
{
i=rand()%RAND;
newobj=newconstruct ( i );
head=skew_merge ( head, newobj );
skew_count++;
}
while(skew_count > RAND *1/3)
{
newobj=skew_pop ( &head);
printf("%d ", newobj->key);
myfree (newobj);
skew_count--;
}
}
}
本文介绍了一种名为偏斜树的数据结构,并提供了其核心操作的C语言实现,包括初始化、节点分配与释放、合并及调整等关键算法。通过随机化插入与删除演示了偏斜树如何保持良好的性能。
3159

被折叠的 条评论
为什么被折叠?



