rendered paste bodystruct imaginaria
{
struct Doctor* doc;
struct imaginaria* sig;
};
void reatar_doctores(struct Doctor* doc)
{
struct imaginaria* head = NULL;
if(doc)
{
reatar_doctores(doc->izq);
reatar_doctores(doc->der);
copiarlista(doc,&head);
reenlazarlista(&head);
desunirenlaces(&doc);
}
}
void desunirenlaces(struct Doctor** doc)
{
if(!(*doc))
{
/* Recursividad Post-Orden */
desunirenlaces(&(*doc)->izq);
desunirenlaces(&(*doc)->der);
(*doc)->ant=NULL;
}
}
void reenlazarlista(struct imaginaria** base)
{
struct Doctor *aux = NULL, *aux1 = NULL, *aux2 = NULL, *aux3 = NULL;
struct imaginaria* raiz = NULL;
raiz =* base;
while(raiz)
{
aux = raiz->doc;
aux1 = raiz->sig->doc;
aux2 = raiz->sig->sig->doc;
aux3 = raiz->sig->sig->sig->doc;
/* Verifica que si hay un izquierdo y no un derecho. */
if(((aux1->izq == aux) && (!(aux2->der == aux))) && ((((aux1->izq) == aux))))
{
raiz->sig->sig->doc->ant = raiz->doc;
}
/* Enlazo con izquierdo m‡s cercano */
if((aux2->izq == aux) && (!(aux3->der == aux)) && (aux2->izq == aux))
{
raiz->sig->sig->sig->doc->ant = raiz->doc;
}
raiz = raiz->sig;
}
}
void copiarlista(struct Doctor* doc, struct imaginaria** head)
{
struct imaginaria* nueva = NULL;
nueva = (struct imaginaria*) malloc(sizeof(struct imaginaria));
nueva->sig = NULL;
nueva->doc = doc;
hacerlista(&(*head), nueva);
}
void hacerlista(struct imaginaria** head, struct imaginaria* nueva)
{
struct imaginaria* aux = *head;
/* Si no existe cabeza, "nueva" pasar‡ a ser ella */
if (!(*head))
{
*head = nueva;
} else {
while(aux)
{
/* agregamos al final de la lista, para esto, la recorremos */
if(!aux->sig)
{
aux->sig = nueva;
aux = nueva;
}
aux = aux->sig;
}
}
}