Estructuras con Punteros
4. Listas Simples
Listas Simples
Existe varias aplicaciones derivadas de incorporar un puntero como miembro de una estructura.. en particular mucho mas cuando el puntero apunta a una estructura del mismo tipo !! esto crea lo que se conocen como listas Enlazadas y las mismas pueden ser :Simples, Dobles , Circulares.. etc.
Veamos el caso de Lista enlazada simple o simplemente enlazada.
Vemos que *pdato es un puntero que tiene el mismo tipo de la estructura, es por eso que CONOCE, la estructura y PUEDE apuntar a un miembro, como en este caso el puntero *pdato que contiene E6, y E6 es la dirección de la próxima instancia (2da). Para saber cuando termina el contenido del último miembro puntero contiene NULL, con esto sabemos que termina aquí la Lista.
Observación:
Ver que para recorrer la lista utilizando los punteros SOLO puedo hacerlo en UN SOLO SENTIDO ( en la imagen sería de izquierda a derecha) .
Veamos un ejemplo:
Código:
#include <iostream>
using namespace std;
struct datos{
int Tel;
int legajo;
struct datos *pprox;
};
void cargar(datos *puntero);
void agregar(datos *puntero);
void eliminar(datos *&puntero);
int main(){
datos *punterodato = new datos; //creo un puntero y solicito la 1er instancia (en main())
cargar(punterodato); //cargo la 1er instancia
while(#condición#){ //agregar más instancias
agregar(punterodato); //siempre paso el puntero a la 1er instancia
}
eliminar(punterodato);
return 0;
}
// cargo la ultima instancia
void cargar(datos *puntero){
cout<<"ingrese telefono"<<endl;
cin>>puntero->Tel; //cargo los datos
cout<<"ingrese legajo"<<endl;
cin>>puntero->legajo;
puntero->pprox=NULL; //la nueva instancia es la última
}
void agregar(datos *puntero){ //al pasar por valor la función crea una copia del puntero. No modifico el de main
while(puntero->pprox!=0){ //me posiciono en la última instancia utilizando los enlaces
puntero=puntero->pprox;
}
puntero->pprox=new datos; //solicito una nueva instancia
// y de paso enlazo el puntero a la próxima instancia TODO en la misma línea !!
cargar(puntero->pprox); //cargo la última instancia.
}
void eliminar(datos *&puntero){
datos *pt2=puntero;
while(puntero!=0){ //no es la última instancia
pt2=puntero->pprox;
delete puntero;
puntero=pt2;
}
}
Nota:Un error muy común en punteros es pensar que se está cargando bien una lista enlazada simple, y luego no se puede ver.Se asume que el error es que no se puede mostrar o buscar, pero en realidad NO se cargó o creó correctamente la lista enlazada.Así que es una buena práctica, apenas se carga algo a la lista, ver que es lo que se está cagando. A modo de ejemplo presento un código.
La salida sería algo como: