Listas enlazadas, nodos y pilas en C++

Iniciado por Raxis, 2 Mayo 2011, 20:46 PM

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

Raxis

Un saludo para todos.

Soy estudiante de primer año en Ingenieria de Sistemas y debo desarrollar en programación orientada a objetos un ejercicio en C++ que consiste en crear una clase Lista, una clase Nodo y una clase Pila.

Se debe hacer con asignación dinámica de memoria y estas clases las debo utilizar en la implementación de otro programa; pero no se como funciona realmente la Pila, como se crean Listas enlazadas y como se crea un nodo.

Que atributos y métodos deberían tener cada una de estas clases.

Agradezco la ayuda que me puedan brindar.

Acermax

Para saber como funciona una pila o una lista te recomiendo que te leas los apuntes, no es nada complicado de entender, pero si tal vez tedioso de explicar en un foro...

Respecto a los métodos que tiene cada clase...

Una pila debería tener un Push (T) que apile en el tope el objeto T, un Pop() que lo borre, un TOP() que te devuelva el valor del tope, un Empty() que te diga si está vacía... y más cosas que puedas querer añadir tu, eso es a tu gusto o a la necesidad del ejercicio.

La clase nodo si la entiendes de los apuntes no tiene mucho tema, debería tener 2 ó 3 objetos dependiendo de como vayas a usar las listas, 2 que guardaran punteros al anterior y al siguiente de la lista y otro con el valor guardado en la lista.

Y la lista basada en los nodos como explique arriba... Las listas stl normalmente se basan en iteradores, pero no sé si vosotros los quereis usar. Lo normal es un begin() que te devuelve referencia a la primera posicion, un end() con la ultima, un empty() que te dirá si está vacía, un clear() que te la limpia... Pero basicamente el funcionamiento debería ser del iterador que lo recorre, o que te dice el elemento actual y demas.

Raxis

#2
CitarEste es parte del código que he desarrollado. No he cargado las otras clases, pero en esta parte me está generando error. Vehiculos es la superclase, al programa se le ingresan varios tipos de vehículos. Luego, cuando se ejecuta el método sacar -(eliminarElementoPorDato) en Lista.cpp - saca bien todos los vehículos pero el primero no lo sacaGracias por la ayuda.

NOTA: ALGUNOS CÓDIGOS SE DESCONFIGURABAN AL USAR code=cpp por eso me tocó quitarlo de algunos de estos archivos cargados.

Acermax, no te entendí lo de leer los apuntes para saber el funcionamiento de la pila. ¿Dónde encuentro los apuntes?


Nodo.h
Código (cpp) [Seleccionar]



#ifndef NODO_H
#define NODO_H

#include "Vehiculos.h"

class Nodo
{
private:
Nodo *siguiente;
Vehiculos *dato;
public:
Nodo(Vehiculos*,Nodo* =0);
~Nodo();
Vehiculos * verDato();
Nodo * verSiguiente();
void modificarSiguiente(Nodo *);

};
#endif




Nodo.cpp

Código (cpp) [Seleccionar]

#include "Nodo.h"
Nodo::Nodo(Vehiculos* dato,Nodo* siguiente)
{
this->siguiente=siguiente;
this->dato=dato;
}

Nodo::~Nodo()
{
if(siguiente!=0)
delete siguiente;

if(dato!=0)
delete dato;
}

Vehiculos *Nodo::verDato()
{
return dato;
}

Nodo * Nodo::verSiguiente()
{
return siguiente;
}

void Nodo::modificarSiguiente(Nodo * siguiente)
{
this->siguiente = siguiente;
}



Lista.h



#ifndef __CLASSLista
#define __CLASSLista

#include "Nodo.h"
#include <string.h>

using namespace std;

class Lista
{
   protected:
       Nodo* cabeza;
       int tama;
       
   public:
       Lista();
       bool existeElemento(string elemento);
       virtual void agregarNodo();
       virtual void agregarNodo(Nodo*);
       void imprimirLista();
       int numeroNodos();
       void eliminarElementoPorPosicion(int posicion);
void eliminarElementoPorDato(const string&);
       bool listaVacia();
Lista& operator<<(Nodo*);
Nodo * operator[](int);
       
   };

#endif




Lista.cpp

Código (cpp) [Seleccionar]


#include "Lista.h"
#include "Carro.h"
#include "Furgoneta.h"
#include "Camion.h"
#include "Moto.h"
using namespace std;

Lista::Lista()
{
//aqui es cabeza = 0 y tama = o
       cabeza = 0;
       tama = 0;
}

