elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  lista enlazada ayudita
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: lista enlazada ayudita  (Leído 2,028 veces)
bash

Desconectado Desconectado

Mensajes: 258



Ver Perfil
lista enlazada ayudita
« en: 3 Marzo 2015, 12:50 pm »

Buenas a todos !!
Estoy aprendiedo a crear lista enlazadas simples tengo el siguiente codigo me corre algunas veces y otras mas no,me gustaria que me corrigieran , disculpen la mala ortografia.


Código
  1. #include <cstdlib>
  2. #include <cstdlib>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. class LinkList{
  8.  
  9.    int dat;
  10.    LinkList *nxt;
  11.    public:
  12.    ~LinkList(){
  13.      delete nxt;
  14.    }
  15.  
  16.  
  17.    LinkList(int t =0):dat(t){
  18.          nxt = new LinkList(0);
  19.    }      
  20.    void add(LinkList *ll,int d){
  21.       nxt = ll;
  22.       dat =d;
  23.    }
  24.  
  25.    void Print(){
  26.       while(nxt != NULL)
  27.       {
  28.           cout <<"Dat Value : "<< dat<<std::endl;
  29.           nxt = nxt->nxt;
  30.  
  31.       }    
  32.    }
  33. };
  34.  
  35.  
  36.  
  37.  
  38. int main(int argc, char *argv[])
  39. {
  40.    LinkList f, r1(7), r2(6);
  41.    f.add(&r1,7);
  42.    f.add(&r2,6);
  43.    f.Print();
  44.  
  45.  
  46.    system("PAUSE");
  47.    return EXIT_SUCCESS;
  48. }
  49.  

nxt : is not a type eso dice el compilador



En línea

gracias por responder mis dudas
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: lista enlazada ayudita
« Respuesta #1 en: 3 Marzo 2015, 13:47 pm »

1. Si creas un elemento nuevo no tiene sentido que, este elemento cree otro nuevo, porque este a su vez creará otro nuevo y así hasta el infinito:
Código
  1.   LinkList(int t =0) :dat(t)
  2.   {
  3.         nxt = new LinkList(0);
  4.   }

Lo suyo es que, en este caso, "nxt" no apunte a ningún sitio:

Código
  1.   LinkList(int t =0) :dat(t), nxt(0)
  2.   {
  3.   }

2. También tienes un fallo en el método "add":

Código
  1.   void add(LinkList *ll,int d){
  2.      nxt = ll;
  3.      dat =d;
  4.   }
  5.  

Si añades un elemento no debes modificar el valor del elemento actual, sino añadir un elemento nuevo. ¿Qué sucede si nxt ya apuntaba a un elemento válido? crearás lagunas de memoria y perderás información.

Lo suyo sería que add recibese únicamente uno de los dos parámetros que recibe actualmente, ya que un objeto de tipo LinkList ya tiene el valor que facilitas en 'd':

* Si pasas un objeto de tipo LinkList, la idea es buscar el lugar correcto para insertar el elemento. En este caso 'd' te sobra

* Si pasas el valor de 'd', creas un objeto de tipo LinkList y lo insertas donde mejor te convenga.

3.Y, para terminar, comando "Print":

Código
  1.   void Print(){
  2.      while(nxt != NULL)
  3.      {
  4.          cout <<"Dat Value : "<< dat<<std::endl;
  5.          nxt = nxt->nxt;
  6.  
  7.      }    
  8.   }
  9.  

Si modificas la variable interna "nxt", vuelves a perder información. Si tienes X elementos en la lista y llamas a "Print", después de la llamada "nxt" va a valer 0... has perdido la lista!!!

4.Y, bueno, esto así a bote pronto. Si analizas un poco más en detalle tu código te darás cuenta de que es un poco bizarro. Resulta que LinkList no es realmente una lista enlazada, sino que además representa a cada nodo de la lista.... un poco raro.

Si tu idea es que LinkList represente una lista enlazada de enteros lo suyo sería, bien tener dos objetos diferentes (uno representa la lista y otro los nodos), bien hacer que los diferentes LinkList que van a estar en la lista aprendan a delegar unos de otros:

Opción 1: dos objetos:

Código
  1. #include <cstdlib>
  2. #include <cstdlib>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. struct Node
  8. {
  9.    int value;
  10.    Node* next;
  11.  
  12.    Node( int val )
  13.      : value( val ),
  14.        next( 0 )
  15.    {
  16.    }
  17.  
  18.    ~Node( )
  19.    {
  20.      delete next;
  21.    }
  22. };
  23.  
  24. class LinkList
  25. {
  26.   Node* _first;
  27.  
  28.  public:
  29.  
  30.  ~LinkList( )
  31.  {
  32.    delete _first;
  33.  }
  34.  
  35.  LinkList( )
  36.    : _first( 0 )
  37.  {
  38.  }
  39.  
  40.  void add( int d)
  41.  {
  42.    Node* newNode = new Node( d );
  43.  
  44.    if ( _first == 0 )
  45.      _first = newNode;
  46.    else
  47.    {
  48.      Node* last = _first;
  49.  
  50.      while( last->next )
  51.        last = last->next;
  52.  
  53.      last->next = newNode;
  54.    }
  55.  }
  56.  
  57.  void Print( )
  58.  {
  59.    Node* node = _first;
  60.    while( node != 0 )
  61.    {
  62.      cout <<"Dat Value : " << node->value << std::endl;
  63.      node = node->next;
  64.    }
  65.  }
  66. };
  67.  
  68. int main(int, char **)
  69. {
  70.   LinkList f;
  71.   f.add(7);
  72.   f.add(6);
  73.   f.Print();
  74.  
  75.   system("PAUSE");
  76.   return EXIT_SUCCESS;
  77. }

