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(); }