He hecho una mínima adaptación a tu código para que funcione con plantillas.
Ahora acepta cualquier tipo, sólo has de cambiarlos en main().
Sin embargo, si quieres hacer cosas como una inserción ordenada, para los tipos no fundamentales, como un string, habrías de implementar por ejemplo los operador < e > o los que necesitaras.
Código C++:
Ver original#include <iostream>
#include <string.h>
using namespace std;
//declaracion previa
template <typename TIPO>
class cLista;
template <typename TIPO>
class cNodo
{
private:
cNodo<TIPO>* pSig;
cNodo<TIPO>* pAnt;
TIPO dato;
public:
void insertar_adelante(TIPO Nuevo);
friend class cLista<TIPO>;
};
template <typename TIPO>
void cNodo<TIPO>::insertar_adelante(TIPO Nuevo) //esta funcion crea un nuevo //nodo y su posicion será la siguiente del nodo de inicio en la lista
{
cNodo* pNuevoNodo = new cNodo;
pNuevoNodo->pSig = this->pSig;
pNuevoNodo->pAnt = this;
this->pSig = pNuevoNodo;
pNuevoNodo->pSig->pAnt = pNuevoNodo;
pNuevoNodo->dato = Nuevo;
}
template <typename TIPO>
class cLista
{
private:
cNodo<TIPO> Inicio;
cNodo<TIPO> Final;
public:
void insertar_inicio(TIPO Start);
void Insertar_Final(TIPO End);
int Size(); //float??
void Imprimir();
cLista();
};
template <typename TIPO>
cLista<TIPO>::cLista() //constructor que enlaza los dos nodos creados en la clase; //nodo inicial y nodo final.
{
Inicio.pSig = &Final;
Final.pAnt = &Inicio;
// Inicio.pAnterior = Final.pSiguiente = 0;
// Inicio.iContenido = Final.iContenido = 0;
}
template <typename TIPO>
void cLista<TIPO>::insertar_inicio(TIPO Start)
{
Inicio.insertar_adelante(Start); //inserta un nuevo nodo despues //del nodo inicio
}
template <typename TIPO>
void cLista<TIPO>::Insertar_Final(TIPO End) //Esta función recibe un entero y lo //deposita en un nuevo nodo que se colocará en la posición inmediata anterior al //nodo final.
{
cNodo<TIPO>* pNuevoNodo = new cNodo<TIPO>;
pNuevoNodo->pSig = &Final;
pNuevoNodo->pAnt = Final.pAnt;
pNuevoNodo->pAnt->pSig = pNuevoNodo;
Final.pAnt = pNuevoNodo;
pNuevoNodo->dato = End;
}
template <typename TIPO>
int cLista<TIPO>::Size() //Crea un puntero y lo iguala al nodo siguiente de inicio. Crea //un contador=0. Inicia un ciclo: “mientras que el puntero sea diferente que la //dirección del nodo final” y aumenta al contador en 1 y avanza un nodo hacia //adelante
{
cNodo<TIPO>* pNodo = Inicio.pSig;
int iContador = 0;
while (pNodo != &Final)
{
iContador++;
pNodo = pNodo->pSig;
}
cout << "numeros guardados: ";
return iContador;
}
template <typename TIPO>
void cLista<TIPO>::Imprimir() //Crea un puntero que iguala al nodo siguiente del //nodo inicio. Imprime el contenido de cada nodo evaluando la condición “mientras //que el puntero sea diferente que la dirección del nodo final” y avanza al puntero //un lugar hacia el nodo final.
{
cNodo<TIPO>* pNodo = Inicio.pSig;
cout << "|| ";
while (pNodo != &Final)
{
cout << pNodo->dato << " || ";
pNodo = pNodo->pSig;
}
}
int main(int argc, char* argv[])
{
cNodo<float> Nodo;
cLista<float> Lista;
float dato;
/***cambiar los float por el tipo que se quiera***/
int opc=0;
do
{
cout << "\n";
//cout << "/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/" << endl;
cout << "\n\tElija una opcion\n" << endl;
cout << "[1] Insertar al inicio" << endl;
cout << "[2] Insertar al final" << endl;
cout << "[3] para ver cuantos numeros hay guardados " << endl;
cout << "[4] Imprimir" << endl;
cout << "[5] Salir" << endl << endl;
cout << "Opcion: ";
cin >> opc;
cout << endl;
switch (opc)
{
case 1:
cout << endl << "Ingrese un nuevo valor: ";
cin >> dato;
Lista.insertar_inicio(dato);
break;
case 2:
cout << endl << "Ingrese un nuevo valor: ";
cin >> dato;
Lista.Insertar_Final(dato);
break;
case 3:
cout << Lista.Size();
break;
case 4:
Lista.Imprimir();
break;
case 5:
break;
default:
cout << endl << "Opcion no Välida";
}
cout << endl;
}
while (opc != 5);
cout << "Press enter to exit..." << endl;
return 0;
}