Estructuras con Punteros
Condições de conclusão
6. Listas Dobles.
Listas Dobles.
Las listas enlazadas dobles incorporan UN PUNTERO MAS. Con dos punteros formado parte de la estructura un puntero se utiliza para apuntas a la próxima instancia ( como en la lista Enlazada Simple) y el orto para apuntar la instancia anterior.
Esto nos permite recorrer en ambas direcciones la lista, enlazada DOBLE en este caso.
Observación:
En los extremos se deberá indicar con NULL
- el puntero que apuntan a la siguiente instancia en la última instancia
- el puntero que apunta a la instancia anterior en la primer instancia
- Se pueden recorrer en los DOS sentidos!!
Código:
#include <iostream>
using namespace std;
struct datos //Estructura Global
{
int Tel;
int legajo
struct datos *p_siguiente; //puntero a la proxima instancia
struct datos *p_anterior;// puntero a la instancia anterior.
};
void cargar(datos *);//Ver que al agrumento datos se declaró antes
void agregar(datos *);//Ver que al agrumento datos se declaró antes
int main()
{
datos *p, *puntero_inicio= new datos; //creo un puntero temporal p y
//otro al inicio y solicito la 1er instancia en main()
puntero_inicio->p_anterior=NULL;
cargar(puntero_inicio); //cargo la 1er instancia
//Cargo segunda instancia
agregar(puntero_inicio); //siempre paso el puntero a la 1er instancia
//Cargo tercer instancia
agregar(puntero_inicio); //siempre paso el puntero a la 1er instancia
//Muestro la lista enlazada doble de tres instancias
p=puntero_inicio; //inicializo puntero temporal
bool primera=true;// variable de uso temporal
do
{
if (primera)primera=false; //la primera vez no apunto a la proxima instancia
else p=p->p_siguiente;//si no es la primera vez apunto a la proxima instancia
cout<<p<<"-"<< p->legajo << "-" << p->Tel << "-" <<"siguiente: "
<< p->p_siguiente << "-" <<"anterior: "<< p->p_anterior << endl;
}while (p->p_siguiente != 0);
delete []puntero_inicio;
return 0;
}
void cargar(datos *puntero)//ver que puntero es una COPIA de puntero_inicio
{
cout << "ingrese telefono" << endl;
cin >> puntero->Tel; //cargo los datos
cout << "ingrese legajo" << endl;
cin >> puntero->legajo;
puntero->p_siguiente = NULL;
}
void agregar(datos *puntero)//ver que puntero es una COPIA de puntero_inicio
{ //al pasar por valor la función crea una copia del puntero. No modifico el de main
while (puntero->p_siguiente != 0)
{ //me posiciono en la última instancia utilizando los enlaces
puntero = puntero->p_siguiente;
}
puntero->p_siguiente = new datos; //solicito una nueva instancia
//y asigno la dirección en el puntero al prox de la última
(puntero->p_siguiente)->p_anterior = puntero;// esta línea es importante!!
cargar(puntero->p_siguiente);
}
Observación :
En la línea :
(puntero->p_siguiente)->p_anterior = puntero;// esta línea es importante!!
Aprovecho para inicializar el puntero de anterior de la instancia siguiente, antes de pasar a completar los datos de la instancia siguiente. Esto se puede hacer de otras formas, solo me pareció oportuno hacerlo ya que tengo almacenado el valor de la dirección anterior en ese momento.
La salida del código anterior es: