link STinsertR(link h, Item item, int height) { int i, j; Key v = key(item); entry x; link t, u; x.key = v; x.ref.item = item; if (height == 0) { for (j = 0; j < h->m; ++j) { if (lesskey(v, h->b[j].key)) { break; } } } if (height != 0) { for (j = 0; j < h->m; ++j) { if ((j+1 == h->m) || lesskey(v, h->b[j+1].key)) { t = h->b[j++].ref.next; u = STinsertR(t, item, height-1); if (u == NULL) { return NULL; } x.key = u->b[0].key; x.ref.next = u; break; } } } for (i = (h->m)++; i > j; --i) { h->b[i] = h->b[i-1]; } h->b[j] = x; if (h->m < M) { return NULL; } else { return STsplit(h); } }
void opt_k(int type, char *s) { PARG parg; switch (type) { case INIT: if (lesskey(s, 0)) { parg.p_string = s; error("Cannot use lesskey file \"%s\"", &parg); } break; } }
link STdeleteR(link h, Key v) { int p = 0; link x; Key t = key(h->item); if (h == z) { return z; } if (lesskey(v, t)) { if (h->l != z) { p = 1; } h->l = STdeleteR(h->l, v); if (h->l != z || (p == 1 && h->l == z)) { --(h->N); } } if (lesskey(t, v)) { if (h->r != z) { p = 1; } h->r = STdeleteR(h->r, v); if (h->r != z || (p == 1 && h->r == z)) { --(h->N); } } if (eqkey(v, t)) { x = h; h = STjoinLR(h->l, h->r); free(x); } return h; }
void STinsertS(link h, Item item) { int i, j; Key v = key(item); for (j = 0; j < h->m; ++j) { if (lesskey(v, key(h->b[j]))) { break; } } for (i = (h->m)++; i > j; --i) { h->b[i] = h->b[i-1]; } h->b[j] = item; if (h->m == M) { printf("Splitting\n"); STsplit(h); } }
Item STsearchR(link h, Key v, int height) { int j; if (height == 0) { for (j = 0; j < h->m; ++j) { if (eqkey(v, h->b[j].key)) { return h->b[j].ref.item; } } } if (height != 0) { for (j = 0; j < h->m; ++j) { if ((j+1 == h->m) || lesskey(v, h->b[j+1].key)) { return STsearchR(h->b[j].ref.next, v, height-1); } } } return NULLitem; }
Item STsearchR(link h, Key v) { Key t; if (h == z) { return NULLitem; } t = key(h->item); if (eqkey(v, t)) { return h->item; } if (lesskey(v, t)) { return STsearchR(h->l, v); } else { return STsearchR(h->r, v); } }
link STinsertR(link h, Item item) { Key v, t; if (h == z) { return NEW(item, z, z, 1); } v = key(item); t = key(h->item); if (lesskey(v, t)) { h->l = STinsertR(h->l, item); } else { h->r = STinsertR(h->r, item); } (h->N)++; return h; }
void STdeleteR(link h, Key v, int height) { int j; if (height == 0) { for (j = 0; j < h->m; ++j) { if (eqkey(v, h->b[j].key)) { h->m -= 1; for (; j < h->m; ++j) { h->b[j] = h->b[j+1]; } return; } } } if (height != 0) { for (j = 0; j < h->m; ++j) { if ((j+1 == h->m) || lesskey(v, h->b[j+1].key)) { return STdeleteR(h->b[j].ref.next, v, height-1); } } } return; }