Structuri dinamice de date
Structurile dinamice
de date sunt date structurate ale caror componente se aloca in mod dinamic.
Avantajul alocarii
dinamice fata de alocarea acelorasi structuri de date in mod static (in
segmentul de date) sau volatil (in segmentul de stiva) sunt:
-
memorie suplimentara pentru programe
-
posibilitatea de a utiliza aceasta memorie
Alocarea
dinamica a componentelor structurii impune un mecanism prin care o noua
componenta aparuta este legata in succesiune logica de corpul structurii deja
format pana atunci. Rezulta ca fiecare componenta, pe langa informatia
propriu-zisa pe care o detine, trebuie sa contina si o informatie de legatura
cu componenta cu care se leaga logic in succesiune. Aceasta informatie de
legatura va fi adresa componentei spre care se realizeaza succesiunea logica,
iar mecanismul se mai numeste si alocare
inlantuita dupa adrese.
In HEAP, structura
respectiva va avea zone alocate componentelor sale in locurile gasite
disponibile, care nu se succed intotdeauna in ordinea in care este realizata
inlantuirea logica.
In functie de tipul
inlantuirii realizate intre componente, exista urmatoarele tipuri de
organizari:
-
structuri liniare (de exeplu o lista care
prelucreaza elevii care se inscriu la un examen)
o
liste simplu inlantuite (liniare si circulare)
o
liste dublu inlantuite (liniare si circulare)
-
structuri arborescente (de exemplu reteaua ierarhica
a angajatilor dintr-o firma)
-
structuri retea (de exemplu o retea de orase
care schimba materiale, combustibili etc)
O componenta a unei
liste simplu inlantuite se declara ca o data structurata de tip inregistrare,
formata din doua campuri: informatia propriu-zisa (care poate fi de orice tip:
numeric, caracter, pointer, tablou, inregistrare) si informatia de legatura
(adresa la care e memorata urmatoarea componenta). Ultima componenta va avea
informatia de legatura NULL, cu semnificatia ca dupa ea nu mai urmeaza nimic (retine
adresa „nici o adresa” a urmatoarei componente).
Se poate defini un tip de date structurat numit
nod, ale carui campuri le
numim info si next.
De exemplu, pentru o
lista de numere reale, putem defini:
struct nod
{float info;
nod
*next;};
Componentele listei se
vor aloca dinamic. Avem nevoie de o variabila statica sau locala cu ajutorul
careia sa putem accesa primul element al listei. Fie acesta cap. Cu
ajutorul ei putem accesa prima componenta, care contine o legatura catre ce-a
de-a doua etc. Din aproape in aproape putem ajunge la ultimul element al
listei.
nod *cap;
Referirea la informatia primului nod al listei se va face astfel:
cap->info
Referirea la adresa la care e memorat al doilea nod al listei se va face
astfel:
cap->next
Referirea la informatia celui de-al nod al listei se va face astfel:
cap->next->info
Operatiile care se pot face utilizand liste simplu 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
Aplicatie: Sa se implementeze operatiile cu liste
liniare simplu inlantuite. Se va realiza cate o functie pentru fiecare
operatie.