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

imprimir lista en c++

Estas en el tema de imprimir lista en c++ en el foro de C/C++ en Foros del Web. Hola, es un código muy sencillo, y según yo está bien pero no logro que imprima la lista si alguien me puede ayudar, por favor ...
  #1 (permalink)  
Antiguo 21/03/2016, 17:41
 
Fecha de Ingreso: julio-2013
Mensajes: 9
Antigüedad: 10 años, 9 meses
Puntos: 0
imprimir lista en c++

Hola, es un código muy sencillo, y según yo está bien pero no logro que imprima la lista si alguien me puede ayudar, por favor

Código PHP:
#include <iostream>

using namespace std;
class 
Memoria{
private:
    
struct elemento{
        
//  int id;
        
int dato;
        
// int tam;
        
elemento *sig;
        
    }*
m;
    
public:
    
Memoria(){ //constructor iniciamos en 0
        
m=NULL;
    }
    

    
    
    
    
void insertar(int d/*, int t*/){
        
elemento *q;
        
q=new elemento();
        
//q->id=num;
        
q->dato=d;
        
//q->tam=t;
        
q->sig=m//q->sig apunta a lo que está apuntando m
        
m=q;
        
//num++;
    
}
    
 
    
    
int extraer (){
        
elemento *q;
        
int d;
        
        if(
m==NULL){
            
cout<<"\n Pila vacia";
             return -
1;
        }
        
q=m;
        
m=q->sig;
   
        
d=q->dato;
   
        
delete q;
        return 
d;
    }
    
    
void imprimir()// esta es mi función donde mando a imprimir, pero realmente no hace nada, y según yo está bien
    
{
        
elemento *q;
        while(
m!=NULL){
            
cout<<"\n solo imprimo";
            
cout<<"\n m"<<q->dato;
            
        }
        
    }
    
    
    
bool vacia(){
        if(
m==NULL)
            return 
true;
        return 
false;
        
    }
    
     ~
Memoria(){
     while(
m!=NULL){
     
extraer();
     }
     }
};

/*void muestra() esto sólo es una función de prueba q pongo
{
    Memoria p;
    while(p.vacia()!=true){
        cout<<"\n solo imprimo";
        cout<<"\n m"<<m;
        
    }
    
}*/

int datos(){
    
int d;
    
cout<<"\n proceso: ";
    
cin>>d;
    return 
d;
    
}

int tamanio(){
    
int t;
    
cout<<"\n Tamaño: ";
    
cin>>t;
    return 
t;
}


void proceso(int n){
    
Memoria p;
    
int len=-1;
    
p.insertar(n);
    
    
    
cout<<"\n"<<n;
    
}

void transferir(){
    
}