Opción 2: Objetos enlazados:

Código
  1. #include <cstdlib>
  2. #include <cstdlib>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. class LinkList
  8. {
  9.   LinkList* _next;
  10.   int _value;
  11.  
  12.  public:
  13.  
  14.  ~LinkList( )
  15.  {
  16.    delete _next;
  17.  }
  18.  
  19.  LinkList( int d )
  20.    : _next( 0 ),
  21.      _value( d )
  22.  {
  23.  }
  24.  
  25.  void add( int d )
  26.  {
  27.    if ( _next == 0 )
  28.      _next = new LinkList( d );
  29.    else
  30.      _next->add( d );
  31.  }
  32.  
  33.  void Print( )
  34.  {
  35.    std::cout << "Dat Value : " << _value << std::endl;
  36.  
  37.    if ( _next )
  38.      _next->Print( );
  39.  }
  40. };
  41.  
  42. int main(int, char **)
  43. {
  44.   LinkList f(0);
  45.   f.add(7);
  46.   f.add(6);
  47.   f.Print();
  48.  
  49.   system("PAUSE");
  50.   return EXIT_SUCCESS;
  51. }

Un saludo.


En línea

bash

Desconectado Desconectado

Mensajes: 258



Ver Perfil
Re: lista enlazada ayudita
« Respuesta #2 en: 6 Marzo 2015, 04:06 am »

waoooooo Gracias !!

trabajo nitido aunque tengo una duda o varias

por que este codigo por ejemplo :
Código
  1. void add( int d )
  2.  {
  3.    if ( _next == 0 )
  4.      _next = new LinkList( d );
  5.    else
  6.      _next->add( d );
  7.  }
  8.  

por que  add si agrega 'd' cuando _next != 0 ?
aunque sea basico no entiendo muy bien eso  y lo mismo con 
Código
  1. void Print( )
  2.  {
  3.    std::cout << "Dat Value : " << _value << std::endl;
  4.  
  5.    if ( _next )
  6.      _next->Print( );
  7.  }
  8.  

por que transversa las lista ? o por que los imprime todos ? pense que debia usar un while o un for para recorrer el nodo. disculpen pero estoy confundio y si desean podria darme un referecia donde leer lo hare con gusto (y no importa si esta en ingles o espanol) , gracias . ;)
En línea

gracias por responder mis dudas
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: lista enlazada ayudita
« Respuesta #3 en: 6 Marzo 2015, 08:12 am »

por que este codigo por ejemplo :
Código
  1. void add( int d )
  2.  {
  3.    if ( _next == 0 )
  4.      _next = new LinkList( d );
  5.    else
  6.      _next->add( d );
  7.  }
  8.  

por que  add si agrega 'd' cuando _next != 0 ?

En este caso se supone que vas a crear una lista de elementos tal que (el número entre paréntesis es el valor de ese nodo):

LinkList(0) -> LinkList(10) -> LinkList(34) -> null

Entonces, si tu al primer elemento de la lista le dices que quieres añadir un nuevo valor, éste se ha de añadir al final de la lista. Lo que hace ese código es verificar si el elemento actual es el último de la lista, si es así añade el nuevo elemento a continuación, en caso contrario le pasa el valor al siguiente elemento de la lista... en algún momento un elemento será el final de la lista y el nuevo valor se insertará a continuación.

Es decir, suponiendo la lista que te he puesto antes, y yo llamo a LinkList(0)->add(2) se ejecutarán las siguientes acciones:

* LinkList(0)->_next, que es LinkList(10), no es nulo, por lo que realizo la llamada LinkList(0)->_next->add(10), es decir LinkList(10)->add(10)
* LinkList(10)->_next, que es LinkList(34), no es nulo, ejecuto por tanto LinkList(10)->_next->add(10), es decir, LinkList(34)->add(10)
* LinkList(34)->_next es nulo, por lo que voy a crear un nuevo elemento con valor 2 y hago que _next apunte a dicho elemento: LinkList(34)->_next = LinkList(2)

y lo mismo con 
Código
  1. void Print( )
  2.  {
  3.    std::cout << "Dat Value : " << _value << std::endl;
  4.  
  5.    if ( _next )
  6.      _next->Print( );
  7.  }
  8.  

por que transversa las lista ? o por que los imprime todos ?

Como te he comentado, tienes una colección de objetos LinkList, de tal forma que el primero sabe llegar al segundo, el segundo al tercero y así. Si yo llamo al método "Print" de cualquiera de esos elementos puedo hacer dos cosas:

* Un bucle que recorra todos los elementos desde el actual hasta el final
* Presentar el valor actual y llamar al método "Print" del siguiente elemento (si existe)

En cualquiera de los dos casos se imprimirá la lista al completo. Intenta seguir el código haciéndote un esquema en papel. Te ayudará a entenderlo mejor.

En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con lista enlazada
Programación C/C++
Lain0x 2 3,673 Último mensaje 8 Julio 2011, 13:20 pm
por Valkyr
ayuda...Lista doblemente enlazada
Java
goll9d 2 3,821 Último mensaje 22 Enero 2012, 04:50 am
por goll9d
ayuda con lista doblemente enlazada
Programación C/C++
gibi77 3 3,946 Último mensaje 7 Marzo 2012, 07:47 am
por nirvguy
Ayuda con lista enlazada
Java
netca 2 3,371 Último mensaje 20 Abril 2012, 16:11 pm
por adwind
Ayuda Lista Enlazada
Programación C/C++
robluis 5 5,808 Último mensaje 9 Mayo 2012, 03:49 am
por botella
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines