|
@@ -92,6 +92,16 @@ balance(Avl **tp, Avl *p)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int
|
|
|
|
+canoncmp(int cmp)
|
|
|
|
+{
|
|
|
|
+ if(cmp < 0)
|
|
|
|
+ return -1;
|
|
|
|
+ else if(cmp > 0)
|
|
|
|
+ return 1;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static int
|
|
static int
|
|
_insertavl(Avl **tp, Avl *p, Avl *r, int (*cmp)(Avl*,Avl*), Avl **rfree)
|
|
_insertavl(Avl **tp, Avl *p, Avl *r, int (*cmp)(Avl*,Avl*), Avl **rfree)
|
|
{
|
|
{
|
|
@@ -106,7 +116,7 @@ _insertavl(Avl **tp, Avl *p, Avl *r, int (*cmp)(Avl*,Avl*), Avl **rfree)
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
ob = (*tp)->bal;
|
|
ob = (*tp)->bal;
|
|
- if((i=cmp(r, *tp)) != 0){
|
|
|
|
|
|
+ if((i=canoncmp(cmp(r, *tp))) != 0){
|
|
(*tp)->bal += i*_insertavl(&(*tp)->n[(i+1)/2], *tp, r, cmp, rfree);
|
|
(*tp)->bal += i*_insertavl(&(*tp)->n[(i+1)/2], *tp, r, cmp, rfree);
|
|
balance(tp, p);
|
|
balance(tp, p);
|
|
return ob==0 && (*tp)->bal != 0;
|
|
return ob==0 && (*tp)->bal != 0;
|
|
@@ -133,7 +143,7 @@ _lookupavl(Avl *t, Avl *r, int (*cmp)(Avl*,Avl*))
|
|
p = nil;
|
|
p = nil;
|
|
while(t != nil){
|
|
while(t != nil){
|
|
assert(t->p == p);
|
|
assert(t->p == p);
|
|
- if((i=cmp(r, t))==0)
|
|
|
|
|
|
+ if((i=canoncmp(cmp(r, t)))==0)
|
|
return t;
|
|
return t;
|
|
p = t;
|
|
p = t;
|
|
t = t->n[(i+1)/2];
|
|
t = t->n[(i+1)/2];
|
|
@@ -169,7 +179,7 @@ _deleteavl(Avl **tp, Avl *p, Avl *rx, int(*cmp)(Avl*,Avl*), Avl **del, void (*pr
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
ob = (*tp)->bal;
|
|
ob = (*tp)->bal;
|
|
- if((i=cmp(rx, *tp)) != 0){
|
|
|
|
|
|
+ if((i=canoncmp(cmp(rx, *tp))) != 0){
|
|
(*tp)->bal += i*_deleteavl(&(*tp)->n[(i+1)/2], *tp, rx, cmp, del, predel, arg);
|
|
(*tp)->bal += i*_deleteavl(&(*tp)->n[(i+1)/2], *tp, rx, cmp, del, predel, arg);
|
|
balance(tp, p);
|
|
balance(tp, p);
|
|
return -(ob!=0 && (*tp)->bal==0);
|
|
return -(ob!=0 && (*tp)->bal==0);
|