Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ordenacion de lista de objetos

Estas en el tema de Ordenacion de lista de objetos en el foro de C/C++ en Foros del Web. Hola estaba buscando un metodo para ordenar una lista de objetos. Es decir tengo una lista de libros los quiero ordenar por fecha. He buscado ...
  #1 (permalink)  
Antiguo 07/05/2011, 10:17
 
Fecha de Ingreso: abril-2010
Mensajes: 20
Antigüedad: 14 años
Puntos: 0
Ordenacion de lista de objetos

Hola estaba buscando un metodo para ordenar una lista de objetos. Es decir tengo una lista de libros los quiero ordenar por fecha. He buscado por la web y he encontrado código de metodos como el de burbuja y el quickshort pero no soy capaz de adaptarlos a listas ya que sólo he encontrado codigo para ordenar arrays de numeros. Esta son las clases:

#include "libro.hh"

using namespace std;

class Clibro
{

private:
libro num;
Clibro *anterior;
Clibro *siguiente;

public:
Clibro();
...
~Clibro();

};


#include<iostream>
#include<string.h>

using namespace std;

enum genero { teatro,ensayo,novela };

class libro
{
private:
int codigo;
string titulo;
int anho;
int autor;
string editorial;
genero _Genero;
public:
libro();


...

~libro();
};

Gracias de antemano.
  #2 (permalink)  
Antiguo 07/05/2011, 10:32
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Ordenacion de lista de objetos

¿Por qué no utilizas las listas que viene ya en C++ y tienen un método sort?

Si lo quieres hacer a mano inténtalo con un quicksort, que es fácil con las listas.

Ahora no tengo tiempo pero si más tarde te pongo un ejemplo.
  #3 (permalink)  
Antiguo 07/05/2011, 14:57
 
Fecha de Ingreso: abril-2010
Mensajes: 20
Antigüedad: 14 años
Puntos: 0
Respuesta: Ordenacion de lista de objetos

Pues sí, lo que quiero es hacerlo a mano. Pero no lo doy sacado. Si lo intentas te lo agradeceria. Pero de todas formas gracias por contestar tan rápido. Yo seguiré intentandolo.
  #4 (permalink)  
Antiguo 09/05/2011, 10:04
 
Fecha de Ingreso: abril-2010
Mensajes: 20
Antigüedad: 14 años
Puntos: 0
Respuesta: Ordenacion de lista de objetos

Supongo que te habras olvidado no?¿
  #5 (permalink)  
Antiguo 09/05/2011, 10:34
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Ordenacion de lista de objetos

Lo siento no he tenido tiempo. A ver si en un momento luego lo miro.
  #6 (permalink)  
Antiguo 09/05/2011, 10:38
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Ordenacion de lista de objetos

Un metodo sencillo para hacer seria ir insertandolo en una nueva lista, pero que ese inser los coloque en orden.
Deberias hacer dos metodo, sacar_primero, insertarpororden

El sacar_primero saca el primer elemento de una lista.
insertarpororden iria comparando cada elemento de la lista con el elemento que quieres agregar. Si el objeto a insertar es mayor al de la lista lo comparo con el siguiente.
  #7 (permalink)  
Antiguo 09/05/2011, 10:45
 
Fecha de Ingreso: abril-2010
Mensajes: 20
Antigüedad: 14 años
Puntos: 0
Respuesta: Ordenacion de lista de objetos

Cita:
Iniciado por sam90 Ver Mensaje
Un metodo sencillo para hacer seria ir insertandolo en una nueva lista, pero que ese inser los coloque en orden.
Deberias hacer dos metodo, sacar_primero, insertarpororden

El sacar_primero saca el primer elemento de una lista.
insertarpororden iria comparando cada elemento de la lista con el elemento que quieres agregar. Si el objeto a insertar es mayor al de la lista lo comparo con el siguiente.
Gracias! intentaré por ese metodo, a ver si soy capaz XDD
  #8 (permalink)  
Antiguo 11/05/2011, 13:48
 
Fecha de Ingreso: abril-2010
Mensajes: 20
Antigüedad: 14 años
Puntos: 0
Respuesta: Ordenacion de lista de objetos

