9. Ejemplo 2

Consigna.

Cargar 3 instancias de una lista Enlazada simple sin pasar punteros por referencia. La primer instancia se solicita en main. 

Crear una función listar y otras que sean necesarias.


Observación:

Se puede observar que NO es suficiente una sola función carga para hacer la primer carga y luego las otras. Se pide al alumno pensar en este planteo. Es por eso que en la resolución de este ejercicio se crean 2 funciones. Una que carga la 1er Instancia y otra que carga las demás instancias. Veamos si podemos graficar la situación.


Al crea la primer instancia, usando new en main , el puntero a la primer instancia NO es NULL lógicamente, pero el miembro  puntero  p de la primer instancia es NULL, por lo tanto no se puede, o al menos yo no pude encontrar una manera elegante de utilizar una sola función carga para hacer TODAS las cargas si paso una copia del puntero a la primer instancia.  Así que se crean dos funciones cargas, una para la primer instancia y otra para las demás.

#include <iostream>
using namespace std;
struct datos{int x; struct datos *p;};
void carga(struct datos *p1);
void primer_carga(struct datos *p1);
void listar(struct datos *p_inicio);
    
int main(int argc, char *argv[]) {
    //voy a trabajar SIN pasar por Referencia.
    struct datos *p_inicio=new struct datos;//Primer instancia
    //apenas se crea la instancia.
    cout<<"Valores del entero en la estructura antes de Incicializar:"<<p_inicio->x<<endl;//ver que el contenido es NULL, 
    cout<<"Valores del puntero de la estructura antes de Incicializar:"<<p_inicio->p<<endl;//ver que el contenido es NULL
    //1er Carga.
	primer_carga(p_inicio);
    listar(p_inicio);
    carga(p_inicio);
    listar(p_inicio);
    carga(p_inicio);
    listar(p_inicio);
    return 0;
}

void primer_carga(struct datos *p1)
{   cout<<"Carga 1er Instancia..."<<endl;
    cout<<"Ingese entero:  ";cin>>p1->x;//cargo un valor
    //ver que p1->x es NULL de la pimer instancia
    // por eso NO necesito inicizar a NULL la 1er Instancia.
}

// carga agrega una instancia al final
void carga(struct datos *p1)
{  cout<<endl<<"Inicia Carga de otra instancia..."<<endl;
   // Si no es la primer instancia.
    while((p1->p)!=0)//me dezplazo hasta la última instancia
        {p1=p1->p;}//buscando la instancia que tiene puntero NULL
    struct datos *p_proxima=new struct datos; // creo una nueva instancia
    p1->p=p_proxima; // antes NULL, ahora apunta a la proxima instancia.
    p1=p_proxima;//me paro en la proxima instancia.
    cout<<"Ingese un entero: ";cin>>p1->x;//cargo un valor
    p1->p=NULL;//pongo NULL la última instancia.
}

void listar(struct datos *p1)
{   int contador=0;
    
    cout<<endl<<"-------Ingresando a listar-------"<<endl;
    while((p1!=0))
    {
    cout<<"Instancia: "<<contador<<endl;
    cout<<"valor de x:"<<p1->x<<endl;
    cout<<"valor de puntero:"<<p1->p<<endl;
    p1=p1->p;
    }
    cout<<"Ver que el ultimo puntero es NULL!";
    cout<<endl<<"--------Saliendo de Listar---------"<<endl;
}