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

insertar una cadena en una lista

Estas en el tema de insertar una cadena en una lista en el foro de C/C++ en Foros del Web. quisiera saber como puedo insertar una cadena de caracteres en una lista en c++, intente de esta forma pero me da un error con la ...
  #1 (permalink)  
Antiguo 12/05/2015, 22:39
Avatar de Cardo2095  
Fecha de Ingreso: marzo-2015
Ubicación: En mi casa
Mensajes: 18
Antigüedad: 9 años, 8 meses
Puntos: 0
Información insertar una cadena en una lista

quisiera saber como puedo insertar una cadena de caracteres en una lista en c++, intente de esta forma pero me da un error con la dirección de memoria a la hora de insertar la cadena

Código PHP:
void main(){

Lista <char> *l1;
char cad[50];
int tam;

    
    
cout << "Escriba la Notacion Infija a Convertir en Prefija" << endl;
    
cin >> cad;
    
tam strlen(cad);

    for (
int i 0<= tam;i++){
        
l1->Insertar(cad[i]);//aqui me tira un error con la variable cad[i]
    
}


este es el metodo de insertar que tengo:

Código PHP:
Ver original
  1. template <class T>
  2. void Lista <T>::Insertar(T *pDato){
  3.  
  4.     Nodo<T>* nodo = new Nodo<T>(pDato);
  5.     actual = primero;
  6.  
  7.     if (Vacio()){
  8.         primero = nodo;
  9.     }
  10.  
  11.     else{
  12.         while (actual->getSig()){
  13.             actual = actual->getSig();
  14.         }
  15.         actual->setSig(nodo);
  16.     }
  17.  
  18. }

Última edición por Cardo2095; 12/05/2015 a las 23:36
  #2 (permalink)  
Antiguo 13/05/2015, 00:10
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: insertar una cadena en una lista

Código C++:
Ver original
  1. Lista <char> *l1;

l1 es un puntero a un objeto de tipo Lista<char>... dónde creas el objeto?? en ningún sitio. Al no crear el objeto, el puntero (que tampoco está inicializado), "apunta" a una dirección de memoria no válida, por lo que al intentar realizar la operación "l1->Insertar(cad[i])" el programa va a dar error.

Para solucionar este problema tienes dos opciones:

1. Quitas el asterisco, usas el objeto por valor, lo cual implica que se creará y se destruirá automáticamente. Por supuesto, al usar el objeto por valor, ya no puedes usar el operador '->'.

2. Usas un new por algún lado para inicializar el objeto... y luego, por supuesto, te faltaría el correspondiente delete para liberar la memoria reservada.

Un saludo.
  #3 (permalink)  
Antiguo 13/05/2015, 01:10
Avatar de Cardo2095  
Fecha de Ingreso: marzo-2015
Ubicación: En mi casa
Mensajes: 18
Antigüedad: 9 años, 8 meses
Puntos: 0
Información Respuesta: insertar una cadena en una lista

de hecho ya lo hice jeje pero aun hay algo que me inquieta a la hora de imprimir la cadena o nose si sera que es asi por ejemplo si ingreso asd me imprime: asd,sd,d
como que me va eliminando la primera letra y lo que quiero es que me quede de esta forma: a,s,d

Código PHP:
void main{
Lista <charl1;

    
char cad[50];
    
int tam;

    
cout << "Escriba la Notacion Infija a Convertir en Prefija" << endl;
    
gets_s(cad);
    
tam strlen(cad);

    for (
int i 0<= tam;i++){
        
l1.Insertar(&cad[i]);
    }

    
l1.ImprimeLista();
    
system("pause");

  #4 (permalink)  
Antiguo 13/05/2015, 01:29
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: insertar una cadena en una lista

Si no publicas el código de Lista<T> y de Nodo<T> es complicado ayudarte
  #5 (permalink)  
Antiguo 13/05/2015, 01:59
Avatar de Cardo2095  
Fecha de Ingreso: marzo-2015
Ubicación: En mi casa
Mensajes: 18
Antigüedad: 9 años, 8 meses
Puntos: 0
Mensaje Respuesta: insertar una cadena en una lista

Cita:
Iniciado por Cardo2095 Ver Mensaje
de hecho ya lo hice jeje pero aun hay algo que me inquieta a la hora de imprimir la cadena o nose si sera que es asi por ejemplo si ingreso asd me imprime: asd,sd,d
como que me va eliminando la primera letra y lo que quiero es que me quede de esta forma: a,s,d

Clase Nodo
Código PHP:
template<class T>
class 
Nodo{

private:
    
elemento;
    
Nodo <T> * sig;

public:
    
Nodo <T>(*);

    ~
Nodo <T>();
    
void setElemento(T*);
    
getElemento();
    
void setSig(Nodo <T> *);
    
Nodo <T> * getSig();
};



//-----------------------------------IMPLEMENTACIÓN-------------------------------------------------------


template<class T>
Nodo<T>::~Nodo(){}

template<class T>
Nodo <T>::Nodo(pElem){
    
elemento pElem;
    
sig NULL;
}

template<class T>
void Nodo <T>::setElemento(TElem){
    
elemento Elem;
}

template<class T>
TNodo <T>::getElemento(){
    return 
elemento;
}

template<class T>
void Nodo <T>::setSig(Nodo <T> * pSig){
    
sig pSig;
}

template<class T>
Nodo<T> * Nodo <T>::getSig(){
    return 
sig;

Clase Lista
Código PHP:
#include"Nodo.h"
#include<iostream>
#include<fstream>
using namespace std;


template<class T>
class 
Lista{

private:
    
Nodo <T>* primero;
    
Nodo <T>* actual;

public:
    
Lista();
    ~
Lista();


    
void setactual(Nodo<T>*);
    
void setprimero(Nodo<T>*);

    
Nodo<T>* getActual();
    
Nodo<T>* getPrimero();

    
void Insertar(*pDato);
    
void ImprimeLista();
    
TBuscar(int id);
    
void Eliminar(*k);
    
bool Existencia(int id);
    
bool Vacio() const;

};


//-----------------------------------IMPLEMENTACIÓN-------------------------------------------------------

template <class T>
Lista<T>::Lista()
{
    
primero actualNULL;
}

template <class T>
Lista<T>::~Lista()
{
}

//-----------------------------------------------------------------------------------

template<class T>
void Lista<T>::setactual(Nodo<T>*n){
    
actual n;
}

template<class T>
void Lista<T>::setprimero(Nodo<T>*n){
    
primero n;
}

template<class T>
Nodo<T>* Lista<T>::getActual(){
    return 
actual;
}

template<class T>
Nodo<T>* Lista<T>::getPrimero(){
    return 
primero;
}

//-----------------------------------------------------------------------------------

template <class T>
void Lista <T>::Insertar(*pDato){

    
Nodo<T>* nodo = new Nodo<T>(pDato);
    
actual primero;

    if (
Vacio()){
        
primero nodo;
    }

    else{
        while (
actual->getSig()){
            
actual actual->getSig();
        }
        
actual->setSig(nodo);
    }

}

template <class T>
void Lista<T>::ImprimeLista(){
    
system("cls");
    
    
actual primero;

    if (
actual == NULL) {
        
cout << "La lista esta vacia" << endl;
    }

    else{
        while (
actual != NULL){
            
cout<< actual->getElemento()<< endl;
            
            
actual actual->getSig();
        }
    }
    
}

template <class T>
TLista<T>::Buscar(int id)
{
    
Nodo<T>* anterior NULL;
    
actual primero;
    while ((
actual != NULL) && (actual->getElemento()->getId() != id)){
        
anterior actual;
        
actual actual->getSig();
    }
    if (
actual->getElemento()->getId() == id)
    {
        return 
actual->getElemento();
    }
    else return 
false;
}



template <class T>
void Lista<T>::Eliminar(*k){//borra uno en especifico
    
Nodo<T>* anterior NULL;
    
actual primero;
    while (
actual && actual->getElemento()->getId() != k->getId()){
        
anterior actual;
        
actual actual->getSig();
    }
    if (!
actual || actual->getElemento()->getId() != k->getId())
        
cout << "No encontro el elemento";
    else{
        if (!
anterior){
            
primero actual->getSig();
        }
        else{
            
anterior->setSig(actual->getSig());
        }
    }
    
delete actual;
}

template <class T>
bool Lista<T>::Existencia(int id){
    
actual primero;
    while (
actual != NULL){
        if (
actual->getElemento()->getId() == id){ return true; }
        
actual actual->getSig();
    }
    return 
false;
}

template <class T>
bool Lista<T>::Vacio() const{
    return (
primero == NULL);













Código PHP:
void main{
Lista <charl1;

    
char cad[50];
    
int tam;

    
cout << "Escriba la Notacion Infija a Convertir en Prefija" << endl;
    
gets_s(cad);
    
tam strlen(cad);

    for (
int i 0<= tam;i++){
        
l1.Insertar(&cad[i]);
    }

    
l1.ImprimeLista();
    
system("pause");

  #6 (permalink)  
Antiguo 13/05/2015, 04:47
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: insertar una cadena en una lista

Para no hablar en plan genérico, voy a particularizar los templates. Te permitirá entender mejor el problema.

  • Nodo<char> almacena un char*, es decir, un puntero a char.
  • Lista<char>::Insertar( ) recibe un char*
  • Al imprimir la lista haces:
    Código C++:
    Ver original
    1. cout<< actual->getElemento()<< endl;
    es decir, estás imprimiendo un char*. Da la casualidad que char* es el tipo utilizado por las cadenas de caracteres... luego cout va a volcar caracteres por pantalla hasta que se encuentre con el primer caracter nulo. Da la casualidad también que no has añadido los caracteres a la lista, sino que has añadido su posición en memoria... por algo almacenas punteros. El caso es que los punteros de Nodo<char> apuntan directamente a la cadena original... luego al volcar el char* te va a imprimir el contenido original de la cadena, pero empezando por el caracter que corresponda.

Soluciones... veo dos posibles:

Solución chapucera

Cambias el cout de Lista<T>::ImprimeLista para que luzca tal que:

Código C++:
Ver original
  1. cout<< *actual->getElemento()<< endl;

De esta forma no estarás volcando un char*, sino simplemente un char

Solución buena

Lo suyo sería modificar los templates. El comportamiento que yo esperaría de un template tipo Nodo<T> es que si yo creo un Nodo<char>, esta estructura trabaje con el tipo char, no con el tipo char*... si resulta que necesito trabajar con char* entonces crearé una estructura tal que Nodo<char*>. Este cambio de concepto te permitirá crear templates más consistentes y versátiles.

Por supuesto además de Nodo<T> también tendrás que modificar Lista<T> para que deje de usar punteros T* sin venir a cuento. Es una solución más laboriosa pero a la vez más limpia y, por supuesto, es la solución que yo te recomiendo.

Un saludo.

Etiquetas: c++, cadena, listas, 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 17:29.