uffffff!!! siguo intentandolo de varias maneras y nadaaa! Me estoi volviendo loco. A ver si alguien me puede ayudar.
  #9 (permalink)  
Antiguo 11/05/2011, 13:56
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Ordenacion de lista de objetos

Empeza mostrando lo que estas tratando de hacer.
  #10 (permalink)  
Antiguo 12/05/2011, 07:42
 
Fecha de Ingreso: abril-2010
Mensajes: 20
Antigüedad: 14 años
Puntos: 0
Respuesta: Ordenacion de lista de objetos

Cita:
Iniciado por sam90 Ver Mensaje
Empeza mostrando lo que estas tratando de hacer.
intene hacerlo como dijist pero no lo acabo de entender. Hice este código, pero no lo ordena, sin embargo me parece correcto.

bool Listalibro::ordenaLibros(int cambio)
{
Clibro *nodo,*nodo2,*nodo3,*aux;
libro lib,libr;
rellenarLista(); // con esta funcion meto los libros en la pila
nodo=lista.inicio;
aux=nodo->obtenerSiguiente();
while(aux!=NULL){
lib=nodo->obtenerDato();
nodo2=nodo->obtenerSiguiente();
libr=nodo->obtenerDato();
nodo3=nodo2->obtenerSiguiente();
if(ComparaPorNumero(lib,libr)==0){
if(nodo==lista.inicio){
nodo->modificaSiguiente(nodo3);
nodo3->modificaAnterior(nodo);
lista.inicio=nodo2;
nodo->modificaAnterior(nodo2);
nodo2->modificaSiguiente(nodo);
nodo->modificaAnterior(inicio);
}
else if(nodo3==NULL){
aux=nodo->obtenerAnterior();
nodo2->modificaAnterior(aux);
aux->modificaSiguiente(nodo2);
nodo->modificaAnterior(nodo2);
nodo->modificaSiguiente(NULL);
}
else aux=nodo->obtenerAnterior();
cambio=1;
}
nodo=nodo->obtenerSiguiente();
aux=nodo->obtenerSiguiente();
if(cambio==1) ordenaLibros(0);
else{
escribirFichero(lista);//escrribe la pila en el fichero.
return 1;
}
}
}
  #11 (permalink)  
Antiguo 13/05/2011, 10:29
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Ordenacion de lista de objetos

