Subversion Repositories PlanixRsrch.SVN

Compare Revisions

Ignore whitespace Rev 316 → Rev 317

/trunk/libmavl/mav.c
1,20 → 1,21
#include <stdio.h>
 
#include "mavl.h"
 
static int
mav_getbal(struct mavlnode *n)
getbal(struct mavlnode *n)
{
return n==NULL ? 0:n->bal;
return n==NULL ? 0 : n->bal;
}
 
static int
recalc(struct mavlnode *n){
int b0,b1;
b0 = mav_getbal( n->s[0] );
b1 = mav_getbal( n->s[1] );
b0 = getbal( n->s[0] );
b1 = getbal( n->s[1] );
return (b1>b0 ? b1 : b0)+1;
 
/* n->bal = n->s[ (mav_getbal(n->s[0])->bal > n->s[1]->bal) ? 0 : 1 ]->bal+1;*/
/* n->bal = n->s[ (getbal(n->s[0])->bal > n->s[1]->bal) ? 0 : 1 ]->bal+1;*/
}
 
/* p p
24,39 → 25,62
* b n 2
* / \ . / \
* 1 2 1
*/
*/
 
/*
2
\
1
\
0
*/
 
/*
* dir = 1 rot left
* dir = 0 rot right
*/
static struct mavlnode *
rot(struct mavlnode *n, struct mavlnode **parent, int dir)
rot(struct mavlnode *n, int dir)
{
*parent = n->s[dir];
n->s[dir]=(*parent)->s[1-dir];
(*parent)->s[1-dir]=n;
recalc(n);
recalc(*parent);
return *parent;
struct mavlnode * r;
r = n->s[dir];
n->s[dir]=r->s[1-dir];
r->s[1-dir]=n;
/* n->bal = recalc(n);*/
/* r->bal = recalc(r);*/
n->bal=0;
r->bal=0;
return r;
}
 
 
static struct mavlnode *
balance ( struct mavlnode *n, struct mavlnode **parent) {
balance ( struct mavlnode *n) {
int b,d;
b = n->s[1]->bal - n->s[0]->bal;
/* b = n->s[1]->bal - n->s[0]->bal;*/
 
/* b = getbal(n->s[1]) - getbal( n->s[0] );*/
 
b = n->bal;
 
if (b>-2 && b<2)
return n;
d = b<0 ? 1:0;
 
printf("should rotate! %d\n",b);
return rot(n,1);
 
/* d = b<0 ? 1:0;
if (n->s[d]->bal - n->s[1-d]->bal == -d/2)
n->s[d]=rot(n->s[d],parent,d);
return rot(n,parent,1-d);
return rot(n,parent,1-d);*/
 
}
 
static struct mavlnode *
mav_insert0(struct mavl *t, struct mavlnode *root, const void **data)
{
struct mavlnode * nnn;
 
int rc,dir;
if (root==NULL){
root = mavlnode_create(t, *data);
65,7 → 89,7
*data = mavlnode_dataptr(root);
/*return MAVL_E_NOMEM;*/
t->count++;
root->bal=1;
root->bal=0;
return root;
}
 
78,11 → 102,15
 
/* rc is > 0 here */
dir = rc>0 ? 1:0;
/* root->bal +=dir;*/ /*recalc(root); */
root->s[dir] = mav_insert0(t, root->s[dir], data);
root->bal = recalc(root);
 
return root;
nnn = balance(root);
printf("Return %p === %p\n",root,nnn);
return balance(nnn);
 
/* return root; */
/* recalc(n);*/
}