Ejemplo n.º 1
0
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);
	}
}
Ejemplo n.º 2
0
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;
	}
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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);
	}
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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);
	}
}
Ejemplo n.º 7
0
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;
}
Ejemplo n.º 8
0
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;
}