Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: maunk en 1 Febrero 2014, 22:08 pm



Título: Imprimir una lista enlazada de forma ascendente
Publicado por: maunk en 1 Febrero 2014, 22:08 pm
El algoritmo recorre la lista, pero empieza a imprimir del mayor hacia atrás, se olvida de los números que hay antes, por ejemplo, el input 1 3 2 5 4 lo resuelve devolviendo 5 3 1, como ven se olvida del 4 y del 2, si el número mayor estuviera en la última posición, se olvidaría de todos. Cabe rescatar que la inserción de elementos en la lista se hace al inicio. Adjunto el método, gracias!

string listaSimple::Historial1(){
   stringstream salida;
   nodo *aux=new nodo();
   nodo * aux2=new nodo();
   for(this->nodoActual=this->nodoPrimero;this->nodoActual!=NULL;this->nodoActual=this->nodoActual->getSigNodo()){
    for(aux=this->nodoActual->getSigNodo();aux!=NULL;aux=aux->getSigNodo()){
       if(this->nodoActual->getGanados() < aux->getGanados()){
          aux2=this->nodoActual;
          this->nodoActual=aux;
          aux=aux2;
         }
    }
    salida<<this->nodoActual->toString();    
   }
   return salida.str();
}


Título: Re: Imprimir una lista enlazada de forma ascendente
Publicado por: eferion en 3 Febrero 2014, 09:29 am
Lo primero, etiqueta el código con las etiquetas GeSHi para que sea legible... o encierra el código entre las etiquetas [code = cpp] y [/ code] (sin espacios).

En segundo lugar... ahí solo se ve cómo se imprime la lista... entonces estás asumiendo que tu lista esta bien creada?? me parece una apuesta un tanto arriesgada.

Tercero, this->nodoActual qué sentido tiene?? su uso es totalmente local, al menos en esta función, por lo que no debería ser una variable miembro.

Cuarto, entiendo que estás intentando usar una especie de algoritmo de burbuja para ordenar los resultados... lo que pasa es que tú no pretendes ordenar la lista, solo los resultados.

fíjate en las siguientes líneas de tu código:

Código
  1. for( ..; .. ;this->nodoActual=this->nodoActual->getSigNodo() ){
  2.    // ...
  3.    this->nodoActual=aux;
  4.    // ...
  5.    }
  6.  }
  7. }


Ahí te estás saltando los primeros nodos hasta llegar al mayor de ellos.

Deberías plantearte el crear una lista de resultados y ordenar dichos resultados con este algoritmo en vez de intentar ordenar sobre la marcha.