Código C++:
Ver original
  1. #include <iostream>
  2. #include <string>
  3. enum genero { teatro,ensayo,novela };
  4. using namespace std;
  5.  
  6.  
  7. /*    CLASE LIBRO  */
  8. class libro
  9. {
  10. public:
  11.     int codigo;
  12.     string titulo;
  13.     int anho;
  14.     int autor;
  15.     string editorial;
  16.     genero _Genero;
  17.  
  18.     libro(int c,string t, int ano, int a, string edi,genero g)
  19.     {
  20.         codigo = c;
  21.         titulo = t;
  22.         anho = ano;
  23.         autor = a;
  24.         editorial = edi;
  25.         _Genero = g;
  26.     }
  27.     void printlibro()
  28.     {
  29.         cout<<"codigo: " << codigo << " Titulo: " << titulo << endl;
  30.     }
  31. };
  32.  
  33. /*    CLASE NODOLIBRO  */
  34. class NodoLibro
  35. {
  36. public:
  37.     libro * lib;
  38.     NodoLibro * anterior;
  39.     NodoLibro * siguiente;
  40.     NodoLibro(libro * l)
  41.     {
  42.         lib = l;
  43.         anterior = NULL;
  44.         siguiente = NULL;
  45.     }
  46.     bool compare(const NodoLibro * l)
  47.     {
  48.         if (lib->codigo > l->lib->codigo)
  49.             return true;
  50.         return false;
  51.     }
  52.    
  53.     void changeLibro(NodoLibro * l)
  54.     {
  55.         libro * temp = lib;
  56.         lib = l->lib;
  57.         l->lib =temp;
  58.     }
  59. };
  60.  
  61. /*    CLASE LISTA  */
  62.  
  63. class Lista
  64. {
  65. public:
  66.     NodoLibro * primero;
  67.     NodoLibro * ultimo;
  68.     Lista()
  69.     {
  70.         primero = ultimo = NULL;
  71.     }
  72.     ~Lista()
  73.     {
  74.         NodoLibro * temp = primero, * temp2;
  75.         while (temp != NULL) {
  76.             temp2 = temp->siguiente;
  77.             delete temp;
  78.             temp = temp2;
  79.         }
  80.     }
  81.     void Append(libro * l)
  82.     {
  83.         NodoLibro * n = new NodoLibro(l);
  84.         if (ultimo  == NULL )
  85.             primero = ultimo = n;
  86.         else{
  87.             n->siguiente = NULL;
  88.             ultimo->siguiente = n;
  89.             n->anterior = ultimo;
  90.             ultimo = n;
  91.         }
  92.     }
  93.     libro * Remove ()
  94.     {
  95.         NodoLibro * n = ultimo;
  96.         libro * l = ultimo->lib;
  97.         if (ultimo == primero)
  98.             ultimo = primero = NULL;
  99.         else{
  100.             ultimo = ultimo->anterior;
  101.             ultimo->siguiente = NULL;
  102.         }
  103.         delete n;
  104.         return l;
  105.        
  106.     }
  107.    
  108.     void printlista()
  109.     {
  110.         NodoLibro * temp = primero;
  111.         while (temp != NULL){
  112.             temp->lib->printlibro();
  113.             temp = temp->siguiente;
  114.         }
  115.     }
  116.    
  117.     void OrdenarLista()
  118.     {
  119.         NodoLibro * n1,*n2;
  120.         for (n1 = ultimo; n1 != primero ; n1 = n1->anterior)
  121.             for (n2 = primero; n2 != n1 ; n2 = n2->siguiente)
  122.             {
  123.                 if (n2->compare(n2->siguiente))
  124.                     n2->changeLibro(n2->siguiente);
  125.                    
  126.             }
  127.     }
  128. } ;
  129.  
  130. int main ()
  131. {
  132.     libro * l1 = new libro(1,"mi mundo",2000,4,"edu",teatro);
  133.     libro * l2 = new libro(3,"hello world",2000,4,"edu",teatro);
  134.     libro * l3 = new libro(2,"a la madona",2000,4,"edu",teatro);
  135.     Lista * c = new Lista();
  136.     c->Append(l1);
  137.     c->Append(l2);
  138.     c->Append(l3);
  139.  
  140.     c->printlista();
  141.     cout<<"----------------------------------------------------"<<endl;
  142.     c->OrdenarLista();
  143.     c->printlista();
  144.     delete c;
  145.     cout<<"chauuuu" << endl;
  146.     return 0;
  147.    
  148. }
  #12 (permalink)  
Antiguo 13/05/2011, 16:04
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Ordenacion de lista de objetos

Basándome en el código proporcionado por sam90 voy a poner un intento de ordenación mediante Quicksort.

