Sunteți pe pagina 1din 11

-- 5.

1 --
Liste dublu inlantuite
Celulele din lista au doua campuri legatura:
pre adresa celulei predecesoare
urm adresa celulei urmatoare
Pentru parcurgerea eficienta a listei in oricare din
cele doua sensuri (de la inceput sau de la sfarsit)
este necesar accesul la cele doua extremitati.

info
pre urm

-- 5.2 --
Se observa ca in aceasta abordare exista
diferente de tratare in cazul modificarilor (inserare /
eliminare) la extremitati, deoarece acestea
efecteaza fie campul prim, fie campul ultim.
. . . . .
prim ultim prim ultim
lista nevida
lista vida
Liste dublu inlantuite deschise
-- 5.3 --
. . .
s
/ / / /
lista vida
s
/ / / /
lista nevida
e
n
e
1
e
n-1
Pentru o tratare uniforma se poate adopta solutia
de organizare ca lista circulara cu santinela.
Liste dublu inlantuite circulare
Campul info al celulei santinela poate fi utilizat pentru
pastrarea unor informatii cu caracter general (de ex.
referinta la functia de verificare a relatiei de ordine in cazul
in care elementele din lista sunt ordonate).
-- 5.4 --
. . .
s
/ / / /
lista vida
s
/ / / /
lista nevida
e
n
e
1
e
n-1
Liste dublu inlantuite circulare
typedef struct cel2
{ struct cel2 *pre, *urm;
void* info;
} TCel2, *TL2;
-- 5.5 --

s

/ / / /
lista vida
s

/ / / /
lista cu un element
e
1

Test lista vida:
(s->urm == s) sau (s->pre == s)
Atentie! Expresia
(s->urm == s->pre)
are valoarea 1 si in cazul listei cu un singur element.
Liste dublu inlantuite circulare
-- 5.6 --
- de la inceput
for (x = s->urm; x != s; x = x->urm)
{. . . .}
Parcurgerea listei dublu inlantuite circulare
. . .
s
/ / / / e
n
e
1
e
2
x
- de la sfarsit
for (x = s->pre; x != s; x = x->pre)
{. . . .}
-- 5.7 --
TL2 InitL2()
{
TL2 aux = ( TL2) mal l oc( si zeof ( TCel 2) ) ;
i f ( aux)
{ aux- >pr e = aux- >ur m= aux;
aux- >i nf o = NULL;
}
r et ur n aux;
}
Initializare lista dublu inlantuita circulara

s

/ / / /
lista vida
-- 5.8 --

(6) (5)
(3) (4)
(1)
x


a


b


nou
(2)
aux
Inserare dupa celula cu adresa x
Secventa de operatii:
alocare spatiu pentru o
noua celula (1)
actualizarea campurilor
noii celule (2,3,4)
actualizare referinte la
noua celula (5,6)
-- 5.9 --
int InsDupa(TL2 a, void* x)
/ * i nser ar e dupa cel ul a cu adr esa a - > 1/ 0 */
{
TL2 aux = ( TL2) mal l oc( si zeof ( TCel ul a2) ) ;
i f ( ! aux) r et ur n 0;
aux- >i nf o = x; / *2*/
aux- >pr e = a; / *3*/
aux- >ur m= a- >ur m; / *4*/
a- >ur m- >pr e = aux; / *5*/
a- >ur m= aux; / *6*/
}
Inserare dupa celula cu adresa p

(6) (5)
(3) (4)
(1)
x


a


b


nou
(2)
aux
-- 5.10 --
void ResetL2(TL2 s)
/ * t r ansf or ma l i st a i n l i st a vi da */
{ TL2 p = s- >ur m, aux;
whi l e( p ! = s)
{
aux = p;
p = p- >ur m;
f r ee( aux- >i nf o) ;
f r ee( aux) ;
}
s- >ur m= s- >pr e = s;
}
Eliberare spatiul de memorie
-- 5.11 --
void DistrL2(TL2* as)
/ * el i ber eaza t ot spat i ul ocupat de l i st a,
i ncl usi v sant i nel a */
{
Reset L2( *as) ;
f r ee( *as) ;
*as = NULL;
}
Eliberare tot spatiul de memorie

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