• Miércoles 20 de Noviembre de 2024, 10:20

Autor Tema:  Problema con Lista Enlazada  (Leído 2397 veces)

Daggoth

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Problema con Lista Enlazada
« en: Lunes 26 de Abril de 2010, 18:15 »
0
Hola a todos :beer:

Tengo un problema con una lista enlazada y os puedo asegurar que no se donde esta el error. Os pongo en situacion:

Estoy haciendo un juego en C++ y SDL tipo estrategia pero con unas unidades fijas, es decir, al principio selecciono cuales quiero y ya no puedo aumentar mi ejercito. Para guardar los datos de las unidades estoy usando listas enlazadas con un estructura como la siguiente:
Código: C++
  1.  
  2. struct unidad{
  3.     int x;
  4.     int y;
  5.     int w;
  6.     int h;
  7.     int color;
  8.     int tipoUnidad;
  9.     int numeroUnidad;
  10.     bool movimiento;
  11. };
  12.  
  13. struct ejercitos{
  14.     unidad tropa;
  15.     ejercitos *sig;
  16. };
  17.  
  18.  
Luego en mi codigo inicio mi lista enlazada:
Código: C++
  1.  
  2. void Inicializa(ejercitos *&ejercitoaformar){
  3.  
  4.     unidad tropa;
  5.    
  6.     ejercitoaformar = new ejercitos;
  7.     tropa.color = 6;
  8.     tropa.h = 10;
  9.     tropa.w = 10;
  10.     tropa.movimiento = true;
  11.     tropa.numeroUnidad = 1;
  12.     tropa.tipoUnidad = 1;
  13.     tropa.x = 600;
  14.     tropa.y = 400;
  15.     ejercitoaformar->tropa = tropa;
  16.     ejercitoaformar->sig = 0;
  17. }
  18.  
  19.  
y hasta ahi todo bien y sin errores de ningun tipo, pero cuando mas adelante llamo a otra funcion para añadir las nuevas unidades que voy seleccionado a mi lista, esta por arte de magia aparece vacia, es decir, no tiene nada pese a que unas lineas mas arriba la he inicializado con el codigo que os he puesto.

La funcion de inicializacion y la de añadir nueva unidad estan ambas, junto a otras mas, en un fichero diferente desde el que las llamo pero su cabecera si se encuentra incluida en el fichero llamador. No se porque la lista se vuelve vacia de pronto, no se si al bucle principal del programa tendra algo que ver, no lo se, pero ya no puedo mas, he miraado el codigo, lo he cambiado, lo he vuelto a cambiar, lo he cambiado otra vez y no se que hacer mas.

Cualquier tipo de comentario sera de gran ayuda.
Gracias :good:

N3oDoc

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Problema con Lista Enlazada
« Respuesta #1 en: Sábado 19 de Junio de 2010, 02:32 »
0
Deberías crear una clase y eso no te pasaría, porque inicializas los valores con el costructor.

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Problema con Lista Enlazada
« Respuesta #2 en: Sábado 19 de Junio de 2010, 03:13 »
0
En C++ la única diferencia entre una clase y un struct es la visibilidad de los miembros: A menos que espeficiques otra cosa en un struct todo es público y en una clase todo es privado.

Tal vez sería mejor que uses las bibliotecas std, para este caso la clase vector te sirve para almacenar una lista de N elementos del tipo que quieras.
Documentación (en inglés): http://www.cplusplus.com/reference/stl/vector/

Código: Text
  1.  
  2. #include <stdio.h>
  3. #include <vector>
  4.  
  5. struct unidad
  6. {
  7.     int x;
  8.     int y;
  9.     int w;
  10.     int h;
  11.     int color;
  12.     int tipoUnidad;
  13.     int numeroUnidad;
  14.     bool movimiento;
  15.  
  16.     unidad() : x(600), y(400), w(10), h(10), color(6), tipoUnidad(1), numeroUnidad(1), movimiento(true)
  17.     {
  18.         printf("Creando unidad: 0x%pn", this);
  19.     };
  20.  
  21.     ~unidad()
  22.     {
  23.         printf("Eliminando unidad: 0x%pn", this);
  24.     };
  25. };
  26.  
  27. typedef std::vector<unidad*> Ejercito;
  28.  
  29. void main()
  30. {
  31.     Ejercito v;
  32.     v.push_back(new unidad());
  33.     v.push_back(new unidad());
  34.     v.push_back(new unidad());
  35.     v.push_back(new unidad());
  36.     // Destruir elementos del vector
  37.     Ejercito::iterator it;
  38.     for (it = v.begin(); it != v.end(); it++) delete *it;
  39.  
  40.     unidad u;
  41.     printf("Color de unidad u: %u n", u.color);
  42. }
  43.  
  44.  

N3oDoc

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Problema con Lista Enlazada
« Respuesta #3 en: Domingo 20 de Junio de 2010, 14:03 »
0
Al crear una clase, cuando creas una instancia de dicha clase inicializas los atributos de la clase mediante el constructor de dicha clase. De esta manera solo necesitas implementar un método para modificar dichos atributos cada vez que quieras modificar algun atributo.
Un ejemplo de la clase podría ser la siguiente:

