Ver Mensaje Individual
  #4 (permalink)  
Antiguo 22/03/2016, 03:44
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 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.