23-03-2012, 15:31
Y buen, si no te es tanto quilombo subila... yo la tengo para doble enlazada (me lo habían tomado en el parcial Jaja).
//------------------------------------INTERCAMBIA NODOS-------------------------------//
struct nodo *intercambiar (struct nodo **Inicio, char *cadena1, char *cadena2)
{
struct nodo *Actual, *T1, *T2, *Aux1, *Aux2;
//Recorremos la lista desde su primer nodo.
Actual=*Inicio;
while (Actual!=NULL) //Mientras no se llegue el final de la lista...
{
if (comparar (Actual->nombre,cadena1)==0) //Al ser 0, quiere decir que las cadenas son iguales.
{
Aux1=Actual; //Guarda el nodo hallado (actual) en un auxiliar.
break;
}
//Si no encontro el nodo que buscamos se mueve el siguiente nodo.
else Actual=Actual->Siguiente;
}
//Si el primer nodo fue encontrado...
if (Aux1!=NULL)
{
//Recorremos la lista desde su primer nodo.
Actual=*Inicio;
while (Actual!=NULL) //Mientras no se llegue el final de la lista...
{
if (comparar (Actual->nombre,cadena2)==0) //Al ser 0, quiere decir que las cadenas son iguales.
{
Aux2=Actual; //Guarda todo el nodo hallado (actual) en un auxiliar.
break;
}
//Si no encontro el nodo que buscamos se mueve el siguiente nodo.
else Actual=Actual->Siguiente;
}
//Si el segundo nodo fue encontrado...
if (Aux2!=NULL)
{
//Si el primer nodo es el primer elemento...
if (Aux1==*Inicio)
{
//Muevo el segundo nodo al inicio de la lista.
*Inicio=Aux2;
(Aux2->Anterior)->Siguiente=Aux1;
}
//Si el segundo nodo es el primer elemento...
else if (Aux2==*Inicio)
{
//Muevo el primer nodo al inicio de la lista.
*Inicio=Aux1;
(Aux1->Anterior)->Siguiente=Aux2;
}
//Si ninguno de los dos nodos hallados es el primer elemento de la lista.
else
{
(Aux2->Anterior)->Siguiente=Aux1;
(Aux1->Anterior)->Siguiente=Aux2;
}
//Almaceno el puntero que apunta al nodo anterior del primer nodo en una variable
//temporal.
T1 = Aux1->Anterior;
//Muevo el puntero que apunta al nodo anterior del segundo nodo al primer nodo.
Aux1->Anterior = Aux2->Anterior;
//Almaceno el puntero que apunta al nodo siguiente del primer nodo en una variable
//temporal.
T2 = Aux1->Siguiente;
//Si el primer nodo no es el último elemento...
if (Aux1->Siguiente!=NULL)
(Aux1->Siguiente)->Anterior=Aux2;
//Si es el último elemento...
Aux1->Siguiente=Aux2->Siguiente;
//Muevo el puntero que apunta al nodo anterior del primer nodo al segundo nodo.
Aux2->Anterior = T1;
//Si el segundo nodo no es el último elemento...
if (Aux2->Siguiente!=NULL)
(Aux2->Siguiente)->Anterior=Aux1;
//Si es el último elemento...
Aux2->Siguiente=T2;
return *Inicio; //Retorna el lo apuntado por el inicio de la lista.
}
else return NULL; //Retorna el lo apuntado por el inicio de la lista.
}
else return NULL; //Retorna NULL si uno de los nodos no fue encontrado.
}