La función index_node tiene 2 parámetros de entrada: p (nodo padre) y h (nodo hijo). Y tiene la tarea de regresar el índice de h en el arreglo correspondiente del arreglo nodos hijos de p. Esto es, determina si h es hijo de p y cual es el valor del índice. Si este valor es negativo, entonces h no es hijo directo de p.
/* Regresa el indice de un nodo relativo a su padre */
/* [SEPTIEMBRE-1997] */
/* AMILCAR MENESES VIVEROS */
int index_node(node *p, node *h)
{
int i;
for( i = p->nKeys; i>=0; i--)
if ( (p->an[i])==h ) return i;
return -1;
}
La función conectnode se encarga de establecer las ligas entre los dos nodos que tiene como parámetros de entrada.
/* Conecta secuencialmente 2 nodos */
/* [ABRIL-97] */
/* AMILCAR MENESES VIVEROS */
void conectnode(node *n1, node *n2)
{
node *pnext;
pnext = n1->nxt;
n1->nxt = n2;
n2->nxt = pnext;
}
La rutina conecta se encarga de establecer el orden secuencial de los nodos, dependiendo del valor que regrese index_node. Esto es, determina que nodo se conectará al final del primer nodo.
/* Conecta la hoja nd1 y nd2 en forma secuencial */
/* [ABRIL-97] */
/* AMILCAR MENESES VIVEROS */
void concect(node *nd1, node *nd2)
{
node *ndup;
int i1, i2;
ndup = nd1->up;
if ( (i1 = index_node(ndup, nd1)) < 0 ) {
puts("Error en coneccion!!"); exit(1);
}
if ( (i2 = index_node(ndup, nd2)) < 0 ) {
puts("Error en coneccion!!"); exit(1);
}
if (i1 < i2) conectnode(nd1, nd2);
else if (i1 > i2) conectnode(nd2, nd1);
else { puts("Traslape de nodos!!!"); exit(1); }
}