Ver Mensaje Individual
  #21  
Antiguo 03-12-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 14
aguml Va por buen camino
Bueno, el uso de una lista auxiliar no era eficiente porque hay varias iteraciones y por el uso doble de memoria así que despues de mucho darle vueltas y mucha ayuda para entender como hacerlo con punteros he conseguido hacerlo intercambiando los punteros de la lista:

Código PHP:
//Intercambia el contenido de dos elementos de la lista y nos devuelve el puntero al primero
//Hay que hacer que los punteros sig apunten adonde deben ya que si no es así la lista se
//rompería. Para eso uso sigAux para, una vez intercambiados los elementos, intercambiar
//sus punteros sig
Elemento * Swap(Elemento *primero, Elemento *segundo)
{
   
Elemento *aux, *sigAux;

   
aux = primero;
   
sigAux = segundo->sig;
   
primero = segundo;
   
segundo = aux;
   
segundo->sig = sigAux;
   
primero->sig = segundo;

   return 
primero;
}
//-----------------------------------------------------------------------------

//Ordena el contenido de la lista
void OrdenarLista(Lista *lista)
{
   
int i,j;
   
Elemento *actual, *anterior;

   for (
i=1; i < lista->nElementos; i++)
   {
      for (
j=0, actual = lista->inicio, anterior = NULL; j < lista->nElementos-(i); j++, actual = actual->sig)
      {
         if (
actual->indice >= actual->sig->indice)
         {
            
//Si el elemento actual es el primero de la lista pongo al que apunta el puntero
            //sig del actual como inicio ya que serán intercambiados
            
if(actual == lista->inicio)
               
lista->inicio = actual->sig;

            
//Si el puntero sig de actual es el mismo que el fin de la lista pongo al actual
            //como fin ya que voy a intercambiarlos
            
if(actual->sig == lista->fin)
               
lista->fin = actual;

            
//Intercambio los elementos
            
actual = Swap(actual,actual->sig);

            
//Si anterior es igual a NULL será porque actual es el primer elemento de la lista
            //y por lo tanto no existe un elemento anterior
            //Si no es NULL actualizo el puntero sig del elemento anterior al nuevo elemento
            //actual despues del intercambio
            
if(anterior != NULL)
               
anterior->sig = actual;
         }
         
//Guardo el puntero al elemento actual para la siguiente pasada
         
anterior = actual;
      }
   }
} 
Espero que al menos le sirva a alguien tanto esfuerzo jejeje.
Responder Con Cita