Duda lista con estructuras c++

Iniciado por d00ze13, 18 Diciembre 2013, 19:26 PM

0 Miembros y 1 Visitante están viendo este tema.

d00ze13

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 (cpp) [Seleccionar]

#include <iostream>
using namespace std;

struct nodo {
    int dato;
    nodo *sig;
};

void insertar(nodo* &cab, int dato) {
    if (cab == 0) {
        cab = new nodo;
        cab->dato = dato;
        cab->sig = 0;
    }
    else {
        nodo *lista = cab;
        nodo *nuevoNodo = new nodo;

        nuevoNodo->dato = dato;
        nuevoNodo->sig = 0;

        while (lista->sig != 0) {
            lista = lista->sig;
        }
        lista->sig = nuevoNodo;
    }
}

void mostrarNodos(nodo *cab) {
    nodo *lista = cab;
    while(lista != 0) {
        cout << lista->dato << endl;
        lista = lista->sig;
    }
}

void borrarNodos(nodo *cab) {
    nodo *lista = cab, *aux;

    while (lista->sig != 0) {
        aux = lista->sig;
        lista = aux;
        delete aux;
    }
}

int main() {
    nodo *cab = 0;

    insertar(cab, 3);
    insertar(cab, 4);
    insertar(cab, 7);
    insertar(cab, 12);

    mostrarNodos(cab);
    borrarNodos(cab);
    return 0;
}



rir3760

* 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 (cpp) [Seleccionar]
void mostrarNodos(nodo* p)
{
   while (p){
      cout << p->dato << endl;
      p = p->sig;
   }
}


* La función "borrarNodos" esta mal implementada (debe reventar el programa) y solo necesitas de una variable local:
Código (cpp) [Seleccionar]
void borrarNodos(nodo* p)
{
   nodo* sig;
   
   while (p){
      sig = p->sig;
      delete p;
      p = sig;
   }
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

d00ze13

Código (cpp) [Seleccionar]

void mostrarNodos(nodo* p)
{
    while (p) {
         cout << p->dato << endl;
         p = p->sig;
    }
}


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!

rir3760

Cita de: d00ze13 en 19 Diciembre 2013, 15:00 PMNo 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 (cpp) [Seleccionar]
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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language