Eso te tomaron en un parcial?
que hdps..
Yo habia hecho esto para simple, pero vos ya lo hiciste para doble enlazada
El metodo de ordenamiento lo invente yo, con burbuja te va a andar mucho mejor
void s_swap (nodo **lista, int pos1, int pos2) {
nodo *ant1, *nodo1, *ant2, *nodo2, *aux;
int i=0,j=0;
ant1=NULL;
nodo1=*lista;
if (pos1==pos2) {
printf ("\nSe ha indicado el mismo nodo. No se realiza ningun intercambio.");
return;
}
while (nodo1!=NULL && i<(pos1-1)) {
ant1=nodo1;
nodo1=nodo1->sig;
i++;
}
if (nodo1==NULL) {
printf ("\nNo hay ningun nodo que contenga el dato indicado.");
return;
}
ant2=NULL;
nodo2=*lista;
while (nodo2!=NULL && j<(pos2-1)) {
ant2=nodo2;
nodo2=nodo2->sig;
j++;
}
if (nodo2==NULL) {
printf ("\nNo hay ningun nodo que contenga el dato indicado.");
return;
}
printf ("\npos1 %d dato1 %d -- pos2 %d dato2 %d\n", pos1,nodo1->dato,pos2,nodo2->dato);
if (pos2<pos1) { /** Caso de que nodo2 quede posicionado delante de nodo1 */
aux=nodo1;
nodo1=nodo2;
nodo2=aux;
aux=ant1;
ant1=ant2;
ant2=aux;
}
if (nodo1->sig==nodo2) { /** Nodos a intercambiar pegados entre si */
aux=nodo2->sig; /** Almaceno la posicion del elemento siguiente al nodo2 que se perdera en los intercambios */
if (ant1==NULL)
(*lista)=nodo2; /** Intercambiar primer nodo */
else
ant1->sig=nodo2;
nodo2->sig=nodo1;
nodo1->sig=aux;
return; /** Importante: si no vuelve al main, se cumple la condicion de abajo */
}
if (nodo1->sig!=nodo2) {
aux=nodo2->sig; /** Almaceno la posicion del elemento siguiente al nodo2 que se perdera en los intercambios */
if (ant1==NULL)
(*lista)=nodo2; /** Intercambiar primer nodo */
else
ant1->sig=nodo2;
nodo2->sig=nodo1->sig;
ant2->sig=nodo1;
nodo1->sig=aux;
return;
}
}
//***********************************************************************************************************************//
void ordenar (nodo **lista) {
nodo *ant,*act, *temp;
if ((*lista)==NULL) {
printf ("\nNo hay elementos en la lista.");
return;
}
while (1) {
temp=*lista;
int n=1;
ant=(temp);
act=(temp)->sig;
while ((act!=NULL) && ((ant->dato)<=(act->dato))) {
ant=act;
act=act->sig;
n++; /** n indica ant, n+1 act */
}
if (act==NULL){ /** llego al final de la lista, la lista esta ordenada */
return;
}
s_swap (lista, n, n+1);
}
printf ("\nError!");
}
//***********************************************************************************************************************//