Ver Mensaje Individual
  #3 (permalink)  
Antiguo 03/06/2014, 03:38
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: listas doblemente enlazadas y nodos

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
  1. #include <iostream>
  2. #include <string.h>
  3. using namespace std;
  4.  
  5. //declaracion previa
  6. template <typename TIPO>
  7. class cLista;
  8.  
  9.  
  10. template <typename TIPO>
  11. class cNodo
  12. {
  13. private:
  14.  
  15.     cNodo<TIPO>* pSig;
  16.     cNodo<TIPO>* pAnt;
  17.     TIPO dato;
  18.  
  19. public:
  20.  
  21.     void insertar_adelante(TIPO Nuevo);
  22.     friend class cLista<TIPO>;
  23. };
  24.  
  25.  
  26. template <typename TIPO>
  27. 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
  28. {
  29.     cNodo* pNuevoNodo = new cNodo;
  30.     pNuevoNodo->pSig = this->pSig;
  31.     pNuevoNodo->pAnt = this;
  32.     this->pSig = pNuevoNodo;
  33.     pNuevoNodo->pSig->pAnt = pNuevoNodo;
  34.     pNuevoNodo->dato = Nuevo;
  35. }
  36.  
  37. template <typename TIPO>
  38. class cLista
  39. {
  40. private:
  41.  
  42.     cNodo<TIPO> Inicio;
  43.     cNodo<TIPO> Final;
  44.  
  45. public:
  46.  
  47.     void insertar_inicio(TIPO Start);
  48.     void Insertar_Final(TIPO End);
  49.  
  50.     int Size(); //float??
  51.     void Imprimir();
  52.  
  53.     cLista();
  54. };
  55.  
  56.  
  57. template <typename TIPO>
  58. cLista<TIPO>::cLista() //constructor que enlaza los dos nodos creados en la clase; //nodo inicial y nodo final.
  59. {
  60.     Inicio.pSig = &Final;
  61.     Final.pAnt = &Inicio;
  62. // Inicio.pAnterior = Final.pSiguiente = 0;
  63. // Inicio.iContenido = Final.iContenido = 0;
  64. }
  65.  
  66. template <typename TIPO>
  67. void cLista<TIPO>::insertar_inicio(TIPO Start)
  68. {
  69.     Inicio.insertar_adelante(Start); //inserta un nuevo nodo despues //del nodo inicio
  70. }
  71.  
  72. template <typename TIPO>
  73. 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.
  74. {
  75.     cNodo<TIPO>* pNuevoNodo = new cNodo<TIPO>;
  76.  
  77.     pNuevoNodo->pSig = &Final;
  78.     pNuevoNodo->pAnt = Final.pAnt;
  79.     pNuevoNodo->pAnt->pSig = pNuevoNodo;
  80.     Final.pAnt = pNuevoNodo;
  81.     pNuevoNodo->dato = End;
  82.  
  83. }
  84.  
  85. template <typename TIPO>
  86. 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
  87. {
  88.     cNodo<TIPO>* pNodo = Inicio.pSig;
  89.     int iContador = 0;
  90.  
  91.     while (pNodo != &Final)
  92.         {
  93.             iContador++;
  94.             pNodo = pNodo->pSig;
  95.         }
  96.     cout << "numeros guardados: ";
  97.     return iContador;
  98.  
  99. }
  100.  
  101.  
  102. template <typename TIPO>
  103. 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.
  104. {
  105.     cNodo<TIPO>* pNodo = Inicio.pSig;
  106.  
  107.     cout << "|| ";
  108.     while (pNodo != &Final)
  109.         {
  110.             cout << pNodo->dato << " || ";
  111.             pNodo = pNodo->pSig;
  112.         }
  113. }
  114.  
  115.  
  116. int main(int argc, char* argv[])
  117. {
  118.     cNodo<float> Nodo;
  119.     cLista<float> Lista;
  120.     float dato;
  121.     /***cambiar los float por el tipo que se quiera***/
  122.  
  123.     int opc=0;
  124.  
  125.  
  126.     do
  127.         {
  128.             cout << "\n";
  129.             //cout << "/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/////\\\\\/" << endl;
  130.             cout << "\n\tElija una opcion\n" << endl;
  131.             cout << "[1] Insertar al inicio" << endl;
  132.             cout << "[2] Insertar al final" << endl;
  133.             cout << "[3] para ver cuantos numeros hay guardados " << endl;
  134.             cout << "[4] Imprimir" << endl;
  135.             cout << "[5] Salir" << endl << endl;
  136.             cout << "Opcion: ";
  137.             cin >> opc;
  138.             cout << endl;
  139.  
  140.             switch (opc)
  141.                 {
  142.                 case 1:
  143.                     cout << endl << "Ingrese un nuevo valor: ";
  144.                     cin >> dato;
  145.                     Lista.insertar_inicio(dato);
  146.                     break;
  147.  
  148.                 case 2:
  149.                     cout << endl << "Ingrese un nuevo valor: ";
  150.                     cin >> dato;
  151.                     Lista.Insertar_Final(dato);
  152.                     break;
  153.  
  154.                 case 3:
  155.                     cout << Lista.Size();
  156.                     break;
  157.  
  158.                 case 4:
  159.                     Lista.Imprimir();
  160.                     break;
  161.  
  162.                 case 5:
  163.                     break;
  164.  
  165.                 default:
  166.                     cout << endl << "Opcion no Välida";
  167.                 }
  168.             cout << endl;
  169.         }
  170.     while (opc != 5);
  171.  
  172.     cout << "Press enter to exit..." << endl;
  173.  
  174.     return 0;
  175. }