static void rearrange (BTree* a, int pos) { if (pos==a->n) /* convert child index into key index */ pos--; BTree* left = a->p[pos]; BTree* right = a->p[pos+1]; if (left->n + right->n + 1 >= a->ordem) { /* redistribute */ while (underflow( left )) { addright(left, left->n, a->k[pos], right->p[0]); a->k[pos] = right->k[0]; delleft(right, 0); } while (underflow(right)) { addleft(right, 0, a->k[pos],left->p[left->n]); a->k[pos] = left->k[left->n-1]; delright(left, left->n-1); } } else { /* concatenate */ addright(left ,left->n,a->k[pos],right->p[0]); for (int i=0; i<right->n; ++i) addright(left, left->n, right->k[i], right->p[i+1]); free(right); delright(a, pos); } }
static void insert (BTree* a, int x) { int pos; findpos(a,x,&pos); /* insere mesmo se ja existir */ if (isleaf(a)) { addright(a,pos,x,NULL); } else { insert( a->p[pos], x ); if (overflow(a->p[pos])) { int m; BTree* b = split(a->p[pos],&m); addright(a,pos,m,b); } } }
void listput(double val, int k) { if (val <= now->v) { while (val <= now->v && now != first) now = now->l; if (now == first && val <= now->v) addfirst(val,k); else addright(val,k); } else { while (val > now->v && now != last) now = now->r; if (now == last && val > now->v) addlast(val,k); else addleft (val, k); } } // listput