Sunteți pe pagina 1din 30

STRUCTURI DE DATE

DINAMICE

ncepnd cu a doua jumtate a secolului al XX-lea, apariia i dezvoltarea


calculatoarelor electronice au declanat o nou revoluie n toate domeniile vieii
economice i sociale. La baza acestei revoluii stau cercetrile fundamentale din
domeniul matematicii i realizrile din domeniul microelectronicii.
Diversificarea spectaculoas a mijloacelor tehnice din domeniul
microelectronicii a dus la o dezvoltare continu a software-ului, necesitnd totodat
adecvarea structurilor de date la aplicaii din ce n ce mai complexe. Astfel au aprut
structurile de date dinamice, pe lng cele statice i semistatice, care permit o alocare
dinamic att n cadrul structurii ct i la nivelul ntregii structuri. Lista liniar ca
structur de date dinamic s-a dovedit a fi util ntr-o gam foarte variat de
aplicaii, unde se pot obine economie de timp i memorie, o minimizare a numrului
de operaii, ajungndu-se la algoritmi eficieni i, implicit, la programe fiabile,
performante.
Foarte multe produse software care utilizeaz un volum mare de date
folosesc structuri de date dinamice.
O prim problem ce apare n prelucrarea structurilor de date este legat de
reprezentarea n memoria intern i pe suporturile externe. Lucrarea are drept scop
prezentarea ctorva modaliti de reprezentare, evideniindu-se avantajele fiecreia
n parte.

back

Tipurile de date de care avem nevoie n rezolvarea diferitelor probleme fie


exist ca atare n limbajul de programare ales, fie se pot declara cu ajutorul
tipurilor de date elementare. n organizarea datelor, conform logicii algoritmului
de rezolvare, datele de diferite tipuri se grupeaz n structuri, denumite structuri
de date.
O structur de date poate ocupa n memorie o zon de dimensiune
constant, n care elementele componente ocup tot timpul execuiei
programului acelai loc. O astfel de structur se numete static. Alocarea de
memorie fcut pentru o structur static este o alocare static att la nivelul
ntregii structuri, ct i pentru fiecare component n parte.
Dac o structur de date ocup o zon de dimensiune constant, dar
elementele componente ocup un loc variabil n timpul execuiei programului
atunci o astfel de structur se numete semistatic. Pentru o structur semistatic
alocarea este static la nivelul structurii i dinamic la nivelul componentelor,
Dac o structur de date ocup n memoria intern o zon care se aloc n
timpul execuiei programului pe msura nevoii de prelucrare, fr a avea o
dimensiune constant, atunci structura este dinamic. Pentru o structur
dinamic alocarea este dinamic att la nivelul componentelor ct i la nivelul
ntregii structuri.

back

Liste. Noiuni introductive


Lista simplu nlnuit
Definire
Operaii specifice
Lista dublu nlnuit

Definire
Operaii specifice

Definiie :
O list este o structur de date dinamic n care att
adugarea ct i extragerea unui element se poate face de
pe orice poziie.

Exist mai multe tipuri de liste:


Liste simplu nlnuite
Liste dublu nlnuite
Liste circulare
Stive, cozi(cazuri particulare de liste)
next

Lista simplu nlnuit este o structur de forma:


inf

urm

inf

urm

inf

urm

...........

inf

nil

ultim

prim

Nodurile unei liste simplu nlnuite prezint dou zone :


informaia
util

Inf

adres de
legtur

urm

type adresa=^ nod ;


nod= record
inf :tip_informaie;
urm : adres;
end;
Var prim ,ultim :adres

Observaie :
Ultimul element al listei (cel aflat la adresa
ultim) conine ca informaie de legtur valoarea
constantei predefinite nil, cu semnificaia c dup
acest element nu mai exist n list nici un alt
element .

Pentru a gestiona lista se folosesc dou variabile reper :


prim care conine adresa primului element din list ;
ultim care conine adresa ultimului element din list;

I.Crearea primului nod


