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); } }