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: