Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: d00ze13 en 18 Diciembre 2013, 19:26 pm



Título: Duda lista con estructuras c++
Publicado por: d00ze13 en 18 Diciembre 2013, 19:26 pm
Estoy estudiando por mi cuenta como hacer listas en c++ con estructuras, y queria pedir a ver si alguien le puede echar un ojo a ver si esta bien hecho, sobretodo si libero bien la memoria de cada nodo creado en la lista.

Pd: Gracias de antemano!

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct nodo {
  5.    int dato;
  6.    nodo *sig;
  7. };
  8.  
  9. void insertar(nodo* &cab, int dato) {
  10.    if (cab == 0) {
  11.        cab = new nodo;
  12.        cab->dato = dato;
  13.        cab->sig = 0;
  14.    }
  15.    else {
  16.        nodo *lista = cab;
  17.        nodo *nuevoNodo = new nodo;
  18.  
  19.        nuevoNodo->dato = dato;
  20.        nuevoNodo->sig = 0;
  21.  
  22.        while (lista->sig != 0) {
  23.            lista = lista->sig;
  24.        }
  25.        lista->sig = nuevoNodo;
  26.    }
  27. }
  28.  
  29. void mostrarNodos(nodo *cab) {
  30.    nodo *lista = cab;
  31.    while(lista != 0) {
  32.        cout << lista->dato << endl;
  33.        lista = lista->sig;
  34.    }
  35. }
  36.  
  37. void borrarNodos(nodo *cab) {
  38.    nodo *lista = cab, *aux;
  39.  
  40.    while (lista->sig != 0) {
  41.        aux = lista->sig;
  42.        lista = aux;
  43.        delete aux;
  44.    }
  45. }
  46.  
  47. int main() {
  48.    nodo *cab = 0;
  49.  
  50.    insertar(cab, 3);
  51.    insertar(cab, 4);
  52.    insertar(cab, 7);
  53.    insertar(cab, 12);
  54.  
  55.    mostrarNodos(cab);
  56.    borrarNodos(cab);
  57.    return 0;
  58. }
  59.  
  60.  


Título: Re: Duda lista con estructuras c++
Publicado por: rir3760 en 19 Diciembre 2013, 03:18 am
* En la función "mostrarNodos" no necesitas de una variable local, en su lugar puedes utilizar el parámetro de la función:
Código
  1. void mostrarNodos(nodo* p)
  2. {
  3.   while (p){
  4.      cout << p->dato << endl;
  5.      p = p->sig;
  6.   }
  7. }

* La función "borrarNodos" esta mal implementada (debe reventar el programa) y solo necesitas de una variable local:
Código
  1. void borrarNodos(nodo* p)
  2. {
  3.   nodo* sig;
  4.  
  5.   while (p){
  6.      sig = p->sig;
  7.      delete p;
  8.      p = sig;
  9.   }
  10. }

Un saludo


Título: Re: Duda lista con estructuras c++
Publicado por: d00ze13 en 19 Diciembre 2013, 15:00 pm
Código
  1. void mostrarNodos(nodo* p)
  2. {
  3.    while (p) {
  4.         cout << p->dato << endl;
  5.         p = p->sig;
  6.    }
  7. }
  8.  

No entiendo una cosa de esta función, en la última vuelta del bucle cuando el nodo p->sig ya apunte a NULL y p al último nodo, si quieres volver a llamar a la función mostrarNodos, no mostraría solo el último dato? (ya que p apunta al último nodo, y debería de apuntar al primer nodo para recorrerlos de principio a fin, no?).

Muchas gracias por tu respuesta!


Título: Re: Duda lista con estructuras c++
Publicado por: rir3760 en 19 Diciembre 2013, 15:34 pm
No entiendo una cosa de esta función, en la última vuelta del bucle cuando el nodo p->sig ya apunte a NULL y p al último nodo, si quieres volver a llamar a la función mostrarNodos, no mostraría solo el último dato? (ya que p apunta al último nodo, y debería de apuntar al primer nodo para recorrerlos de principio a fin, no?).
No porque el parámetro "p" es una variable local.

Cuando se llama a la función:
Código
  1. mostrarNodos(cab);
Esta recibe como argumento el valor almacenado en la variable "cab" (la dirección en memoria del primer elemento de la lista), este se utiliza como valor inicial del parámetro "p" de la mentada función y como es una variable local puedes modificar su valor sin afectar otras partes del programa (si aplicas indirección con "*" o "[]" ya no trabajas con el puntero sino con el objeto apuntado).

Un saludo