El esquema de la lista es la siquiente
Head
l
\/
O - O - O - ......................... - O - O - O - NULL
Ahora, cada vez que creo un nodo, lo hago de manera dinamica, sabiendo que no solamente debo borrar la lista cuando termine, si no tambien debo borrar todos los nodos de manera manual, pero no se si estara bien mi forma de borrar.
Todo funciona bien, pero no se si el metodo de eliminacion estara bien , mi objetivo es que se libere todo, y no queden en la memoria cuando termine el programa.
Código
#ifndef LISTA_H #define LISTA_H #include "Nodo.h" class Lista { public: Lista(); Lista(const Lista& orig); virtual ~Lista(); void setHead(int d); Nodo* getHead(); bool isEmpty(); private: Nodo *head; }; #endif /* LISTA_H */
Código
#include "Lista.h" #include "Nodo.h" #include <iostream> using namespace std; Lista::Lista() { head = NULL; } Lista::Lista(const Lista& orig) { } /* * Destructor de la lista. Borra uno por uno todos los Nodos que se asigno de for * ma dinamica. * */ Lista::~Lista() { cout <<"\nBorrando lista, borrando todos los elementos...\n"; Nodo *aux; while(head != NULL){ aux = head->getSiguiente(); //Guardando la posicion del nodo siguiente delete head; //Borrando lo que hay en la posicion de head head = aux; //Head apunta al siguiente del Head anterior } } /* * Funcion que agrega un nuvo Nodo en la lista, colocandolo en la cabeza. */ void Lista::setHead(int d){ Nodo *nuevo = new Nodo(d); if(isEmpty()){ head = nuevo; }else{ nuevo->setSiguiente(head); head = nuevo; } } /* * Funcion que obtiene el primer Nodo de la lista. */ Nodo* Lista::getHead(){ if(isEmpty()){ cout << "\nLa pila esta vacia\n"; }else{ return head; } } /* * Funcion que determina si la lista esta vacia o no lo esta. */ bool Lista::isEmpty(){ if(head == NULL){ return true; }else{ return false; } }
Código
#ifndef NODO_H #define NODO_H class Nodo { public: Nodo(int d); Nodo(const Nodo& orig); virtual ~Nodo(); void setSiguiente(Nodo *s); int getDato(); Nodo* getSiguiente(); private: int dato; Nodo *siguiente; }; #endif /* NODO_H */
Código
#include "Nodo.h" #include <iostream> using namespace std; Nodo::Nodo(int d) { dato = d; siguiente = NULL; } Nodo::Nodo(const Nodo& orig) { } Nodo::~Nodo() { cout <<"\nDestruyendo nodo...\n"; } /* * Funcion que agregar el nodo siguiente */ void Nodo::setSiguiente(Nodo *s){ siguiente = s; } /* * Funcion que obtiene el valor contenido del nodo. */ int Nodo::getDato(){ return dato; } /* * Metodo que obtiene un puntero al siguiente Nodo. */ Nodo* Nodo::getSiguiente(){ return siguiente; }
Código
#include <cstdlib> #include <iostream> #include "Lista.h" #include "Nodo.h" using namespace std; int main(int argc, char** argv) { Lista lista; lista.setHead(10); lista.setHead(9); lista.setHead(8); lista.setHead(7); lista.setHead(6); lista.setHead(5); lista.setHead(4); lista.setHead(3); lista.setHead(2); lista.setHead(1); lista.setHead(0); //Obteniendo el primer nodo de la lista. Nodo *cabeza = lista.getHead(); //Imprimiendo por pantalla los valores contenidos en cada nodo. while(cabeza != NULL){ cout << cabeza->getDato() << endl; cabeza = cabeza->getSiguiente(); } return 0; }