bool Lista::existeElemento(string dato)
{
Nodo *actual = cabeza;

while(actual!=0)
if(actual->verDato()->verPlaca()==dato)
return true;
else
actual = actual->verSiguiente();

return false;
}
int tipos()
{
int tipo;
cout<<"Seleccione el tipo de vehiculo"<<endl;
cout<<"1 Carro"<<endl;
cout<<"2 Moto"<<endl;
cout<<"3 Furgoneta"<<endl;
cout<<"4 Camion"<<endl;
cin>>tipo;
return tipo;
}
void Lista::agregarNodo()
{
string placa,color,marca,modelo;
cout<<"Ingresar placa del auto"<<endl;
cin>> placa;
cout<<"Ingresar color del auto"<<endl;
cin>> color;
cout<<"Ingresar marca del auto"<<endl;
cin>> marca;
cout<<"Ingresar modelo del auto"<<endl;
cin>> modelo;
Vehiculos * vehiculo;
switch(tipos())
{
case 1: vehiculo = new Carro(placa,color,marca,modelo);break;
case 2: vehiculo = new Moto(placa,color,marca,modelo);break;
case 3: vehiculo = new Furgoneta(placa,color,marca,modelo);break;
case 4: vehiculo = new Camion(placa,color,marca,modelo);break;
default:
cout<<"Tipo de vehiculo desconocido.\nVehiculo no agregado!"<<endl;
return;
}
agregarNodo(new Nodo(vehiculo));
}

Lista& Lista::operator<<(Nodo* dato)
{
if(cabeza==0) cabeza = dato;

Nodo *actual = cabeza;

for(int i=1; i<tama;i++)
actual = actual->verSiguiente();

actual->modificarSiguiente(dato);

tama++;

return *(this);
}

Nodo * Lista::operator[](int posicion)
{
Nodo *actual = cabeza;

for(int i=0; i>posicion-1; i++)
actual=actual->verSiguiente();

actual->modificarSiguiente(actual->verSiguiente()->verSiguiente());

return actual;

}

void Lista::agregarNodo(Nodo*dato)
{
if(cabeza==0) cabeza = dato;

Nodo *actual = cabeza;

for(int i=1; i<tama;i++)
actual = actual->verSiguiente();

actual->modificarSiguiente(dato);

tama++;
}
void Lista::imprimirLista()
{
Nodo *actual = cabeza;
Vehiculos * vehiculoActual;

while(actual!=0)
{
vehiculoActual = actual->verDato();
cout<<vehiculoActual->verPlaca()<<'\t';
cout<<vehiculoActual->verTipo()<<'\t';
cout<<vehiculoActual->verColor()<<'\t';
cout<<vehiculoActual->verMarca()<<'\t';
cout<<vehiculoActual->verModelo()<<'\t';
cout<<endl;
actual = actual->verSiguiente();
}
}

int Lista::numeroNodos()
{       
return  tama; //solo dice return tama;
}

void Lista::eliminarElementoPorDato(const string& dato)
{
Nodo *anterior=0,*actual = cabeza;

while(actual!=0)
{
if( (actual->verDato()->verPlaca()==dato) && (anterior!=0) )
{
anterior->modificarSiguiente(actual->verSiguiente());

tama--;
return;
}

anterior = actual;
actual=actual->verSiguiente();

}
}

void Lista::eliminarElementoPorPosicion(int posicion)
{
Nodo *actual = cabeza;

for(int i=0; i>posicion-1; i++)
actual=actual->verSiguiente();

actual->modificarSiguiente(actual->verSiguiente()->verSiguiente());

tama--;
}

bool Lista::listaVacia()
{
if(tama==0)
return true;

return false;
}




Pila.h



#ifndef __CLASSPila
#define __CLASSPila

#include "Lista.h"
#include "Nodo.h"
#include "Vehiculos.h"


using namespace std;

class Pila:public Lista
{
   public:
       Pila();
       bool pilaVacia();
       Vehiculos* obtenerTope();  
       void desapilar(int);
       void imprimirPila();

};

#endif



Pila.cpp

Código (cpp) [Seleccionar]


#include "Pila.h"
using namespace std;

Pila::Pila():Lista()
{

}

bool Pila::pilaVacia()
{
return listaVacia();
}

Vehiculos* Pila::obtenerTope()
{
Nodo * actual = cabeza;

while(actual->verSiguiente()!=0)
actual=actual->verSiguiente();

return actual->verDato();
}

void Pila::imprimirPila()
{
imprimirLista();
}  

void Pila::desapilar(int posicion)
{
eliminarElementoPorPosicion(posicion);
}