Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] listas doblemente enlazadas y nodos

Estas en el tema de listas doblemente enlazadas y nodos en el foro de C/C++ en Foros del Web. tengo el siguiente codigo de c++ usando clases y listas doblemente ligadas. actualmente funciona si lo que deseo insertar adelante/atras son enteros (int) pero ahora ...
  #1 (permalink)  
Antiguo 01/06/2014, 18:44
 
Fecha de Ingreso: junio-2014
Ubicación: Guadalajara
Mensajes: 2
Antigüedad: 9 años, 10 meses
Puntos: 0
Pregunta listas doblemente enlazadas y nodos

tengo el siguiente codigo de c++ usando clases y listas doblemente ligadas.
actualmente funciona si lo que deseo insertar adelante/atras son enteros (int) pero ahora quisiera hacer que funcionara este mismo programa ya sea con char o string, es decir, insertar adelante/atras palabras.
lo compilo en visual studio 2013.


//#include <stdio.h>
//#include <string.h>
//#include <stdlib.h>
#include "stdafx.h"
#include <conio.h>
#include <iostream>
using namespace std;

#pragma once //asegura que el código fuente que lo invoca sea incluido una //única vez

class cNodo
{
private:

cNodo* pSig;
cNodo* pAnt;
float fDato;

public:

void insertar_adelante(float fNuevo);

friend class cLista;
};


void cNodo::insertar_adelante(float fNuevo) //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->fDato = fNuevo;
}



class cLista
{
private:

cNodo Inicio;
cNodo Final;

public:

void insertar_inicio(float Start);
void Insertar_Final(float End);

int Size(); //float??
void Imprimir();

cLista(void);
};


cLista::cLista(void) //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;
}

void cLista::insertar_inicio(float Start)
{
Inicio.insertar_adelante(Start); //inserta un nuevo nodo despues //del nodo inicio
}

void cLista::Insertar_Final(float 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* pNuevoNodo = new cNodo;

pNuevoNodo->pSig = &Final;
pNuevoNodo->pAnt = Final.pAnt;
pNuevoNodo->pAnt->pSig = pNuevoNodo;
Final.pAnt = pNuevoNodo;
pNuevoNodo->fDato = End;

}

int cLista::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* pNodo = Inicio.pSig;
int iContador = 0;

while (pNodo != &Final)
{
iContador++;
pNodo = pNodo->pSig;
}
cout << "numeros guardados: ";
return iContador;

}


void cLista::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* pNodo = Inicio.pSig;

cout << "|| ";
while (pNodo != &Final)
{
cout << pNodo->fDato << " || ";
pNodo = pNodo->pSig;
}
}





int _tmain(int argc, _TCHAR* argv[])
{
cNodo Nodo;
cLista Lista;
int opc, iBool = 0;
float fNumero;

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 >> fNumero;
Lista.insertar_inicio(fNumero);
break;

case 2:cout << endl << "Ingrese un nuevo valor: ";
cin >> fNumero;
Lista.Insertar_Final(fNumero);
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;


_getch();
return 0;
}
  #2 (permalink)  
Antiguo 02/06/2014, 11:50
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: listas doblemente enlazadas y nodos

Hola:

Puesto que no tienes que ordenar los elementos que insertas en la lista, ya que simplemente los colocas en la primera o en la última posición, sólo has de cambiar el tipo del nodo y de las funciones. No tiene nada más.

Eso si, lo suyo es hacer este mismo programa con plantillas.
  #3 (permalink)  
Antiguo 03/06/2014, 03:38
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 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. }
  #4 (permalink)  
Antiguo 07/06/2014, 00:07
 
Fecha de Ingreso: junio-2014
Ubicación: Guadalajara
Mensajes: 2
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: listas doblemente enlazadas y nodos

muchas gracias por el codigo ahora si a terminar los metodos que me hicieron falta

Etiquetas: clases, class, listas, nodos, punteros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:09.