II.Adugare de noduri :
adugare la sfritul listei
adugare la nceputul listei
adugare dup un nod precizat prin adres
adugare n faa unui nod precizat prin adres
III.tergerea unui nod din list
tergerea primului nod din list
tergerea ultimului nod din list
tergerea unui nod precizat prin valoare sau adres
IV.Parcurgerea listei
V.Cutarea unui nod n list

Crearea primului nod


Adugare de noduri :
adugare la sfritul listei
adugare la nceputul listei
adugare dup un nod precizat prin adres
adugare n faa unui nod precizat prin adres
tergerea unui nod din list
tergerea primului nod din list
tergerea ultimului nod din list
tergerea unui nod precizat prin adres
Parcurgerea listei
Cutarea unui nod n list

1. se aloc spaiu de memorie pentru noul nod


new (prim);

inf

urm

2. se completeaz informaia util din noul nod


inf nil
write (dati informatia :) ;
readln (prim^.inf) ;
prim
3. se completeaz zona de legtur cu nil
ultim
prim^.urm:=nil;
4. se memoreaz adresa nodului prim n pointerul ultim
ultim:=prim

Procedure creare_prim (var prim,ultim:adresa);


begin
new (prim) ;
write (dati informatia :) ;
readln (prim ^.inf) ;
prim ^.urm:=nil ;
ultim:=prim;
end;

Observaie :
Lista are un singur nod. Se
folosesc doi pointeri care-i
memoreaz adresa.

inf

urm

inf

urm

......

inf

urm

inf

urm

inf

urm

inf

urm

inf
inf

urm
nil

inf

nil

prim

1. se aloc spaiu in heap pentru noul nod


new(p);
2. completarea informaiei utile din nodul p
write(dati valoarea: );
readln(p^.inf);
3. se va completa zona de legtur a nodului
p cu valoarea constantei nill
p^.urm:=nil;
4. se leag nodul p la lista
ultim^.urm:=p;
5. se actualizeaz valoarea variabilei ultim cu
adresa lui p
ultim:=p;

ultim

procedure adaugare_sfarsit(var
ultim:adresa);
var p:adresa;
begin
new(p);
write(dati informatia:);
readln(p^.inf);
p^. urm:=nil;
ultim ^.urm:=p;
ultim:=p;
end;

inf

urm

inf

urm

inf urm

inf urm

prim

inf

......

1. se aloc spaiu n heap pentru un nou nod

notat p
new(p);
2. se completeaz informaia util
write(dati valoarea:);
read(p^.inf);
3. se completeaz zona de legtur a nodului p
cu adresa primului nod din lista
p ^.urm :=prim;
4.
se reactualizeaz adresa primului nod din lista
cu valoarea nodului p
prim:=p ;

urm

inf

urm

inf urm
inf

inf
inf

nil

ultim

procedure adaugare_inceput(var prim:adresa);


var p:adresa;
begin
new(p);
write(dati informatia:);
readln(p^. inf);
p ^.urm:=prim;
prim:=p;
end;

.....

inf

urm

inf

urm

inf

urm

inf

urm

inf urm

inf

urm

inf

urm

......

q^.urm
p^.urm

inf urm

1. se aloc spaiu n heap pentru noul nod

new(q);
2. se completeaz zona inf pentru noul nod
writeln(dati informatia:);
readln(q^.inf);
3. se leag noul nod la list
q^.urm:=p^.urm;
p^.urm:=q;

procedure adauga_dupa(p:adresa);
var q:adresa;
begin
new(q);
writeln(dati informatia:);
readln(q^.inf);
q^.urm:=p^.urm;
p^.urm:=q;
end;

inf

.....

urm

inf urm

inf

urm

inf

inf urm

inf

inf

urm

inf

urm

urm

urm

......

p^.urm
q^.urm

q
1. se aloc spaiu pentru noul nod q
new(q );
2. se copie informaia din nodul p n
nodul q
q^.inf:=p^.inf;
3. se citete noua informaie n p
write(dati informatia: );
readln(p^.inf);
4. se leag nodul q la list
q^.urm:=p^.urm;
5. se leag nodul p de nodul q
p^.urm:=q;

