Sunteți pe pagina 1din 3

Liste liniare dublu inlantuite

O componenta a unei liste dublu inlantuite se declara ca o data


structurata de tip inregistrare, formata din trei campuri: informatia
propriu-zisa (care poate fi de orice tip: numeric, caracter, pointer, tablou,
inregistrare) si informatiile de legatura (adresa la care e memorata
urmatoarea componenta si adresa la care e memorata precedenta
componenta). Ultima componenta va avea informatia de legatura
corespunzatoare urmatoarei adrese NULL (sau 0), cu semnificatia ca
dupa ea nu mai urmeaza nimic (retine adresa „nici o adresa” a
urmatoarei componente).La fel si in cazul primei componente pentru
campul adresa precedenta.
Conform celor enuntate anterior memorarea si prelucrarea acestor
structuri de date este similara cu cea a listelor liniare simplu inlantuite,
ba chiar unele prelucrari (cum ar fi stergerea si inserarea inainte se
simplifica avand intr-un mod facil acces la componenta anterioara)
Se poate defini un tip de date structurat numit nod, ale carui campuri le
numim info pentru informatia utila, next pentru adresa urmatoare si back
pentru adresa precedenta.
De exemplu, pentru o lista de numere intregi, putem defini:

struct nod
{int info;
nod * next,* back;};

Componentele listei se vor aloca dinamic. Prelucrarea listei se va face


tot prin intermediul a doi pointeri care acceseaza primul si respectiv
ultimul element al listei .

Operatiile care se pot face utilizand liste dublu inlantuite sunt:


crearea listei
-adaugarea unui element la inceputul listei
-adaugarea unui element la sfarsitul listei
-adaugarea unui element in interiorul listei
-stergerea elementului de la inceputul listei
-stergerea elementului de la sfarsitul listei
-stergerea unui element din interiorul listei
-traversarea listei, cu prelucrarea elementelor acesteia, intr-un „sens” sau
celalalt

Iata o solutie de implementare a functiilor de creare ( si adaugare) si de


parcurgere stanga-dreapta si dreapta-stanga.:
#include<iostream.h>
#include<conio.h>
struct Nod
{int info;
Nod *next,*back;
};
Nod *prim, *ultim;
void creare_lista()
{Nod *c;
c=new Nod;
cout<<"info ";
cin>>c->info;
if(!prim)
{prim=c;
prim->next=0;
prim->back=0;
ultim=prim;
}
else
{ultim->next=c;
c->back=ultim;
ultim=c;
ultim->next=0;
}
}
void listare_stanga_dreapta()
{Nod *c;
c=prim;
while(c)
{cout<<c->info<<" ";
c=c->next;}
}
void listare_dreapta_stanga()
{Nod *c;
c=ultim;
while(c)
{cout<<c->info<<" ";
c=c->back;}
}
void main()
{int n,i;
clrscr();
cout<<"cate elemente va avea lista?";
cin>>n;
for(i=1;i<=n;i++)
creare_lista();
cout<<endl<<"Elementele listei de la stanga la dreapta sunt:"<<endl;
listare_stanga_dreapta();
cout<<endl<<"Elementele listei de la dreapta la stanga sunt:"<<endl;
listare_dreapta_stanga();
getch();
}

S-ar putea să vă placă și