Sunteți pe pagina 1din 3

Modulul I.

Structuri de date liniare

Capitolul 5. Liste dublu inlantuite

Pentru folosirea mai usoara a listelor liniare putem avea, pentru fiecare nod al
listei nu numai un pointer la elementul urmator ci si unul la nodul precedent. O astfel
de reprezentare a unei liste se numeste lista dublu inlantuita. Astfel, orice nod va avea
forma:
llink info rlink

Orice lista dublu inlantuita va avea doi pointeri FIRST, care pointeaza la primul nod si
LAST care pointeaza la ultimul nod.

FIRST LAST

NULL llink info rlink llink info rlink


... NULL

Deasemenea, se fac urmatoarele setari FIRST->llink=NULL si LAST->rlink= NULL.


Observati ca pentru orice pointer p la un nod avem:
(p -> rlink) -> llink = p si (p -> llink) -> rlink = p.
Operatiile cu liste dublu inlantuite se pot descrie astfel:
 accesarea/ modificarea unui element ce contine o valoare data se face ca si in
cazul listei liniare simplu inlantuite, parcurgandu-se lista fie de la inceput la
sfarsit, fie de la sfarsit la inceput.
 inserarea unui nou nod
o la inceputul listei:
Algoritm: Folosim variabilele info_nou ce contine valoarea informatiei
nodului ce trebuie introdus in lista si p pointer la un nod.
Aloca memorie pentru un nod nou. Returneaza p, un pointer la noul nod.
if p  NULL then
p -> llink = NULL
p -> rlink = FIRST
p -> info = info_nou
FIRST -> llink = p
FIRST = p
else OVERFLOW
endif
FIRST LAST

NULL llink info rlink llink info rlink


... NULL

NULL llink info rlink


p
o la sfarsitul listei:

1
Algoritm: Folosim variabilele info_nou ce contine valoarea informatiei
nodului ce trebuie introdus in lista, p pointer la un nod
Aloca memorie pentru un nod nou. Returneaza p, un pointer la noul nod.
if p  NULL then
p -> rlink = NULL
p -> info = info_nou
p -> llink = LAST
LAST -> rlink =p
LAST=p
else OVERFLOW
endif
FIRST LAST

NULL llink info rlink llink info rlink


... NULL

llink info rlink


p NULL

o dupa un nod dat:


Algoritm: Folosim variabilele info_nou ce contine valoarea informatiei
nodului ce trebuie introdus in lista si p pointer la un nod si inainte pointer la
nodul dupa care se doreste introducerea noului nod.
Aloca memorie pentru un nod nou. Returneaza p, un pointer la noul nod.
if p  NULL then
p -> llink = inainte
p -> rlink = inainte -> rlink
inainte -> rlink = p
(p -> rlink ) -> llink = p
p -> info = info_nou
else OVERFLOW
endif
inainte

llink info rlink llink info rlink


... ...

llink info rlink

 eliminarea unui nod


o eliminarea primului nod:
Algoritm:
elem_sters = FIRST -> info
FIRST = FIRST -> rlink
FIRST ->llink = NULL

FIRST

2
NULL llink info rlink llink info rlink ...

NULL
o eliminarea ultimului nod:
Algoritm:
elem_sters = LAST -> info
LAST = LAST -> llink
LAST ->rlink = NULL

LAST

... llink info rlink llink info rlink


NULL

NULL
 eliminarea unui nod dat din lista:
Algoritm: Folosim variabilele sterge, un pointer la nodul care trebuie eliminat din
lista, inainte, pointer la nodul dinainte si dupa, pointer la nodul dupa nodul ce
trebuie sters.
elem_sters = sterge -> info
inainte = sterge -> llink
dupa = sterge -> rlink
dupa ->llink = inainte
inainte ->rlink = dupa

inainte sterge dupa

... ... llink info rlink llink info rlink llink info rlink ...

Scrieti un program care implementeaza algoritmii de mai sus.


Lab 6
1