procedure adauga_in_fata(p:adresa);
var q:adresa;
begin
new(q);
q^.inf:=p^.inf;
write(dati informatia:);
readln(p^.inf);
q^.urm:=p^.urm;
p^.urm:=q;
end;

inf

urm

inf urm

prim
q

inf

inf urm

inf

urm

.................
q

1. se parcurge lista pentru a afla adresa


penultimului nod, adres pe care o vom
memora n pointerul q
q:= prim;
while q^.urm<>ultim do
q:=q^.urm;
2. penultimul nod va deveni ultimul dup
tergere, deci legtura sa urmtoare
devine nil
q^.urm:=nil;
3. se terge fizic ultimul nod
dispose(ultim);
4. se reactualizeaz valoarea pointerului
ultim
ultim:=q;

urm

inf

urm

nil
inf urm

inf

nil

ultim

ultim

Procedure sterge_ultim(var ultim:adresa);


var q:adresa;
begin
q:=prim;
while q^.urm<>ultim do
q:=q^.urm;
q^.urm:=nil;
dispose(ultim);
ultim:=q;
end;

inf

urm

urm

inf

urm

inf urm

inf urm

inf

urm

prim

p
prim

inf

1. se memoreaz adresa celui de-al doilea nod


din list n pointerul p, operatie necesar
ntruct dup tergere al doilea nod va deveni
primul
p:=prim^.urm;
2. se terge fizic primul nod
dispose(prim);
3. se reactualizeaz valoarea pointerului prim
prim:=p;

.............

Procedure sterge_prim(var prim:adresa);


var p:adresa;
begin
p:=prim^.urm;
dispose(prim);
prim:=p;
end;

inf

urm

inf urm

prim
q

urm

inf

urm

inf

urm

inf urm

inf

urm

inf

nil

inf

.........
q

1. se parcurge lista pentru a afla adresa nodului


aflat naintea cheii de adres p; adresa o
vom memora n pointerul q
q:= prim;
while q^.urm<>p do
q:=q^.urm;
2. adresa memorat n zona urm a nodului p va
fi reinut n zona urm a nodului q
q^.urm:=p^.urm
3. se terge fizic nodul p
dispose(p);

.........

p^.urm

Procedure sterge_dupa(p:adresa);
var q:adresa;
begin
q:=prim;
while q^.urm<>p do
q:=q^.urm
q^.urm:=p^.urm;
dispose(p);
end;

inf

urm

inf urm

inf

inf

urm

inf urm

...............

prim

urm

inf

urm

inf urm

inf

nil

ultim

Parcurgem nodurile liste cu ajutorul unui pointer p care, plecnd de la primul nod
va referi pe rnd fiecare nod al listei : prelucrm informaia din nodul p, mutm p la
urmtorul nod i prelucrarea continu.

Ct timp pointerul p nu a ajuns la sfritul


listei {p<>nil}:
- prelucrm informaia din nodul p (p^.inf)
- mutm pointerul p la nodul urmtor
{p:=p^.urm}

Procedure parcurgere(prim:adresa);
var p:adresa;
begin
p:=prim;
while p<>nil do
begin
{prelucrarea informatiei din nodul p}
p:=p^.urm;
end;
end;

Ct timp pointerul p nu a ajuns la sfritul listei {p<>nil} i informaia memorat


n zona inf a nodului curent este diferit de x :
- mutm pointerul p la nodul urmtor

Funcia returneaz :
- nil, dac valoarea x nu a fost gsit n list;
- adresa nodului ce are completat zona inf
cu valoarea memorat n variabila x;

Function cauta(prim:adresa;x:byte):adresa;
var p:adresa
begin
p:=prim;
while (p^.inf<>x) and (p<>nil) do
p:=p^.urm;
cauta:=p;
end;

1. se aloc spaiu pentru nodul prim