Código: C++
  1.  
  2. //cabecera de la clase Ejercito, archivo Ejercito.hpp
  3. class Ejercito{
  4.    public:
  5.    struct unidad{
  6.      int x;
  7.      int y;
  8.      int w;
  9.      int h;
  10.      int color;
  11.      int tipoUnidad;
  12.      int numeroUnidad;
  13.      bool movimiento;
  14.    };
  15.    typedef unidad TUnidad;
  16.    
  17.    Ejercito();
  18.    ~Ejercito();
  19.    void InsertarUnidad(const TUnidad unidad);
  20.    void EliminarUnidad(const int pos);
  21.    TUnidad VisualizarUnidad();
  22.    int Longitud();
  23.    void CambiarValor(const int pos, const TUnidad unidad);
  24.      
  25.    private:
  26.       struct TNodo{
  27.          TUnidad unidad;
  28.          TNodo *sig;
  29.       };
  30.       typedef TNodo *TLista;
  31.       TLista lista;
  32. };
  33.  
  34.  

//Implementación de los métodos de la clase Ejercito, archivo CEjercito.cpp

Código: C++
  1.  
  2. #include <stdlib.h>
  3. #include "Ejercito.hpp"
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. Ejercito::Ejercito(){
  9.    lista = NULL;
  10. }
  11.  
  12. Ejercito::~Ejercito(){
  13.    TLista ptr;
  14.    while(lista != NULL){
  15.       ptr =lista;
  16.       lista =lista->sig;
  17.       delete ptr;
  18.    }
  19. }
  20.  
  21. void Ejercito::InsertarUnidad(const TUnidad unidad){
  22.    TLista nuevo,ant,ptr;
  23.    nuevo = new TNodo;
  24.    nuevo->sig = NULL;
  25.    nuevo->unidad = unidad;
  26.    if(lista == NULL){ //lista vacia, insertar primero
  27.       lista = nuevo;
  28.    }else{
  29.       ptr = lista;
  30.       ant = NULL;
  31.       while(ptr != NULL && unidad.numeroUnidad > ptr->unidad.numeroUnidad){
  32.          ant = ptr;
  33.          ptr = ptr->sig;
  34.       }
  35.       if(ant == NULL){ //primer nodo
  36.          nuevo->sig = lista;
  37.          lista = nuevo;
  38.       }else{
  39.          ant->sig = nuevo;
  40.          nuevo->sig = ptr;
  41.       }
  42.    }
  43. }
  44.  
  45.  
  46. void Ejercito::EliminarUnidad(const int pos){
  47. {
  48.   TLista ptr,ant;
  49.   int posact = 1;
  50.   bool borrado = false;
  51.   if(lista != NULL){
  52.       if(pos <= Longitud()){
  53.          ptr = lista;
  54.          while(posact != pos){
  55.             ant = ptr;
  56.             ptr = ptr->sig;
  57.             posact++;
  58.          }
  59.          if( pos == 1){ //primera posicion a borrar
  60.             lista = lista->sig;
  61.          }else{
  62.             if(pos == Longitud()){ //ultima posicion
  63.                ant->sig = NULL;
  64.             }else{  //posicion intermedia
  65.                ant->sig = ptr->sig;
  66.             }
  67.          }
  68.          delete ptr;
  69.          borrado = true;
  70.       }
  71.    }
  72.    return borrado;
  73. }  
  74.  
  75. Ejercito::TUnidad Ejercito::VisualizarUnidad(const int pos, bool &ok)
  76. {
  77.    TUnidad unidad;
  78.    TLista ptr;
  79.    int posact = 1;
  80.    ok = false;
  81.    
  82.    if(lista != NULL){
  83.       if(pos <= Longitud()){
  84.          ptr = lista;
  85.          while(posact != pos){
  86.             posact++;
  87.             ptr = ptr->sig;
  88.          }
  89.          ok = true;
  90.          unidad = ptr->unidad;
  91.       }
  92.    }  
  93.    return unidad;
  94. }
  95.  
  96.  
  97. int Ejercito::Longitud()
  98. {
  99.    int longitud = 0;
  100.    TLista ptr;
  101.    ptr = lista;
  102.    while(ptr != NULL){
  103.       ptr = ptr->sig;
  104.       longitud++;
  105.    }  
  106.    return longitud;
  107. }
  108.  
  109. //y el método para modificar los valores de la Unidad podrían ser:
  110.  
  111. void Ejercito::CambiarValor(const int pos, const TUnidad unidad){
  112.    TLista ptr;
  113.    int posact = 1;
  114.    if(l != NULL){
  115.       if(pos > 0 && pos <= Longitud()){
  116.          ptr = lista;
  117.          while(ptr->sig != lista && posact != pos){
  118.             ptr = ptr->sig;
  119.             posact++;
  120.          }
  121.          ptr->unidad= unidad;
  122.       }
  123.    }    
  124. } 
  125.  
  126.