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.
0 0
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 unde
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();
}
Aplicatie: Sa se implementeze
operatiile cu liste liniare dublu inlantuite. Se va realiza cate o functie
pentru fiecare operatie.
Probleme propuse:
1.
Sa
se memoreze intr-o lista dubla n numere intregi. Care este primul element
palindrom din dreapta?
2. Sa se memoreze intr-o lista dubla n numere intregi. Sa se interschimbe primul element cu ultimul, al doilea cu penultimul etc. (informatiile utile).
3. Sa se stearga prima si ultima valoare egala cu x dintr-o lista dubla
4. Sa se insereze intre oricare doua elemente suma celorlalte
5. O lista dubla retine caractere. Sa se determine daca sirul retinut de lista este palindrom. Se citeste un caracter k. Sa se insereze acest caracter inainte de fiecare vocala.
6. fis1.txt si fis2.txt retin doua numere foarte mari sa se determine suma celor doua numere.
7. Sa se determine cea mai lunga secventa crescatoare dintr-o lista dubla. Dupa afisare se va sterge aceasta secventa
8. Sa se afiseze o lista ca perechi de numere: primul cu ultimul, al doilea cu penultimul s.a.m.d. pana la jumatate
9. Fie o lista dubla. Sa se afiseze lista stanga-dreapta si dreapta stanga (icepand de la primul apoi de la ultimul). Se cunoaste adresa unui element oarecare din lista.
10. Sa se mute zerourile la sfarsitul unei liste duble. Nu se va folosi o lista intermediara