new(prim);
2. completarea zonei inf pentru noul nod
write(dati informatia:);
readln(prim^.inf);
nil inf nil
3. se va completa zona de legtur urm
cu constanta nil
prim
prim^.urm:=nil;
ultim
4. se va completa zona de legtur ant
cu valoarea constantei nil
Procedure creare_prim(var prim,ultim:adresa);
prin^.ant:=nil;
begin
5. pointerul ultim memoreaza adresa
new(prim);
nodului prim
write(dati informatia:);
ultim:=prim
readln(prim^.inf);
prim^.urm:=nil;
prim^.ant:=nil;
ultim:=prim;
end;

ant

..............

ant

inf
inf

urm
nil
urm

ultim
1. se aloc spaiu pentru noul nod p
new(p);
2. se completeaz zona inf cu informaia util
write(dati informatia);
readln(p^.inf);
3. completarea zonei urm cu constanta nil
p^.urm:=nil;
4. completarea zonei de legtur ant a
nodului p cu adresa ultimului nod din list
p^.ant:=ultim;
5. se leag nodul p de nodul ultim
ultim^.urm:=p;
6. se actualizeaz valoarea variabilei ultim
cu adresa lui p
ultim:=p;

ant inf

urm

ant

nil

inf

p
ultim

Procedure adaugare_sfarsit(var ultim:adresa);


var p:adresa;
begin
new(p);
write(dati informatia:);
readln(p^.inf);
p^.urm:=nil;
p^.ant:=ultim;
ultim^.urm:=p;
ultim:=p;
end;

ant

inf urm

ant inf

urm

nil

inf

ant
nil inf

urm

urm

..............

prim

1. alocarea spaiului n heap pentru noul nod


notat p
new(p);
2. completarea zonei inf cu informaia util
write(Dati informatia:);
readln(p^.inf);
3. completarea zonei de legtur ant a nodului
p cu constanta nil
p^.ant:=nil;
4. se leag nodul p de nodul prim
prim^.ant:=p;
p^.urm:=prim;
5. se actualizeaz adresa primului nod din list
cu valoarea nodului p
prim:=p;

Procedure adauga_in_fata(var prim:adresa);


var p:adresa;
begin
new(p);
write(dati informatia:);
readln(p^.inf);
p^.ant:=nil;
prim^.ant:=p;
p^.urm:=prim;
prim:=p;
end;

...

ant

inf

urm

ant inf

ant

urm

inf

urm

...

q^.urm
p^.urm

p
ant

urm

q
1. se aloc spaiu pentru noul nod q
new(q );
2. se copie informaia din nodul p n
nodul q
q^.inf:=p^.inf;
3. se citete noua informaie n p
write(dati informatia: );
readln(p^.inf);
4. se leag nodul q la list
q^.urm:=p^.urm;
p^.urm^.ant:=q;
p^.urm:=q;
q^.ant:=p;

Procedure adauga_in_fata(var p:adresa);


var q:adresa;
begin
new(q);
q^.inf:=p^.inf;
write(dati informatia:);
readln(p^.inf);
q^.urm:=p^.urm;
q^.urm^.ant:=q;
p^.urm:=q;
p^.ant:=p;
end;

...

ant

inf

urm

ant

inf

urm

ant

inf

urm

...

q^.urm
p^.urm

p
ant

inf

urm

q
1. se aloc spaiu pentru noul nod q
new(q );
2. se citete noua informaie n q
write(dati informatia: );
readln(q^.inf);
3. se leag nodul q la list
q^.urm:=p^.urm;
p^.urm^.ant:=q;
p^.urm:=q;
q^.ant:=p;

Procedure adauga_dup(var p:adresa);


var q:adresa;
begin
new(q);
write(dati informatia:);
readln(q^.inf);
q^.urm:=p^.urm;
q^.urm^.ant:=q;
p^.urm:=q;
p^.ant:=p;
end;

nil
prim

inf

urm

nil inf
ant

urm

..............

p
prim

1. memorm adresa celui de-al doilea nod din


list n pointerul p,operaie necesar
ntruct dup tergere al doilea nod va
deveni primul
p:=prim^.urm;
2. se completeaz zona de legtur ant a
pointerului p cu valoarea constantei nil
p^.ant:=nil;
3. se terge fizic primul nod
dispose(prim);
4. se reactualizeaz valoarea pointerului prim
prim:=p;

