Subversion Repositories PlanixRsrch.SVN

Compare Revisions

Ignore whitespace Rev 328 → Rev 329

/trunk/libmavl/mavl_del.c
25,63 → 25,165
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <string.h>
#include <stdio.h>
 
#include "mavl.h"
 
extern void the_print();
//void the_print(){};
 
static void
mavl_drot2(struct mavlnode *n, struct mavlnode **parent, int dir)
{
 
mavl_rot(n->s[dir],&n->s[dir],1-dir);
//the_print();
mavl_rot(n,parent,dir);
//the_print();
return;
}
 
static int adj_bal(struct mavlnode *n, struct mavlnode **parent, int dir)
 
 
/*
* dir == 0 adj_bal_r
* dir == 1 adj_bal_l
*/
 
static int
adj_bal(struct mavlnode *n, struct mavlnode **parent, int dir, int sdir)
{
 
int sdir = dir ? 1:-1;
if (n->s[dir]->bal == sdir) {
n->bal = 0;
n->s[dir]->bal = 0;
mavl_rot(n, parent, dir);
return 0;
}
int b;
//printf("adj ball called n->sdir-bal:%d dir:%d\n",n->s[dir]->bal,sdir);
if (n->s[dir]->bal == 0) {
n->bal = sdir;
n->s[dir]->bal = -sdir;
mavl_rot(n, parent, dir);
mavl_rot(n, parent,dir);
return 0;
}
if (n->s[dir]->bal == 1) {
if (n->s[dir]->bal == sdir) {
n->bal = 0;
n->s[dir]->bal = 0;
n->s[dir]->s[1-dir]->bal = 0;
mavl_drot(n, parent,dir);
mavl_rot(n, parent,dir);
return 1;
}
return -11; /* that should never happen */
}
 
if (n->s[dir]->bal == -sdir) {
//the_print();
// n->bal = 0;
// n->bal = n->s[dir]->bal; //-sdir;
 
/* if (n->s[1-dir] != NULL)
n->bal = n->s[1-dir]->bal ? 0 : -sdir;
else
n->bal = 0;
*/
// n->s[1-dir]->bal-sdir: 0;
 
 
// n->s[dir]->bal *= (n->s[dir]->s[1-sdir]->bal)*19; //sdir; //sdir*9 ; ok w
 
// n->s[dir]->bal = 999;
//
b = n->s[dir]->s[1-dir]->bal;
 
if (b == 0){
n->s[dir]->bal = 0;
} else if (b == sdir) {
n->s[dir]->bal = 0 ;
} else if (b == -sdir){
n->s[dir]->bal = sdir;
} else{
printf("Kack\n");
exit(0);
}
 
 
n->s[dir]->s[1-dir]->bal = 0; // ok z
 
mavl_drot2(n, parent,dir);
 
{
int l,r;
l = n->s[0] ? 1 : 0;
r = n->s[1] ? 1 : 0;
n->bal = r-l;
}
// n->bal=98;
return 1;
 
// mavl_drot2(n, parent,dir);
//return 0;
n->bal = n->s[dir]->bal; //-sdir;
// mavl_drot2(n, parent,dir);
// return 0;
n->s[dir]->bal = 0; //n->s[dir]->bal*-1;
//mavl_rot(n->s[dir],&n->s[dir],1-dir);
// n->bal = 0; //-sdir;
n->s[dir]->s[1-dir]->bal = 0; //-1* n->s[dir]->s[1-dir]->bal; //0;
//mavl_rot(n->s[dir],&n->s[dir],dir);
mavl_drot2(n, parent,dir);
return 0;
return 1;
}
 
printf("BAX\n");
exit(0);
}
 
 
static int
adj_bala(struct mavlnode *n, struct mavlnode **parent, int dir, int sdir)
{
 
int b;
if (n->s[dir]->bal == sdir) {
n->bal = 0;
n->s[dir]->bal = 0;
mavl_rot(n, parent,dir);
return 0;
}
b = n->s[dir]->s[1-dir]->bal;
if (b==-sdir){
n->bal = 0;
n->s[dir]->bal = sdir;
}else if (b==sdir){
n->bal = -sdir;
n->s[dir]->bal = 0;
}else{
n->bal = 0;
n->s[dir]->bal = 0;
}
 
n->s[dir]->s[1-dir]->bal = 0;
mavl_drot(n, parent,dir);
return 0;
 
}
 
static int
mavl_del_lo(struct mavl * t, struct mavlnode **parent, void *data)
{
struct mavlnode *n = *parent;
 
/* walk down left */
if (n->s[0]) {
int dir=0,sdir;
int bal = mavl_del_lo(t, &n->s[0], data);
n->bal += bal;
if (n->bal == 1) {
sdir = dir ? 1:-1;
n->bal -= bal*sdir;
if (n->bal == -sdir)
return 0;
if (n->bal == -2*sdir){
bal = adj_bal(n,parent,1-dir,-sdir);
if (bal == 99)
return 0;
return bal;
}
if (n->bal != 2)
return bal;
/* adj_bal_l(n, parent);*/
return 0;
return bal;
}
 
/* found the lowest element */
 
*parent = n->s[1];
(void) memcpy(data,mavlnode_dataptr(n),t->data_size);
122,38 → 224,51
}
 
/* node has two children */
 
if (t->del) {
t->del(mavlnode_dataptr(n));
}
t->count--;
bal = mavl_del_lo(t,&n->s[1], mavlnode_dataptr(n));
n->bal -= bal;
if (n->bal == -1)
dir = 1;
sdir = dir ? 1:-1;
n->bal -= bal*sdir;
if (n->bal == -sdir)
return 0;
 
if (n->bal != -2)
if (n->bal == -2*sdir){
bal = adj_bal(n,parent,1-dir,-sdir);
if (bal == 99 )
return 0;
return bal;
}
return bal;
 
return adj_bal(n, parent,1);
 
}
 
dir = rc < 0 ? 0 : 1;
sdir = dir ? -1:1;
 
if (!n->s[dir]){
exit(0);
}
 
bal = mavl_del0(t, &n->s[dir], data);
if (bal == 2)
return 2;
n->bal += bal*sdir;
if (n->bal == sdir)
sdir = dir ? 1:-1;
n->bal -= bal*sdir;
if (n->bal == -sdir)
return 0;
 
if (n->bal != 2*sdir)
if (n->bal == -2*sdir){
bal = adj_bal(n,parent,1-dir,-sdir);
if (bal == 99 )
return 0;
return bal;
}
return bal;
 
return adj_bal(n, parent,1-dir);
/* return adj_bal(n, parent,1-dir,bal);*/
 
 
 
 
}