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!
#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;
}
* En la función "mostrarNodos" no necesitas de una variable local, en su lugar puedes utilizar el parámetro de la función:
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:
void borrarNodos(nodo* p)
{
nodo* sig;
while (p){
sig = p->sig;
delete p;
p = sig;
}
}
Un saludo
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!
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:
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