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