Código C++:
Ver original
  1. /*    CLASE NODOLIBRO  */
  2. class NodoLibro
  3. {
  4. public:
  5.     libro * lib;
  6.     NodoLibro * anterior;
  7.     NodoLibro * siguiente;
  8.     NodoLibro(libro * l)
  9.     {
  10.         lib = l;
  11.         anterior = NULL;
  12.         siguiente = NULL;
  13.     }
  14.     bool compare(const NodoLibro * l)
  15.     {
  16.         if (lib->codigo > l->lib->codigo)
  17.             return true;
  18.         return false;
  19.     }
  20.    
  21.     void changeLibro(NodoLibro * l)
  22.     {
  23.         libro * temp = lib;
  24.         lib = l->lib;
  25.         l->lib =temp;
  26.     }
  27. };
  28.  
  29. /*    CLASE LISTA  */
  30.  
  31. class Lista
  32. {
  33.  
  34. private:
  35.     NodoLibro * primero;
  36.     NodoLibro * ultimo;
  37.     int distancia(NodoLibro *first, NodoLibro *last){
  38.  
  39.         int i=1;
  40.  
  41.         NodoLibro *ptr = first;
  42.  
  43.         while (ptr != last)
  44.          {
  45.           ptr = ptr->siguiente;
  46.           i++;
  47.          }
  48.  
  49.      return i;
  50.  
  51.     }
  52.  
  53.     void QuicksortAux(NodoLibro *first,NodoLibro *last){
  54.  
  55.      NodoLibro * n1,*n2;
  56.      NodoLibro *pivote=first;
  57.      int longitud = distancia(first,last);
  58.      int i,j;
  59.      if (longitud<=1)
  60.       return;
  61.  
  62.      
  63.      n1 = first;
  64.      n2 = last;
  65.    
  66.          i=1;
  67.      j=longitud;
  68.  
  69.    
  70.      while (i<j){  
  71.  
  72.      while (!n1->compare(pivote) && i<j+1 && i<longitud){
  73.          n1=n1->siguiente;
  74.          i++;
  75.      }
  76.  
  77.       while (n2->compare(pivote) && j>i-1 && j>1){
  78.         n2 = n2->anterior;
  79.         j--;
  80.      }
  81.  
  82.      if (i<j)
  83.       n1->changeLibro(n2);
  84.      }
  85.      
  86.  
  87.      pivote->changeLibro(n2);
  88.    
  89.      if (n2!=first)
  90.       QuicksortAux(first,n2->anterior);
  91.      if (n2!=last)
  92.      QuicksortAux(n2->siguiente,last);
  93.    
  94.     }
  95.  
  96. public:
  97.  
  98.    
  99.     Lista()
  100.     {
  101.         primero = ultimo = NULL;
  102.     }
  103.     ~Lista()
  104.     {
  105.         NodoLibro * temp = primero, * temp2;
  106.         while (temp != NULL) {
  107.             temp2 = temp->siguiente;
  108.             delete temp;
  109.             temp = temp2;
  110.         }
  111.     }
  112.    
  113.     void Append(libro * l)
  114.     {
  115.         NodoLibro * n = new NodoLibro(l);
  116.         if (ultimo  == NULL )
  117.             primero = ultimo = n;
  118.         else{
  119.             n->siguiente = NULL;
  120.             ultimo->siguiente = n;
  121.             n->anterior = ultimo;
  122.             ultimo = n;
  123.         }
  124.     }
  125.     libro * Remove ()
  126.     {
  127.         NodoLibro * n = ultimo;
  128.         libro * l = ultimo->lib;
  129.         if (ultimo == primero)
  130.             ultimo = primero = NULL;
  131.         else{
  132.             ultimo = ultimo->anterior;
  133.             ultimo->siguiente = NULL;
  134.         }
  135.         delete n;
  136.         return l;
  137.        
  138.     }
  139.    
  140.     void printlista()
  141.     {
  142.         NodoLibro * temp = primero;
  143.         while (temp != NULL){
  144.             temp->lib->printlibro();
  145.             temp = temp->siguiente;
  146.         }
  147.     }
  148.  
  149.    
  150.  
  151.    
  152.    
  153.     void OrdenarLista()
  154.     {
  155.         NodoLibro * n1,*n2;
  156.         for (n1 = ultimo; n1 != primero ; n1 = n1->anterior)
  157.             for (n2 = primero; n2 != n1 ; n2 = n2->siguiente)
  158.             {
  159.                 if (n2->compare(n2->siguiente))
  160.                     n2->changeLibro(n2->siguiente);
  161.                    
  162.             }
  163.     }
  164.  
  165.     void Quicksort(){
  166.     if (primero!=ultimo)
  167.      QuicksortAux(primero,ultimo);
  168.     }
  169.  
  170.  
  171.    
  172. } ;


Puede mejorarse mucho, por ejemplo, utilizando otro tipo de ordenación cuando el tamaño de las sublistas sea menor de un número o utilizando una versión iterativa en vez de iterativa.

Última edición por alexg88; 13/05/2011 a las 16:10
  #13 (permalink)  
Antiguo 13/05/2011, 18:57
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Ordenacion de lista de objetos

Muy buena data alexg88. Para seguir aprendiendo...

Etiquetas: lista, objetos, ordenacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:44.