tsearch code cleanup

changed the insertion method to simplify the recursion logic and
reduce code size a bit.
This commit is contained in:
Szabolcs Nagy 2015-12-05 21:06:02 +01:00 committed by Rich Felker
parent bc9744763a
commit 8994908b19
1 changed files with 28 additions and 24 deletions

View File

@ -77,31 +77,35 @@ static struct node *find(struct node *n, const void *k,
return find(n->right, k, cmp);
}
static struct node *insert(struct node **n, const void *k,
int (*cmp)(const void *, const void *), int *new)
static struct node *insert(struct node *n, const void *k,
int (*cmp)(const void *, const void *), struct node **found)
{
struct node *r = *n;
struct node *r;
int c;
if (!r) {
*n = r = malloc(sizeof **n);
if (r) {
r->key = k;
r->left = r->right = 0;
r->height = 1;
*new = 1;
if (!n) {
n = malloc(sizeof *n);
if (n) {
n->key = k;
n->left = n->right = 0;
n->height = 1;
}
return r;
*found = n;
return n;
}
c = cmp(k, n->key);
if (c == 0) {
*found = n;
return 0;
}
r = insert(c < 0 ? n->left : n->right, k, cmp, found);
if (r) {
if (c < 0)
n->left = r;
else
n->right = r;
r = balance(n);
}
c = cmp(k, r->key);
if (c == 0)
return r;
if (c < 0)
r = insert(&r->left, k, cmp, new);
else
r = insert(&r->right, k, cmp, new);
if (*new)
*n = balance(*n);
return r;
}
@ -165,11 +169,11 @@ void *tfind(const void *key, void *const *rootp,
void *tsearch(const void *key, void **rootp,
int (*compar)(const void *, const void *))
{
int new = 0;
struct node *n = *rootp;
struct node *update;
struct node *ret;
ret = insert(&n, key, compar, &new);
*rootp = n;
update = insert(*rootp, key, compar, &ret);
if (update)
*rootp = update;
return ret;
}