Resulta que he estado estudiando en la universidad las estructuras de datos en C++, y me gustaría compartirles algunos códigos que he estado haciendo en este tiempo, son códigos más que nada de la escuela. He buscado información al respecto en internet, y la mayoria (por no decir todos) están hechos en C (los que he visto en español), utilizan estructuras con struct y no objetos en C++, así que sirve que alimentamos el internet y el foro .
No les voy a mostrar teoría sobre el tema, eso se los dejo a su búsqueda.
listas.h
#include <iostream>
using namespace std;
#ifndef __LISTAS_H_INCLUDED__
#define __LISTAS_H_INCLUDED__
class Nodo{
private:
int dato;
Nodo *sig;
Nodo *ant;
public:
Nodo(void) { sig = ant = NULL; }
Nodo( int x , Nodo* s = NULL , Nodo* a = NULL )
{
dato = x;
sig = s;
ant = a;
}
// SETTERS
void setDato(int x) { dato = x; }
void setAnt(Nodo *a) { ant = a; }
void setSig(Nodo *s) { sig = s; }
// GETTERS
int getDato() { return dato;}
Nodo *getAnt() { return ant; }
Nodo *getSig() { return sig; }
};
class Lista
{
private:
Nodo *lista; // ancla
public:
Lista(void) { Inicializar(); } // CONSTRUCTOR
// METODOS BASICOS
Nodo *Primero() { return lista; }
Nodo *Siguiente(Nodo *pos) { return pos->getSig(); }
Nodo *Anterior(Nodo *pos) { return pos->getAnt(); }
Nodo *Ultimo() {
Nodo *aux = lista;
if ( !Vacia() ) { while ( aux->getSig() ) { aux = aux->getSig(); } }
return aux;
}
// METODOS DE LA LISTA
void Inicializar() { lista = NULL; }
bool Vacia() { return lista==NULL; }
void Mostrar();
void Insertar(int x, Nodo* pos = NULL);
};
void Lista::Insertar(int x, Nodo* pos)
{
Nodo* aux;
Nodo* temp_n = new Nodo(x);
if ( Vacia() ){
lista = temp_n;
}else{
if ( pos == Primero() ){
aux = Primero();
aux->setAnt(temp_n);
temp_n->setSig(aux);
lista = temp_n;
}else if ( pos == NULL ){
aux = Ultimo();
aux->setSig(temp_n);
temp_n->setAnt(aux);
}else{
aux = Primero();
while ( aux ){
if ( aux == pos ){
Anterior(aux)->setSig( temp_n );
temp_n->setAnt( Anterior(aux) );
temp_n->setSig( aux );
aux->setAnt( temp_n );
}else {
aux = aux->getSig();
}
}
}
}
}
void Lista::Mostrar()
{
Nodo* aux;
Primero();
aux = lista;
if ( !Vacia() ){
while ( aux ){
cout << aux ->getDato();
cout << "\n";
aux = aux ->getSig();
}
}
}
#endif
main.cpp
#include <iostream>
#include "listas.h"
using namespace std;
int main(void)
{
Lista numeros; // Mi lista
char opc; // Opcion del menu
int n; // dato a insertar
do{
cout << "\n \n LISTAS DOBLEMENTE LIGADAS: ";
cout << "\n *- MENU -* ";
cout << "\n 1. AGREGAR A LA LISTA . ";
cout << "\n 2. MOSTRAR LOS DATOS . ";
cout << "\n 3. SALIR . ";
cout << "\n _> ";
cin >> opc;
switch(opc){
case '1':
cout << "\n AGREGANDO DATOS A LA LISTA . ";
cout << "\n INGRESE EL VALOR NUMERICO . ";
cout << "\n _> ";
cin >> n;
numeros.Insertar(n);
cout << " --> < Guardado correctamente > " << endl;
break;
case '2':
if(numeros.Vacia())
{
cout << "\n < No hay registros!. > ";
break;
}
cout << "\n \n DATOS GUARDADOS EN LA LISTA: \n ";
numeros.Mostrar();
break;
case '3':
cout << " - < Saliendo!...... >" << endl;
break;
default:
cout << " - < Opcion incorrecta!, intente de nuevo. >" << endl;
break;
}
}while(opc!='3');
cin.ignore();
return 0;
}
Espero que les sea de utilidad, y son bienvenidas sus criticas y/o comentarios
Zalu2!