Procedure sterge_primul(var prim:adresa);


var p:adresa;
begin
p:=prim^.urm;
p^.ant:=nil;
dispose(prim);
prim:=p;
end;

....

ant

inf

p^.ant

urm

ant

inf

urm

1. deoarece nodul p se terge din list este necesar


crearea unor noi legturi ntre: nodul din faa nodului
p i nodul de dup nodul p
p^.ant^.urm:=p^.urm;
p^.urm^.ant:=p^.ant;
2. se terge fizic nodul p
dispose(p);

ant

inf

urm

..............

p^.urm
p^.ant^.urm

Procedure sterge_nod(p:adresa);
begin
p^.ant^.urm:=p^.urm;
p^.urm^.ant:=p^.ant;
dispose(p);
end;

Parcurgem nodurile liste cu ajutorul unui pointer p care, plecnd de la primul


nod va referi pe rnd fiecare nod al listei : prelucrm informaia din nodul p,mutm
p la urmtorul nod i prelucrarea continu.

Ct timp pointerul p nu a ajuns la sfritul


listei {p<>nil}:
- prelucrm informaia din nodul p (p^.inf)
- mutm pointerul p la nodul urmtor
{p:=p^.urm}

Procedure parcurgere(prim:adresa);
var p:adresa;
begin
p:=prim;
writeln;
write(rezultatul este:);
while p<>nil do
begin
{prelucrarea informatiei din nodul p }
p:=p^.urm;
end;
writeln;
end;

Ct timp pointerul p nu a ajuns la sfritul listei {p<>nil} i informaia memorat


n zona inf a nodului curent este diferit de x :
- mutm pointerul p la nodul urmtor
Funcia returneaz :
- nil, dac valoarea x nu a fost gsit n list;
- adresa nodului a crui zon inf este completat
cu valoarea memorat n variabila x;
Function cauta(prim:adresa;x:byte):adresa;
var p:adresa;
begin
p:=prim;
while( p<>nil) and (p^.inf<>x) do
p:=p^.urm;
cauta:=p;
end;

..............

ant

inf

urm

ant

inf

urm
nil

ultim^.ant
ultim
p
1. se memoreaz adresa penultimului nod din
list n nodul p
p:=ultim^.ant;
2. se completeaz zona urm a nodului p cu
valoarea constantei nil deoarece nodul p
va deveni ultimul nod din list
p^.urm:=nil;
3. se terge fizic ultimul nod din list
dispose(ultim);
4. se reactualizeaz valoarea pointerului ultim
ultim:=p;

ant

inf

nil

ultim

Procedure sterge_ultim(var ultim:adresa);


var p:adresa;
begin
p:=ultim^.ant;
p^.urm:=nil;
dispose(ultim);
ultim:=p;
end

Lista dublu nlnuit este o structur de forma

nil

inf

urm

ant inf

urm

.....

ant

inf

nil

ultim

prim

Nodurile unei liste dublu nlnuite prezint trei zone :


Adresa de
legtur cu
nodul anterior

ant

Adresa de

Informaia legtur cu
util
nodul urmtor

inf

urm

type adresa=^ nod ;


nod= record
inf :tip_informatie;
urm,ant : adresa;
end;
Var prim ,ultim :adres

Observaie :
Ultimul element al listei (cel aflat la adresa
ultim) conine ca informaie de legturcu nodul
urmtor valoarea constantei predefinite nil, cu
semnificaia c dup acest element nu mai exist
n list nici un alt element .Primul element al listei
(cel aflat la adresa prim) conine ca informaie de
legtur cu nodul anterior valoarea constantei nil,
cu semnificaia c naintea acestui nod nu mai
exist nici un alt element.

Pentru a gestiona lista se folosesc dou variabile reper :


prim care conine adresa primului element din list ;
ultim care conine adresa ultimului element din list;

The End
A elaborat:BivolElena
Profesor:Buimistru Sergiu

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