Exemple #1
0
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);
    }
}
Exemple #2
0
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);
    }
  }
}
Exemple #3
0
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