int main() {
    
int op;
    
int *n,d,*s,n1;
    
Memoria p;
    
cout<<"\n Menú";
    
cout<<"\n 1. Almacenar una tarea";
    
cout<<"\n 2. Ejecutar tarea (pasar tarea de memoria a cpu)";
    
cout<<"\n 3. Eliminar tarea de cpu"<<endl;
    
// p.mostrar();
    
    
cin>>op;
    
// cout<<"\n 4. Elimina"
    
    
switch (op) {
        case 
1:
            
cout<<"\n proceso?: ";
            
cin>>d;
            
proceso(d);
            
p.imprimir();// aquí mando llamar a imprimir.
            
break;
        case 
2:
            break;
        default:
            break;
    } 
  #2 (permalink)  
Antiguo 21/03/2016, 23:12
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Respuesta: imprimir lista en c++

Cita:
void imprimir()// esta es mi función donde mando a imprimir, pero realmente no hace nada, y según yo está bien
{
elemento *q;
while(m!=NULL){
cout<<"\n solo imprimo";
cout<<"\n m"<<q->dato;

}

}
Haste la pregunta. A donde esta apuntando q?
Hasta la siguiente pregunta. Estas en el ciclo while dando vueltas. Cuando va a parar? Cuando m==NULL? Y eso cuando va a suceder si todo el tiempo estas dentro del while?

Como recomendación, trata de ser mucho mas expresivo en el nombre de tus variables. Cosas comoq, m o p, no dicen nada y creeme que un día te podrás evitar un buen dolor de cabeza leyendo el código.

Saludos
  #3 (permalink)  
Antiguo 22/03/2016, 02:03
 
Fecha de Ingreso: julio-2013
Mensajes: 9
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: imprimir lista en c++

Hola!, muchas gracias por responder.
con referencia a
Código PHP:

lo que apunta q es al elemento dato, y si tienes razón con respecto al ciclo me hacía falta algo así como un contador para q siga recorriendo los elementos, estoy un poco perdida en esta parte y ya le he intentado de diferentes formas, pero me marca un error de memoria.

Código PHP:

using namespace std
;
class 
Memoria{
public:
struct elemento{
        
//  int id;
        
string dato;
        
// int tam;
        
elemento *sig;
        
    }*
pila;
    
//typedef pila *indice;
public:
      
    
Memoria(){ //constructor iniciamos en 0
        
pila->sig=NULL;
    }
    
   
void insertar(string d/*, int t*/){
        
elemento *q;
        
q=new elemento();
       
        
q->dato=d;
      
        
q->sig=pila//q->sig apunta a lo que está apuntando m
        
pila=q;
       
    }
    
 
    
    
string extraer (){
        
elemento *q;
        
string d;
        
        if(
pila==NULL){
            
cout<<"\n Pila vacia";
            
// return -1;
        
}
        
q=pila;
        
pila=q->sig;
        
d=q->dato;
        
delete q;
        return 
d;
    }

    
void imprimir()
    {
        
elemento *q;
      
        
//aqui es la parte en la que ya le he intentado de varias formas,
        
while(pila!=NULL){//pila->sig!=null, q->sig!=null  aquí lo que hice fue poner de estas diferentes formas adentro del while
            
cout<<"\n solo imprimo";
            
cout<<"\n "<<pila->dato;
            
q->sig=q->sig;//pila->sig=q->sig; y bueno este sería como mi tipo contador y lo mismo aquí, intenté de estas formas pero no me queda
        
            
            
        
}
       
// return *str;
    
}
    
    
    
bool vacia(){
        if(
pila==NULL)
            return 
true;
        return 
false;
        
    }
    
     ~
Memoria(){
     while(
pila!=NULL){
     
extraer();
     }
     }
};

/*void muestra()
{
    Memoria p;
    while(p.vacia()!=true){
        cout<<"\n solo imprimo";
        cout<<"\n m"<<m;
        
    }
    
}*/

string datos(){
    
string d;
    
cout<<"\n proceso: ";
    
cin>>d;
    return 
d;
    
}

int tamanio(){
    
int t;
    
cout<<"\n Tamaño: ";
    
cin>>t;
    return 
t;
}


void proceso(string n){
    
Memoria p;
    
int len=-1;
    
char *array;
    
p.insertar(n);
   
    
cout<<"\n"<<n;
    
    while(array[++
len]!=0){
        
    }
        
    
}

void ejecutar(int np){
    
}

void transferir(){
    
}

int main() {
    
int op;
    
int *n,*s,n1,np;
    
string d;
    
Memoria p;
    do{
    
cout<<"\n Menú <-1 para salir>";
    
cout<<"\n 1. Almacenar una tarea";
    
cout<<"\n 2. Ejecutar tarea (pasar tarea de memoria a cpu)";
    
cout<<"\n 3. Eliminar tarea de cpu"<<endl;
    
// p.mostrar();
    
    
cin>>op;
    
// cout<<"\n 4. Elimina"
   
    
switch (op) {
        case 
1:
            
cout<<"\n proceso?: ";
            
cin>>d;
            
proceso(d);
            
p.imprimir();
            break; 
  #4 (permalink)  
Antiguo 22/03/2016, 03:44
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: imprimir lista en c++

Lo que tu pretendes es recorrer la lista con q, luego lo único que tienes que hacer es actualizar dicho puntero en cada iteración. ¿Cómo? Muy sencillo, haciendo que apunte al elemento siguiente:

Código C++:
Ver original
  1. q = q->sig;

Por otro lado, si revisas un poco el bucle:

Código C++:
Ver original
  1. while(pila!=NULL){
  2.   cout<<"\n solo imprimo";
  3.   cout<<"\n "<<pila->dato;
  4.   q->sig=q->sig;
  5. }

queda claro que algo no funciona... la condición para salir del bucle depende de una variable que no se modifica dentro del bucle, luego el bucle infinito está garantizado.

Trabajar con punteros es más sencillo de lo que parece. Mira, vamos a probar a hacer esto sin punteros (una versión similar). La idea es imprimir valores hasta alcanzar un valor

Código C++:
Ver original
  1. int q = 10;
  2. int pila = 10;
  3. while(pila!=0){
  4.   cout<<"\n solo imprimo";
  5.   cout<<"\n "<<pila;
  6.   q=q-1;
  7. }

¿Funciona este código? Obviamente no. Si queremos que el bucle termine en algún momento tenemos que comprobar el estado de la variable que modificamos...

Código C++:
Ver original
  1. int q = 10;
  2. int pila = 10;
  3. while(q!=0){
  4.   cout<<"\n solo imprimo";
  5.   cout<<"\n "<<pila;
  6.   q=q-1;
  7. }

Vale, ahora ya el bucle termina pero... ¿funciona el bucle correctamente? bueeeno, tiene un pequeño problema y es que imprime el número 10 todo el rato... claro, si imprimimos una variable que no estamos actualizando dentro del bucle ¿cómo va a enterarse dicha variable de que el valor a mostrar ha cambiado?

Nuevo retoque al bucle

Código C++:
Ver original
  1. int q = 10;
  2. int pila = 10;
  3. while(q!=0){
  4.   cout<<"\n solo imprimo";
  5.   cout<<"\n "<<q;
  6.   q=q-1;
  7. }

Vaya, ahora el bucle si que funciona bien e imprime una secuencia descendente de 10 a 1. Venga, ahora que lo tenemos funcionando pasemos el código a punteros a ver que pasa:

Código C++:
Ver original
  1. while(q!=nullptr){ // 1. Los punteros no se deberían comparar con 0
  2.   cout<<"\n solo imprimo";
  3.   cout<<"\n "<<q->dato; // 2. Queremos acceder a un dato concreto del puntero
  4.   q=q->sig; // 3. En las listas enlazas el cambio de puntero se hace así.
  5. }

No ha sido tan traumático el cambio, ¿verdad? Si te cuesta trabajar con punteros, en serio, haz primero un diseño similar sin ellos y te acabarás dando cuenta de que no son tan diferentes a las variables locales de toda la vida.

PD.: nullptr lleva en C++ desde que vió la luz el estándar C++11 (efectivamente, en 2011), por lo que cualquier compilador posterior lo debería soportar (en algunos casos hay que activar el estándar a mano con un flag al compilar). Simplemente que sepas que está ahí y que debería ser la forma habitual de trabajar con punteros. No estaría de más que vuestro profesor os enseñase los detalles del lenguaje actual y no una versión que data del siglo pasado.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #5 (permalink)  
Antiguo 22/03/2016, 22:03
 
Fecha de Ingreso: julio-2013
Mensajes: 9
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: imprimir lista en c++

Hola, muchas gracias por explicarme, lo he hecho así como me dijiste y aún no me ha quedado , si mando llamar la función imprimir adentro del main no hace nada, pero si imprimir la mando llamar dentro de la función proceso si entra hasta la parte del cout que dice "solo texto" y de ahí se traba. No sé que está pasando.
Código:
#include <iostream>

using namespace std;
class Memoria{
public:
struct elemento{
        //  int id;
        char dato;
        // int tam;
        elemento *sig;
        
    }*pila;
    //pila *indice;
public:
      
    Memoria(){ //constructor iniciamos en 0
        pila=NULL;
    }
    
   void insertar(char d/*, int t*/){
        elemento *q;
        q=new elemento();
       
        q->dato=d;
      
        q->sig=pila; //q->sig apunta a lo que está apuntando m
        pila=q;
       
    }
    
    char extraer (){
        elemento *q;
        char d;
        
        if(pila==NULL){
            cout<<"\n Pila vacia";
            // return -1;
        }
        q=pila;
        pila=q->sig;
        d=q->dato;
        delete q;
        return d;
    }
   
   /* void muestra(char n)
    {
        cout<<"\n Dato : "<<n;
    }
   */
    
    void imprimir()
    {
        elemento *q;
        char d;
       if(q!=nullptr){
       while(q!=nullptr){
        
            cout<<"\n solo imprimo";
            cout<<"\n : "<<q->dato;
            q=q->sig;
       }
    }
        else{
            cout<<"\n Vacia";
        }
    }
    
    
   
    
    
    bool vacia(){
        if(pila==NULL)
            return true;
        return false;
        
    }
    
     ~Memoria(){
     while(pila!=NULL){
     extraer();
     }
     }
};

/*void muestra()
{
    Memoria p;
    p.imprimir()
        
    }
 
}
*/
char datos(){
    char d;
    cout<<"\n proceso: ";
    cin>>d;
    return d;
    
}

int tamanio(){
    int t;
    cout<<"\n Tamaño: ";
    cin>>t;
    return t;
}


void proceso(char n){
    Memoria p;
    int len=-1;
    char *array;
    p.insertar(n);
   
    cout<<"\n"<<n;
   // p.imprimir(); //aquì imprimir si ejecuta hasta el cout pero de ahí ya nada (se atora el programa)
    
   }

void ejecutar(int np){
    
}

void transferir(){
    
}

int main() {
    int op;
    int *n,*s,n1,np;
    char d;
    Memoria p;
    do{
    cout<<"\n Menú <-1 para salir>";
    cout<<"\n 1. Almacenar una tarea";
    cout<<"\n 2. Ejecutar tarea (pasar tarea de memoria a cpu)";
    cout<<"\n 3. Eliminar tarea de cpu"<<endl;
    // p.mostrar();
    cout<<"\n Opcion ?: ";
    cin>>op;
    // cout<<"\n 4. Elimina"
     p.imprimir();
    switch (op) {
        case 1:
            cout<<"\n proceso?: ";
            cin>>d;
            proceso(d);
           p.imprimir();//aquí imprimir nada hace
            break;
        case 2:
            cout<<"\n proceso?: ";
            cin>>np;
            
            
            break;
            
            
        default:
            break;
        
    } }   while(op!=-1);
}
  #6 (permalink)  
Antiguo 22/03/2016, 22:07
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Respuesta: imprimir lista en c++

Te lo dije en el post anterior y eferion te lo explicó con mas detalle.

Código:
void imprimir()
    {
        elemento *q;
        char d;
       if(q!=nullptr){
       while(q!=nullptr){
        
            cout<<"\n solo imprimo";
            cout<<"\n : "<<q->dato;
            q=q->sig;
       }
    }
        else{
            cout<<"\n Vacia";
        }
    }
*q es un puntero vacio. No esta apuntando a nada. Es mas, ni siquiera tiene nullptr.
No hay nada en esa funcion que vincule tus demas estructuras con la misma funcion.

Haz diagramas de tus punteros, eso ayuda a entender bien que esta sucediendo.

PD: Por cierto. No es una buena practica mezclar NULL y nullptr. O usas uno o el otro, pero no ambos. NULL es pre C++11. nullptr es una mejora de C++11.
  #7 (permalink)  
Antiguo 23/03/2016, 00:58
 
Fecha de Ingreso: julio-2013
Mensajes: 9
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: imprimir lista en c++

Perdón solo q no capto el error, a que te refieres con que mi puntero q está vacío?,
Código PHP:
  void imprimir()
    {
        
elemento *q;//aquí obviamente declaro el puntero que sea tipo elemento
        
      //  char d;
       
if(q->sig!=NULL){
       while(
q->sig!=NULL){//aquí también lo probé con  while(q!=NULL) y  while(Pila!=NULL) y lo mismo con el if
        
            
cout<<"\n solo imprimo";
            
cout<<"\n : "<<q->dato;//y aquí mi puntero está apuntando a dato
            
q=q->sig;
       }
    }
        else{
            
cout<<"\n Vacia";
        }
    } 
esta es mi estructura dentro de mi clase

Código PHP:
class Memoria{
public:
struct elemento{
        
//  int id;
        
char dato;
        
// int tam;
        
elemento *sig;
        
    }*
pila
Gracias
  #8 (permalink)  
Antiguo 23/03/2016, 01:25
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: imprimir lista en c++

Código C++:
Ver original
  1. elemento *q;//aquí obviamente declaro el puntero que sea tipo elemento

Vale, obviamente declaras un puntero pero... ¿a dónde apunta dicho puntero? Tiene sentido que un puntero apunte a alguna parte ¿no? si no, no se llamaría puntero y tendría un nombre más apropiado a su nueva utilidad.

Vamos a hacer como en la otra respuesta y vamos a bajar al nivel de las variables locales:

Código C++:
Ver original
  1. int q; // Cuánto vale q???

Porque es obvio que si reservo memoria en la pila para q esa memoria va a tener una secuencia binaria aunque yo no le haya dicho nada. De hecho podemos comprobarlo con el siguiente código:

Código C:
Ver original
  1. int a,b,c;
  2. printf("%d %d %d",a,b,c);

Esto es lo que se conoce como variables no inicializadas y su contenido es lo que se conoce como basura (no conoces el origen de esos datos ni tampoco qué quieren decir luego no son de interés para tus propósitos). Las variables no inicializadas causan muchos problemas en los programas puesto que pierdes el control sobre lo que hace tu programa.

Lo vemos con un ejemplo rápido. ¿Qué hace este código? ¿Cuántos números saca por pantalla?

Código C:
Ver original
  1. int i;
  2. for( ;i<10;i++) printf("%d");

Si tu respuesta rápida es 10 números vuelve a revisarlo. Fíjate que a i no le hemos asignado un valor inicial luego lo mismo puede valer 0 (si empieza con 0 juega al euromillón) como cualquier otro valor almacenable en 31 bits más signo.

Seguimos con tu código. Permíteme que borre tus comentarios ya que ha quedado claro que las cosas no son tan obvias como parecen.

Código C++:
Ver original
  1. elemento *q;
  2.        
  3. if(q->sig!=NULL){

Problema que tenemos aquí. Si q no está inicializado damos por sentado que apunta a una región desconocida de la memoria luego lo que nos podemos encontrar ahí lo mismo es memoria utilizada por otro programa. ¿Qué pretendes con el if que has puesto justo después? ¿Comprobar si has tenido suerte y esa zona de memoria aleatoria tiene el valor que esperas? Es como pretender que te toque la lotería simplemente pasando frente a la puerta de la administración de loterías.

Para que tu programa funcione tienes que asignar valores a todas tus variables, punteros incluídos.

PD.: decir que un puntero está vacío es una forma de expresar que el puntero apunta a 0. Decir que un puntero no es válido indica que el puntero no apunta a un elemento de tu programa.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Etiquetas: int, lista
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 11:00.