Estructuras con Punteros
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;
}