Sunteți pe pagina 1din 44

CAPITOLUL 5.

STRUCTURI DE DATE
5.1. INTRODUCERE
Cea mai simpl[ ]i mai sugestiv[ defini\ie a informaticii este urm[toarea:
informatica = studiul algoritmilor ]i datelor.
Unul dintre principalele obiective ale informaticii @l reprezint[ studiul
algoritmilor. Acest studiu are @n vedere urm[toarele probleme:
ma]ini pentru execu\ia algoritmilor, care se ocup[ cu studiul metodelor de
proiectare, organizare ]i construc\ie a unor ma]ini de calcul dedicate
execu\iei eficace a algoritmilor;
limbaje pentru exprimarea algoritmilor, care se ocup[ cu studiul metodelor
de exprimare precis[ a unui algoritm @ntr-un limbaj adecvat, de la nivelul
abstract, foarte concis, p`n[ la programul detaliat @ntr-un limbaj de
programare;
fundamentele algoritmilor., care se ocup[ cu g[sirea unor r[spunsuri la
@ntreb[ri de genul:
problema P poate fi rezolvat[ algoritmic ?
care este num[rul minim de opera\ii necesare oric[rui algoritm de
rezolvare a problemei P ?
analiza algoritmilor, care are ca obiectiv ob\inerea unui profil de performan\
[ al unui algoritm dat, @n termenii timpului de calcul ]i volumului de
memorie necesare pentru execu\ia sa;
validarea algoritmilor, care are ca obiectiv stabilirea corectitudinii unui
anumit algoritm, adic[ dac[ el determin[ solu\ia corect[ a unei probleme
dintr-o familie dat[ de probleme, pentru toate intr[rile admisibile posibile.
Dup[ cum se ]tie, toate calculatoarele moderne stocheaz[, reg[sesc ]i
189

prelucreaz[ date. #n plus, orice algoritm se caracterizeaz[ printr-o mul\ime de


date de intrare ]i o mul\ime de date de ie]ire. Studiul datelor pune @n discu\ie
urm[toarele probleme:
ma]ini pentru stocarea datelor;
limbaje de descriere a manipul[rii datelor;
fundamente care descriu ce date putem ob\ine prelucr`nd date primare;
structuri de reprezentare a datelor.
Exist[ o leg[tur[ intim[ @ntre modul de structurare a datelor ]i sinteza
algoritmilor. Aceast[ leg[tur[ este concentrat[ @n urm[toarea formul[ metaforic[
apar\in`nd lui Niklaus Wirth ''algoritm + structuri de date = programe''.
Principalul obiectiv al structurilor de date const[ @n explorarea diverselor
modalit[\i de structurare a datelor ]i, pentru fiecare @n parte, identificarea
clasei de opera\ii care pot fi executate asupra sa ]i nu @n ultimul r`nd modul de
reprezentare @n calculator al obiectelor apar\in`nd structurii respective astfel
@nc`t aceste opera\ii s[ poat[ fi executate c`t mai eficient. Studiul structurilor
de date are drept scop final @nsu]irea ]i st[p`nirea urm[toarelor dou[ tehnici
fundamentale:
proiectarea unor reprezent[ri adecvate ale datelor
proiectarea ]i analiza algoritmilor care opereaz[ cu aceste reprezent[ri

5.2. TIPURI }I STRUCTURI DE DATE


No\iunile de tip de date ]i structur[ de date sunt folosite deseori drept
sinonime @n referirile la datele prelucrate ]i modul lor de organizare @n cadrul
unui algoritm au program. Cu toate acestea @ntre aceste dou[ no\iuni
fundamentale exist[ diferen\e subtile, ele fiind relevate @n cele ce urmeaz[.
Tipuri de date. #n matematic[ se obi]nuie]te s[ se clasifice variabilele
folosite @n func\ie de anumite caracteristici. Spre exemplu, se face o distinc\ie
190

clar[ @ntre variabilele logice, reale ]i complexe sau @ntre variabile repezent`nd
valori individule (scalare) ]i variabile reprezent`nd colec\ii de valori - mul\imi
sau vectori sau @ntre func\ii, func\ionale ]i mul\imi de func\ii, etc.
Aceast[ clasificare este cel pu\in la fel de important[ @n prelucrarea datelor.
Astfel, @n programare este valabil urm[torul principiu: orice constant[,
variabil[, expresie sau func\ie se caracterizeaz[ printr-un anumit tip de date.
Se nume]te tip o mul\ime de elemente numite valori sau obiecte, care pot
fi clar distinse @ntre ele. #ntr-un limbaj de programare orice constant[ apar\ine
unui anumit tip, orice variabil[ poate stoca valori de un anumit tip, orice
expresie se evalueaz[ la o valoare de un anumit tip ]i orice func\ie @ntoarce o
valoare de un anumit tip.
Orice limbaj de programare furnizeaz[ o mul\ime de tipuri predefinite.
Acest lucru @nseamn[ c[ limbajul permite folosirea variabilelor de tipul
respectiv ]i furnizeaz[ o mul\ime de opera\ii predefinite pentru manipularea
acestor variabile @n cadrul unui program. Anumite tipuri de date predefinite
corespund cu exactitate limbajului ma]in[ al calculatorului respectiv. Un
exemplu @l reprezint[ tipurile @ntreg ]i real. Atragem aten\ia c[ este
@ns[ posibil ca limbajul de programare s[ furnizeze tipul predefinit @ntreg
reprezentabil pe dou[ cuvinte de memorie, @n timp ce @ntregii din limbajul
ma]in[ sunt reprezenta\i pe un singur cuv`nt de memorie. Limbajele moderne de
programare ]i tipuri predefinite compuse, cum sunt spre exemplu vectorii
(Pascal, C, Fortran, Basic), structurile (Pascal, C, Cobol), ]irurile de caractere
(Snobol, Turbo Pascal) sau chiar listele (Lisp).
O observa\ie important[ este c[ tipurile de date nu trebuie confundate cu
echivalentele lor din matematic[. Spre exemplu, tipul @ntreg din programare nu
trebuie confundat cu mul\imea Z a numerelor @ntregi din matematic[.
Datorit[ reprezent[rii finite, tipul @ntreg din programare con\ine o mul\ime
finit[ de elemente @n timp ce mul\imea Z este infinit[. Cu toate acestea, de cele
mai multe ori se face abstrac\ie de aceast[ distinc\ie, ea fiind luat[ @n
191

considerare c`nd este semnificativ[ (de exemplu c`nd apare posibilitatea unor
dep[]iri, precizia este insuficient[ @n calcule, etc.).
#n concluzie, din punctul de vedere al modului de definire @n raport cu
un anumit limbaj (de programare), tipurile de date se clasific[ @n tipuri
predefinit ]i tipuri definite de utilizator. #n general, obiectele unui limbaj de
programare apar\in uneia dintre urm[toarele categorii: constante, variabile,
expresii ]i func\ii. Tipul unei constante rezult[ din forma sintactic[ (modul de
scriere) a acesteia. #n limbajele moderne de programare (Pascal, C), tipul unei
variabile rezult[ prin specificarea @n program a unui enun\ special numit
declara\ie. #n mod normal, declara\ia unei variabile trebuie s[ precead[ @n
program folosirii variabilei respective. Tipul unei expresii rezult[ din tipurile
operanzilor ]i modul lor de compunere cu ajutorul operatorilor. Tipul unei
func\ii rezult[ ca ]i @n cazul variabilelor din declara\ia func\iei. Declara\ia
func\iei precizeaz[ tipurile argumentelor ]i tipul valorii de retur. @n unele
limbaje, cum este limbajul C, se face distinc\ie @ntre declara\ia ]i defini\ia unei
variabile sau func\ii.
Se nume]te declara\ie un enun\ care asociaz[ o variabil[ sau o func\ie cu
tipul s[u. Se nume]te defini\ie un enun\ care asociaz[ o variabil[ sau func\ie cu
tipul s[u ]i aloc[ spa\iu de memorie variabilei sau corpului func\iei respective.
Tipurile de date se pot clasifica dup[ diverse criterii. Am v[zut deja o
astfel de clasificare @n tipuri predefinite ]i tipuri definite de utilizator.
Dup[ cum un tip de date se define]te sau nu @n termenii altor tipuri de date
avem tipuri primitive ]i tipuri derivate. Dac[ un obiect se poate descompune @n
mai multe componente, atunci el se nume]te obiect compus, altfel se nume]te
obiect simplu sau scalar. Un tip de date ale c[rui valori sunt compuse se nume]te
tip compus, altfel se nume]te tip simplu sau scalar.
Un tip de date se nume]te dac[ pe mul\imea valorilor sale se poate defini
o rela\ie de ordine. #n caz contrar el se nume]te neordonat. Spre exemplu, @n
C, @ntregii, caracterele ]i realii reprezint[ tipuri ordonate. Un tip ordonat nu
192

trebuie confundat cu un tip ordinal, pe care se poate defini o rela\ie de ordonare


liniar[. O astfel de rela\ie face posibil[ definirea predecesorului ]i respectiv
succesorului unui element. Un tip ordinal modeleaz[ o mul\ime finit[ sau
num[rabil[. Spre exemplu, @n C, caracterele sunt un tip ordinal, @n timp ce
realii nu.
Num[rul de valori distincte apar\in`nd unui tip

T se nume]te

cardinalitatea lui T ]i se noteaz[ cu |T|. Acest num[r ne furnizeaz[ o m[sur[ a


volumului de memorie necesar pentru reprezentarea unei variabile cu tipul T.
Structuri de date. No\iunea de structur[ de date, spre deosebire de
no\iunea de tip de date, desemneaz[, pe l`ng[ mul\imea de obiecte care
alc[tuiesc un anumit tip, propriet[\ile obiectelor, rela\iile dintre obiecte ]i
opera\iile asupra obiectelor. Defini\ia unei structuri de date se compune din trei
p[r\i:
numele structurii
opera\iile asupra structurii
propriet[\ile structurii
Opera\iile asupra valorilor unei structuri de date se reprezint[ cu ajutorul
func\iilor. De obicei, aplicarea unei func\ii se noteaz[ utiliz`nd nota\ia
func\ional[. Aplicarea unei func\ii se poate simboliza ]i cu ajutorul nota\iei
operatoriale, prin omiterea parantezelor ]i virgulelor. Nota\ia operatorial[ poate
fi prefixat[ sau postfixat[. @n cadrul opera\iilor aplicabile obiectelor unei
structuri de date se eviden\iaz[ opera\iile de baz[, care se clasific[ @n
urm[toarele categorii:
constructori: specific[ modul de generare a noi obiecte apar\in`nd structurii
respective. Atunci c`nd gestiunea obiectelor se face explicit de programator
se pun @n eviden\[ prin constrast opera\iile destructor care au rolul de a
elibera memoria alocat[ obiectelor, atunci c`nd acestea nu mai sunt necesare;
193

selectori: specific[ cum se acceseaz[ elementele care compun un obiect


compus;
modificatori: specific[ cum se actualizeaz[ elementele care compun un
obiect compus;
recunosc[tori: se recunosc pentru recunoa]terea diverselor propriet[ti ale
obiectelor apar\in`nd structurii respective;
testori: se folosesc pentru compararea obiectelor apar\in`nd structurii
respective.
Propriet[\ile unei structuri de date descriu cu exactitate modul @n care
trebuie s[ func\ioneze opera\iile structurii, dar nu descriu modul @n care trebuie
implementate opera\iile structurii ( exprima maniera @n care trebuie
s[ func\ioneze opera\iile structurii, indiferent de modul lor de implementare).
Cu alte cuvinte, propriet[\ile abstractizeaz[ opera\iile de modul lor de
implementare. Din acest motiv, no\iunea de structur[ de date este cunoscut[ ]i
sub numele de tip abstract de date, iar aceast[ manier[ de definire a structurilor
de date se nume]te abstractizarea datelor.
Se nume]te structur[ de date un tuplu S = {D, d, O, P}, unde:
D este o mul\ime de tipuri de date implicate @n definirea lui S
d este tipul de date al obiectelor structurii S
este mul\imea opera\iilor definite pe structura S
P este mul\imea propriet[\ilor structurii S
Definirea unei structuri de date nu trebuie confundat[ cu modul ei de
implementare. O implementare a unei structuri de date S este o transfomare care
define]te modul de reprezentare al obiectelor apar\in`nd tipului de date al
structurii @n func\ie de obiectele altei structuri de date T. #n plus, fiecare
opera\ie a lui S trebuie definit[ @n termenii opera\iilor lui T.
194

5.3. TIPURI DE DATE FUNDAMENTALE


Obiecte ]i tipuri. Limbajele de programare pun la dispozi\ia
programatorilor obiecte specifice cu care ace]tia urmeaz[ s[ ''simuleze''
reprezent[rile lor mentale asupra obiectelor din universul problemei. De
asemenea, limbajele de programare posed[ ]i mijloace de asociere a valorilor
din universul limbajului de programare @n scopul cre[rii de obiecte noi cu
propriet[\i noi. Tipurile obiectelor din prima categorie se numesc predefinite sau
fundamentale. Tipurile obiectelor din a doua categorie se numesc definite de
programator. Tipurile predefinite se @mpart la r`ndul lor @n primitive sau
elementare ]i structurate sau compuse. Obiectele elementare sunt elemente
indivizibile ale universului limbajului de programare, iar structura lor intern[ nu
este de regul[ accesibil[ programatorului. Spre deosebire de obiectele
elementare, obiectele structurate sunt alc[tuite din mai multe componente, toate
accesibile programatorului. Componentele pot fi elementare sau pot fi la r`ndul
lor structurate. #ntre componentele unui obiect structurat exist[ de
regul[ anumite rela\ii, specifice structurii respective, stabilite odat[ cu crearea ei.
Explicitarea obiectelor ]i tipurilor contribuie @n mare m[sur[ la cre]terea
lizibilit[\ii algoritmilor.
Tipuri de date primitive
Cele mai @nt`lnite tipuri primitive @n limbajele moderne de
programare sunt:
tipurile numerice: sunt reprezent[ri ale unor mul\imi de numere cunoscute
din matematic[, precum N, Z sau R. Vom avea @n consecin\[ date @ntregi
f[r[ semn, @ntregi cu semn sau reali;
tipul caracter: este destinat reprezent[rii caracterelor alfanumerice;
tipul logic: este destinat reprezent[rii mul\imii valorilor logice {fals,
adevarat};
tipul enumerare: este destinat reprezent[rii unei mul\imi finite de valori,
195

fiecare valoare fiind desemnat[ printr-un nume simbolic;


tipul subdomeniu: este destinat reprezent[rii unui interval al unui tip ordonat
liniar;
tipul referin\[: este destinat reprezent[rii adreselor altor obiecte. Tipul
referin\[ se utilizeaz[ de obicei pentru implementarea unor obiecte abstracte
complexe cum sunt listele ]i arborii.
Tipul @ntreg
Tipul @ntreg este destinat reprezent[rii unei submul\imi a numerelor
@ntregi. Uneori se face distinc\ie @ntre @ntregii f[r[ semn ]i @ntregii cu
semn. @ntregii f[r[ semn sunt numere @ntregi pozitive (naturale), @n timp ce
@ntregii cu semn pot fi at`t pozitivi c`t ]i negativi. Tipul @ntreg f[r[ semn
corespunde mul\imii N ]i tipul @ntreg cu semn corespunde mul\imii Z.
Tipul real
Tipul real modeleaz[ o submul\ime a numerelor reale. @n timp ce
aritmetica @ntregilor produce @ntotdeauna rezultate exacte (@n limitele de
reprezentare), aritmetica realilor admite existen\a unor erori de rotunjire. Aceste
erori sunt cauzate de faptul c[ reprezentarea intern[ a realilor este finit[. Acesta
este principalul motiv pentu care se face o distinc\ie explicit[ @ntre tipurile
numerice

@ntreg

]i

real

din

majoritatea

limbajelor

de

progrmare.

Datorit[ faptului c[ mul\imea R a numerelor reale din matematic[ este


nenum[rabil[, structura de date R este dificil de definit @n mod abstract.
Tipul logic
Tipul logic este destinat reprezent[rii mul\imii valorilor {adev[rat, fals}.
Asupra obiectelor de acest tip se pot aplica opera\ii logice de tipul ]i, sau, nu,
xor, etc., @n func\ie de facilit[\ile oferite de limbajul de programare utilizat.
Unele limbaje de programare nu furnizeaz[ acest tip de date, utiliz`ndu-se @n
196

locul s[u obiecte de tip numeric care sunt restric\ionate la dou[ valori: 0 ]i 1
(cum este cazul limbajului C).
Tipul caracter
De]i la @nceput calculatoarele numerice erau destinate @n special
realiz[rii unor prelucr[ri numerice, ulterior s-a constatat c[ este posibil[ folosirea
acestora ]i pentru implementarea unor prelucr[ri cu un pronun\at caracter
nenumeric. Un astfel de exemplu @l reprezint[ procesarea textelor. @n acest
scop este necesar[ reprezentarea @n cadrul programelor a caracterelor afi]abile,
pentru aceasta folosindu-se tipul caracter. Tipul caracter modeleaz[ mul\imea
finit[ a tuturor caracterelor afi]abile. Din nefericire, nu exist[ un set standard de
caractere specific tuturor sistemelor de calcul. Din acest motiv, termenul
''standard'' trebuie interpretat @n acest context ca referindu-se la sistemul de
calcul particular pe care este executat programul @n cauz[. Cel mai folosit set
''standard'' de caractere este cel definit de Organiza\ia Interna\ional[ pentru
Standarde (ISO) ]i anume versiunea sa american[ -- codul ASCII, care
const[ din 128 de caractere, dintre care primele 33 sunt caractere de control, iar
celelalte 95 sunt caractere afi]abile. Caracterele sunt codificate intern prin valori
@ntregi numite coduri. Deoarece codul ASCII are 128 de caractere, pentru
codificarea caracterelor sale sunt suficien\i 7 bi\i. Cu tote acestea, se folose]te
pentru codificare un octet, deoarece memoria intern[ a sistemelor de calcul este
structurat[ de obicei sub forma unei secven\e de loca\ii cu dimensiunea de un
octet. Principalul dezavantaj al codului ASCII este c[ permite un set de maxim
256 caractere (@n versiunea sa extins[ !). Exist[ ]i seturi de caractere care
con\in mai mult de 256 de elemente ]i nu pot fi @n consecin\[ codificate pe un
singur octet. Din acest motiv a fost introdus[ specifica\ia standard Unicode
pentru reprezentarea seturilor de caractere care nu se pot reprezenta pe un
singur octet (cum este cazul limbii chineze sau japoneze). Un caracter dintr-un
astfel de set se nume]te caracter larg ]i pentru reprezentarea sa se folosesc doi
197

octe\i. Orice caracter utilizat @n tehnica de calcul modern[ poate fi reprezentat


cu ajutorul specifica\iei Unicode sub forma unui caracter larg. Pentru ca
algoritmii care folosesc tipul caracter s[ depind[ c`t mai pu\in de setul de
caractere utilizat, exist[ c`teva propriet[\i specifice tuturor seturilor de caractere:
tipul caracter con\ine cele 26 de litere latine ]i cele 10 cifre arabe, c`t ]i un
num[r de caractere de punctua\ie, cum sunt ; : " . , ? / + - etc.
subseturile literelor ]i cifrelor sunt ordonate ]i coerente;
tipul caracter con\ine caracterul blanc (spa\iu) care poate fi folosit ca
separator.
Tipul caracter este un tip ordinal, fiind definit[ @n consecin\[ func\ia
standard ord care @ntoarce codul numeric al unui caracter. Inversa func\iei ord
este @n cazul tipului caracter func\ia chr.
Tipul enumerare
Deseori este necesar[ definirea unui tip de date prin indicarea explicit[ a
elementelor sale. @n aceste situa\ii se folose]te tipul enumerare. Tipul
enumerare se utilizeaz[ pentru reprezentarea unei mul\imi finite de elemente.
Fiecare element se desemneaz[ de obicei printr-un nume simbolic. C`teva
exemple de tipuri enumerare sunt urm[toarele: {masculin,feminin}, {soldat,
caporal, sergent, locotenent, capitan, maior, colonel, general}, {rosu, galben,
verde}, {luni, marti, miercuri, joi, vineri, sambata, duminica}, {tren, autobuz,
automobil, barca, avion}.
Elementele unui tip enumerare sunt considerate ordonate liniar, fiind
posibil[ definirea predecesorului ]i respectiv urm[torului element. Din acest
motiv un tip enumerare poate sta la baza definirii unui tip subdomeniu.
Tipul enumerare este definit ''explicit'', prin enumerarea tuturor
elementelor sale. Cel pu\in @n principiu, putem de asemenea defini ''implicit''
un tip de date, prin enun\area unei propriet[\i a elementelor sale.
198

Tipul subdomeniu
O mul\ime se nume]te ordonat[ liniar dac[ putem enumera toate
elementele sale. Spre exemplu, tipurile @ntreg, caracter, logic ]i enumerare
modeleaz[ mul\imi ordonate liniar. Din acest motiv aceste tipuri se numesc
tipuri ordinale. Un tip ordinal nu trebuie confunat cu un tip ordonat (pe care s-a
definit o rela\ie de ordine). Spre exemplu, @ntregii ]i realii sunt tipuri ordonate,
dar tipul real nu este ordinal. Din punct de vedere matematic, un tip ordinal
modeleaz[ o mul\ime de elemente finit[ sau num[rabil[. Se ]tie c[ mul\imea
numerelor reale nu este num[rabil[ ]i de aceea tipul real nu este un tip ordinal.
Caracteristica esen\ial[ a unui tip ordinal este c[ putem vorbi despre succesorul ]
i predecesorul unui element. De exemplu, succesorul lui 4 este 5, iar succesorul
lui `c` este `d`. Deseori o variabil[ poate lua valori doar @ntr-un interval al unei
mul\imi ordonate liniar. Fie T un tip ordonat liniar ]i fie min ]i max limita
inferioar[, respectiv superioar[ a unui interval din T. Se nume]te tip subdomeniu
acel tip de date care modeleaz[ valorile din intervalul [min...max]. C`teva
exemple

de

tipuri

subdomeniu

sunt:

[`a`..`z`],

[luni..vineri],

[locotenent..general], [1900..2100].
Tipurile subdomeniu se utilizeaz[ de obicei pentru reprezentarea indicilor
tablourilor.
Tipul referin\[
Numeroase prelucr[ri se refer[ la rela\iile dintre obiectele prelucrate ]i nu
doar la valorile lor. #n astfel de cazuri poate fi necesar[ reprezentarea explicit[ a
acestor rela\ii. Pentru aceasta, anumite obiecte trebuie s[ se poat[ referi la alte
obiecte. Este posibil chiar ca un acela]i obiect s[ fie referit din dou[ sau mai
multe locuri. #ntruc`t copierea valorii obiectului @n locul de unde a fost referit
nu este o solu\ie acceptabil[ datorit[ consumului mare de memorie ]i
dificult[\ilor de men\inere a consisten\ei, rezult[ c[ trebuie apelat la o alt[ tehnic[
199

]i anume de a defini @n program obiecte care s[ poat[ referi alte obiecte. Pentru
aceasta se folosesc tipul referin\[ ]i obiectele pointer.
Fiind dat un obiect o de tip T, el poate fi referit utiliz`nd un obiect de
tipul referin\[ la T. Vom nota acest tip Ref( T). Putem de asemenea defini
referin\e la obiecte pointer. Se obi]nuie]te ca ''leg[turile'' create @ntre obiecte
prin intermediul pointerilor s[ se reprezinte grafic. Deseori trebuie s[ lucr[m cu
referin\e c[tre obiecte al c[ror tip nu @l cunoa]tem. Pentru aceasta se folose]te
tipul referin\[ generic[, desemnat prin cuv`ntul cheie ref. O referin\[ la un obiect
se implementeaz[ ca adres[ a loca\iei de memorie, corespunz[toare obiectului
respectiv. Opera\ia ref devine astfel opera\ia de @nc[rcare a adresei unui obiect.
Opera\ia deref se implementeaz[ utiliz[nd tehnica adres[rii indirecte, prin care o
anumit[ valoare este interpretat[ drept adresa unei loca\ii de memorie de unde se
va extrage valoarea propriu-zis[. Limbajele de programare difer[ @n general
prin libertatea pe care o ofer[ programatorului @n lucrul cu pointeri. Spre
exemplu, limbajul Pascal nu permite dec`t o serie de opera\ii de baz[ asupra
pointerilor, @n timp ce limbajul C este cu mult mai @ng[duitor, permi\`nd
chiar efectuarea de opera\ii aritmetice cu pointeri.
Din cele discutate p`n[ acum, singura modalitate de a crea obiecte o
constituie declararea acestora. O declara\ie are ca efect alocarea memoriei
pentru obiectul respectiv la momentul compil[rii programului, obiectul fiind
creat la @nc[rcarea programului, deci @naintea execu\iei sale efective.
Aceast[ modalitate de alocare a memoriei se nume]te static[.
Principala caracteristic[ a acestui mod de alocare este faptul c[ obiectele
sunt referite @n program prin identificatorul introdus la declararea lor. Acest
lucru este posibil deoarece asocierea dintre identificator ]i loca\ia de memorie
rezervat[ obiectului s-a f[cut @n faza de compilare a programului.
Obiectele pot fi @ns[ create ]i la momentul execu\iei. Aceast[ modalitate
de alocare a memoriei se nume]te dinamic[. Un astfel de obiect nu va putea fi
@ns[ accesibil prin program utiliz[nd un identificator, deoarce momentul
200

execu\iei succede momentului compil[rii programului. Din acest motiv, un


obiect creat dinamic se nume]te ]i obiect anonim. O modalitate elegant[ de a
accesa obiectele create dinamic o constituie utilizarea tipului referin\[. Pentru
aceasta se introduce operatorul nou care prime]te un tip T ]i creaz[ un obiect
apar\in`nd lui T, @ntorc`nd o referin\[ la T. Fie mul\imea tuturor tipurilor ]i
Ref mul\imea tuturor referin\elor. Dac[ operatorul nou @ntoarce referin\a vid[
vid, atunci @nseamn[ c[ obiectul nu a putut fi creat. Dac[ valoarea
@ntoars[ este vid, atunci obiectul a fost creat ]i el poate fi accesat utiliz`nd
numele deref(p). Opera\ia invers[ aloc[rii dinamice a unui obiect este eliberarea
memoriei alocate. Aceast[ opera\ie se poate realiza automat, atunci c`nd
obiectul respectiv nu mai este referit @n program sau manual de c[tre
programator prin apelul operatorului standard elib.
Tipuri de date compuse
Din punct de vedere conceptual, orice obiect compus este un n-tuplu o =(
o1,o2,...,on), de obiecte oi, 1 i n, n 2, fiecare obiect oi av`nd tipul Ti. Tipul
lui o este tipul compus T = ( T1,...,Tn ). Fiecare dintre tipurile Ti poate fi la
r`ndul s[u primitiv sau compus. Pentru orice tip compus, pe l`ng[ opera\iile
fundamentale de atribuire ]i test de egalitate/inegalitate, se mai definesc de
obicei urm[toarele dou[:
operatorul constructor, care construie]te un obiect compus o=(o 1,o2,...,on),
din obiectele componente oi, 1 i n
operatorul de selec\ie, care permite accesul at`t @n citire c`t ]i @n scriere la
fiecare dintre componentele unui obiect compus.
Pentru referirea comod[ a tipurilor compuse se introduc identificatori.
Cele mai cunoscute tipuri compuse sunt tipul agregat (@nregistrare sau
structur[) ]i tipul tablou (masiv sau vector).
201

Tipul agregat
Un obiect agregat, numit ]i @nregistrare sau structur[, este un obiect
compus ale c[rui componente (numite ]i c`mpuri) sunt eterogene (au tipuri
diferite) ]i au fiecare asociat c`te un nume simbolic, folosit @n cadrul opera\iei
de selec\ie. Un tip agregat este definit pornind de la o mul\ime S de selectori ]i o
mul\ime de tipuri asociate selectorilor printr-o func\ie bijectiv[ T : S.
C`teva exemple sunt urm[toarele: complex = (real,imaginar), data = (zi,
luna, an), persoana = (nume, prenume, data_nasterii, adresa).
Pentru a se indica accesul la componenta S a unui obiect agregat o, se
folose]te @n majoritatea limbajelor (pseudocod, Pascal, C) nota\ia o.S.
Cardinalitatea tipului compus agregat este egal[ cu produsul cardinalit[\ilor
tipurilor sale componente.
La nivelul implement[rii, unui obiect agregat @i corespunde o
zon[ compact[ de memorie a c[rei m[rime rezult[ din m[rimile componentelor
obiectului repectiv. Dac[ se notez[ cu M(S) m[rimea componentei S a unui
obiect agregat o atunci m[rimea zonei de memorie alocat[ lui o, notat[ cu M, se
determin[ cu formula: M = M(S). Orice referin\[ la un c`mp al unui obiect
agregat se transform[ @n distan\a zonei alocate acestuia fa\[ de @nceputul
zonei alocat[ obiectului. Distan\ele se calculeaz[ de regul[ la momentul
compil[rii programului. Accesarea unui c`mp al un agregat se implementeaz[ de
regul[ utiliz`nd tehnica adres[rii relative.
Tipul tablou
Deseori este necesar[ folosirea unui tip compus ale c[rui componente
sunt toate de acela]i tip. Un astfel de tip se nume]te omogen. @n plus, accesul
la componente are loc prin selectori care sunt elemente ale unei mul\imi finite ]i
ordonat[ liniar. #n aceste situa\ii se va folosi tipul tablou.
Tipul tablou se define]te pornind de la un tip de baz[ T care
modeleaz[ tipul componentelor ]i de la un tip subdomeniu I, care
202

modeleaz[ mul\imea selectorilor, numi\i @n acest caz indec]i. Pentru a se indica


accesul la componenta i a unui obiect tablou T se folose]te @n majoritatea
limbajelor (pseudocod, Pascal, C) nota\ia T[i].
La nivelul implement[rii, unui tablou @i corespunde o zon[ contigu[ de
memorie, carcterizat[ prin adres[ de @nceput ]i m[rime. S[ presupunem c[ min ]
i respectiv max sunt limitele inferioar[ ]i respectiv superioar[ ale indicilor
tabloului T ]i s[ presupunem de aasemenea c[ pentru reprezentarea unui element
al tabloului, apar\in`nd tipului de baz[ T, sunt necesare n cuvinte de memorie.
Rezult[ c[ zona de memorie alocat[ tabloului va avea (max-min+1)n celule, iar
zona @n care este memorat elementul T[i] va @ncepe la adresa A = B+(imin)n, unde B este adresa de @nceput a zonei alocate tabloului. Accesarea unui
element al un tablou se implementeaz[ de regul[ utiliz`nd tehnica adres[rii
indexate.
O opera\ie frecvent @nt`lnit[ @n cazul tablourilor este determinarea
primului indice i al unei componente a tabloului a c[rei valoare este egal[ cu o
valoare dat[ x. Aceast[ opera\ie se nume]te c[utare. O modalitate de
implementare a acestei opera\ii se bazeaz[ pe scanarea secven\ial[ (element cu
element) a tabloului p`n[ la @nt`lnirea componentei c[utate sau p`n[ la
epuizarea tuturor elementelor tabloului. Aceast[ metod[ de c[utare se nume]te
c[utare secven\ial[. Opera\ia de c[utare poate fi realizat[ mai rapid
dac[ elementele vectorului sunt ordonate cresc[tor. @n acest caz, la fiecare pas
de c[utare intervalul de c[utare va fi restr`ns la jum[tate. Ini\ial, intervalul de
c[utare este 1..n. Aceast[ metod[ de c[utare se nume]te c[utare binar[ (prin
@njum[t[\irea intervalului).
Tipul mul\ime
Numero]i algoritmi prelucreaz[ colec\ii de obiecte @n care ordinea
elementelor nu conteaz[. @n astfel de situa\ii se recomand[ folosirea tipului
mul\ime. Tipul mul\ime se define]te pornind de la un tip de baz[ T ]i
203

reprezint[ toate submul\imile lui T. Un astfel de tip se mai nume]te ]i mul\imea


putere a lui T ]i se noteaz[ cu 2T sau P(T).
C`teva exemple sunt urm[toarele: litera = [A..Z], vocala = [A, E, I, O,
U], etc.
Pentru reprezentarea intern[ a obiectelor de tip mul\ime se folose]te de
obicei func\ia caracteristic[. Fie U o mul\ime numit[ mul\ime universal[. Orice
submul\ime X U se reprezint[ cu ajutorul func\iei caracteristice X:U
{0,1}, definit[ astfel:
X (u) =1, daca u x
X (u) =0, daca u x
Valorile func\iei caracteristice se reprezint[ intern utiliz`nd un singur bit.
Dac[ avem de reprezentat submul\imile unei mul\imi U cu n elemente, atunci
pentru reprezentare vor fi necesari n bi\i. S[ presupunem c[ lungimea unui
cuv`nt calculator este c bi\i. Atunci pentru reprezentarea unei submul\imi X U
vor fi necesare [n/c] cuvinte ([] este partea @ntreag[ majorat[). Testarea
apartenen\ei unui element la o mul\ime se face efectu`nd un ]i la nivel de bit cu
o masc[ corespunz[toare elementului ]i verific`nd apoi dac[ rezultatul este
nenul. Opera\ia de incluziune se implementeaz[ printr-o opera\ie ]i la nivel de
bit cu o masc[ corespunz[toare submul\imii ]i verific`nd apoi dac[ rezultatul este
identic cu masca. Opera\ia de complementare se implementeaz[ utiliz`nd o
instruc\iune ma]in[ de complementare bit cu bit a unui cuv`nt.
Tipuri cu variante
#n practic[ este uneori convenabil s[ se considere c[ mai multe tipuri
diferite sunt variante ale aceluia]i tip. #n acest caz se va defini un tip cu variante
a c[rui mul\ime de valori este egal[ cu reuniunea disjunct[ a tipurilor ini\iale. Un
tip cu variante se define]te pornind de la o mul\ime de tipuri {T1,...,Tn}. Un
exemplu @n care este necesar s[ definim un tip cu variante este reprezentarea
coordonatelor unui punct @n plan @n cazul @n care ele pot fi coordonate
204

carteziene sau polare. Unui obiect agregat cu variante i se va aloca un spa\iu de


memorie egal cu valoarea maxim[ necesar[ tipurilor sale componente.

5.4 LISTE
5.4.1. LISTE LINIARE
Una dintre cele mai simple ]i mai des folosite structuri de date este lista
liniar[, cunoscut[ ]i sub numele de list[ ordonat[ sau secven\[. O
list[ liniar[ const[ dintr-o @n]iruire de elemente X 1, X2, ..., Xn numite noduri,
apar\in`nd de obicei unui acela]i tip de baz[ T. Propriet[\ile structurale esen\iale
ale acestui ]ir se rezum[ la pozi\ia relativ[ a elementelor, a]a cum apar ele @n
cadrul ]irului. Singurele lucruri care ne intereseaz[ la o astfel de structur[ sunt:
dac[ n>0 atunci X1 este primul nod ]i Xn este ultimul nod

dac[ 1<i<n atunci nodul al i-lea X i este precedat de nodul Xi-1 ]i urmat de
nodul Xi+1
Ultima

proprietate

exprim[

esen\a

accesului

secven\ial,

care

afirm[ c[ dac[ cunoa]tem nodul curent X i atunci putem accesa eficient nodul
predecesor Xi-1 ]i nodul succesor Xi+1.
Exist[ o mare varietate de opera\ii ce pot fi realizate asupra listelor
liniare. Acestea includ:
determinarea lungimii (num[rului de elemente) unei liste
determinarea valorii primului, respectiv ultimului element al unei liste
descompunerea unei liste @n primul element ]i lista format[ din restul
elementelor (elementelor aflate dup[ el), respectiv @n ultimul element ]i
205

lista restului elementelor (elementelor aflate @n fa\a sa)


ad[ugarea unui element la @nceputul, respectiv sf`r]itul unei liste
testarea dac[ lista este sau nu vid[
parcurgerea listei de la @nceput la sf`r]it sau invers
determinarea valorii celui de al i-lea element al listei
modificarea valorii celui de al i-lea element al listei
inserarea unui element pe pozi\ia i, 1 i n+1 astfel @nc`t elementele aflate
pe pozi\iile i, i+1, ... ,n se vor afla dup[ inserare pe pozi\iile i+1,i+2,...,n+1
]tergerea elementului din pozi\ia i, 1 i n, astfel @nc`t elementele aflate
pe pozi\iile i+1, ..., n se vor afla dup[ ]tergere @n pozi\iile i,i+1, ..., n-1
Alegerea setului corespunz[tor de opera\ii depinde de aplica\ia @n care
sunt folosite listele. Restr`ngerea setului de opera\ii ne conduce la ob\inerea
unor noi structuri de date gen list[, dintre care unele apar foarte frecvent @n
aplica\ii ]i din acest motiv au c[p[tat nume speciale:
Stiva este o list[ liniar[ pentru care toate inser[rile ]i ]tergerile (]i @n general
orice tip de acces) au loc numai la unul dintre capetele sale. Acesta se
nume]te v`rful stivei, iar cel[lalt cap[t inaccesibil @n mod direct se nume]te
baza stivei
Coada este o list[ liniar[ @n care toate inser[rile se fac la unul dintre capete,
numit fa\[ ]i toate ]tergerile (]i @n general orice tip de acces) au loc la
celalat cap[t, numit spate
Coada biterminal[ este o list[ liniar[ la care toate inser[rile ]i ]tergerile (]i
@n general orice tip de acces) au loc la capetele sale
Listele pot fi definite recursiv astfel: o list[ este fie lista vid[, fie este
format[ din elementul din capul listei (primul element al listei) ]i lista
format[ din restul elementelor.
206

Num[rul de elemente ale unei liste se nume]te lungimea listei.

5.4.2 REPREZENTAREA LISTELOR FOLOSIND ALOCAREA


SECVEN|IAL{
Cel mai simplu ]i mai natural mod de a reprezenta @n memorie o
list[ liniar[ este de a plasa elementele listei @n loca\ii consecutive, un nod
dup[ altul, folosind @n acest scop o structur[ de tip tablou. O component[ a
tabloului poate stoca fie un nod al listei, fie un pointer la un nod al listei.
Accesul la un element din list[, parcurgerea listei sau ad[ugarea/]tergerea unui
element la/de la sf`r]itul listei se fac cu u]urin\[, @n timp ce inserarea/]tergerea
de elemente din interiorul listei sunt opera\ii costisitoare, doarece presupun
deplasarea unor elemente. Reprezentarea unei liste folosind alocarea secven\ial[
folose]te un tablou. Alegem @n cele ce urmeaz[ solu\ia @n care componentele
acestui tablou sunt pointeri la informa\ia util[. Aceast[ metod[ de reprezentare
are avantajul c[ lista poate fi eterogen[, adic[ informa\iile din noduri pot
apar\ine unor tipuri diferite. Elementele listei vor ocupa pozi\iile 1,2,... din
cadrul acestui tablou. #n plus, trebuie cunoscut[ pozi\ia ultimului element din
list[. Pentru parcurgerea listei este necesar[ utilizarea unei variabile
numit[ cursor, care ne indic[ pozi\ia elementului curent din list[ (elementul care
trebuie prelucrat). Dac[ lista este folosit[ @ntr-o aplica\ie @n cadrul c[reia o
singur[ parcurgere a listei este activ[ la un moment dat, aceast[ variabil[ poate fi
ad[ugat[ la reprezentarea listei. #n caz contrar, aceast[ variabil[ va trebui
reprezentat[ separat de list[. Vom presupune @n continuare c[ ne afl[m @n
primul caz.
Pentru reprezentarea listei se folose]te o structur[ de date, care
@ncapsuleaz[ variabila cursor, pozi\ia ultimului element al listei ]i tabloul de
207

pointeri @n care se aloc[ elementele listei. Grafic, aceast[ structur[ este


ilustrat[ @n figura 5.1.

elemente

informa\ii

1
predecesor
curent

succesor
sf`r]it

nmax

Fig. 5.1 Reprezentarea unei liste utiliz`nd alocarea secven\ial[


5.4.3 REPREZENTAREA LISTELOR FOLOSIND ALOCAREA
#NL{N|UIT{
Am v[zut c[ @n cazul implement[rii listelor utiliz`nd alocarea
secven\ial[, opera\iile de inserare ]i ]tergere a unui nod @n ]i respectiv din
interiorul listei sunt costisitoare deoarece ele necesit[ deplasarea nodurilor listei.
Aceast[ problem[ poate fi @nl[turat[ dac[ se folose]te alocarea @nl[n\uit[. #n
cazul aloc[rii @nl[n\uite nodurile listei nu vor mai fi plasate @n loca\ii
adiacente de memorie, ci @n loca\ii dispersate. Ordinea relativ[ a lor se
208

p[streaz[ prin includerea @n cadrul fiec[rui nod a unor informa\ii de leg[tur[.


Spa\iul

suplimentar

de

memorie

necesar

includerii

informa\iilor

de

leg[tur[ reprezint[ pre\ul pl[tit pentru @nl[turarea neajunsurilor aloc[rii


secven\iale.
O list[ liniar[ a c[rei reprezentare intern[ folose]te alocarea @nl[n\uit[ a
nodurilor se nume]te list[ @nl[n\uit[ sau list[ legat[. Un nod al unei liste poate
con\ine o singur[ leg[tur[ c[tre nodul succesor, caz @n care vom spune c[ avem
o list[ simplu @nl[n\uit[ sau dou[ leg[turi c[tre nodurile predecesor ]i succesor,
caz @n care vom spune c[ avem o list[ dublu @nl[n\uit[.
Se obi]nuie]te ca informa\ia de leg[tur[ s[ fie indicat[ grafic printr-o
s[geat[ orientat[ c[tre informa\ia ''legat['' de informa\ia curent[. Spre exemplu,
lista @nlan\uit[ a primelor 3 numere prime este reprezentat[ grafic @n figura
5.2.
2

Fig. 5.2 Lista @nl[n\uit[ a primelor trei numere prime


Pentru a se putea detecta sf`r]itul listei, ultimul nod va con\ine o
leg[tur[ nul[ sau echivalent vid[ (reprezentat[ printr-o celul[ ''t[iat['' @n figur[).
O alt[ posibilitate este folosirea unei structuri @n care ultimul nod s[ indice spre
primul, ca @n figura 5.3. O list[ @nl[n\uit[ reprezentat[ printr-o astfel de
2
structur[ circular[ se nume]te list[ circular[.
Evident, putem avea liste circulare

simple ]i liste circulare duble.

3
5

209

Fig. 5.3 Reprezentarea unei liste circulare


Pentru reprezentarea informa\iei de leg[tur[ se folosesc pointeri sau
indici (numere @ntregi). #n cazul @n care informa\ia de leg[tur[ se
reprezint[ prin pointeri, se obi]nuie]te ca nodurile listei s[ fie create dinamic.
Leg[turile se vor completa cu valorile pointerilor, ob\inute @n urma opera\iilor
de alocare dinamic[ a memoriei, ca @n exemplul din figura 5.4.
p

3
vid

Fig. 5.4 Reprezentarea listelor cu ajutorul pointerilor


#n cazul @n care informa\ia de leg[tur[ se reprezint[ prin indici, nodurile
se aloc[ static ca elemente ale unui tablou, iar leg[turile nu sunt altceva dec`t
indici @n cadrul tabloului. Dac[ indicii au valori de la 1 la o valoare maxim[,
leg[tura nul[ se poate reprezenta prin valoarea 0. Un exemplu este ilustrat @n
figura 5.5, @n care se prezint[ o posibil[ reprezentare a listei (2 3 5).
1
2
3

3
4

2
5

1
0

Fig. 5.5 Reprezentarea listei (2 3 5)

210

5.4.5 IMPLEMENTAREA LISTELOR #NL{N|UITE FOLOSIND


POINTERI }I ALOCARE DINAMIC{
Pentru reprezentarea unei liste vom folosi un obiect agregat care con\ine
urm[toarele c`mpuri: lungimea listei, pointerul la primul nod, pointerul la
ultimul nod ]i pointerul la nodul curent (cursorul). Pentru ca opera\iile de
inserare ]i ]tergere s[ se fac[ la fel pentru orice nod al listei, se adaug[ listei dou[
noduri fictive numite ]i santinele, plasate la @nceputul ]i la sf`r]itul listei
(@naintea primului, respectiv dup[ ultimul nod al listei). #n acest fel, orice nod
neredundant al listei va avea at`t succesor c`t ]i predecesor. Presupun`nd c[ un
nod din list[ se descrie prin tipul nod, reprezentarea listelor simplu @nl[n\uite
este ilustrat[ grafic @n figura 5.6.
Pentru listele dublu @nl[n\uite apare @n plus leg[tura spre nodul
predecesor, reprezentarea acestora fiind ilustrat[ grafic @n figura 5.7.

lungime @nceput

curent

sf`r]it

3
santinel[
@nceput

santinel[
sf`r]it

lungime @nceput
informa\ii

curent

sf`r]it

santinel[ Fig. 5.6 Reprezentarea listelor simplu @nl[n\uite


santinel[
@nceput
sf`r]it

211
informa\ii

Fig. 5.7 Reprezentarea listelor dublu @nl[n\uite


#n cazul listelor circulare nu mai este necesar[ folosirea a dou[ noduri
fictive pe post de santinele, fiind suficient[ o singur[ santinel[. Crearea unei liste
circulare vid[ presupune crearea nodului santinel[ cu autoreferire. #n plus,
datorit[ structurii circulare, pointerul c[tre sf`r]itul listei poate s[ dispar[, primul
nod put`nd fi considerat at`t nod de @nceput c`t ]i nod de sf`r]it.

5.5 STIVE
5.5.1 NO|IUNI INTRODUCTIVE
Ori de c`te ori @n care apare necesitatea folosirii unor date @n ordinea
invers[ gener[rii lor, vom apela la structura de date de tip stiv[. Pentru aceasta
va trebui s[ memor[m datele @n ordinea gener[rii lor @ntr-o stiv[.
Datorit[ faptului c[ accesul la structura de tip stiv[ are loc printr-un singur punct
numit v`rful stivei, datele vor fi extrase din stiv[ @n ordinea invers[ @n care au
fost generate.
Dintre aplica\iile stivelor men\ion[m: evaluarea expresiilor aritmetice ]i
logice, implementarea procedurilor prin salvarea @n stiv[ a adresei de retur,
212

implementarea algoritmilor recursivi @n limbaje de programare care nu


suport[ recursivitatea, etc. Un exemplu de folosire al stivelor este
implementarea ciclurilor cu contor @ncuibate care partajeaz[ variabila contor.
Formal, o stiv[ este o list[ liniar[ @n care inser[rile ]i ]tergerile se fac la un
singur cap[t al listei numit v`rful stivei. Datorit[ politicii de acces la elementele
unei

stive,

politic[

ce

poate

fi

descris[

succint

prin

urm[toarea

formul[ metaforic[: ''ultimul intrat, primul ie]it'', stivele se mai numesc ]i liste
LIFO (Last In, First Out). Opera\iile asupra obiectelor de tip stiv[ sunt cele
prezentate @n cadrul listelor.
5.5.2 REPREZENTAREA STIVELOR UTILIZ~ND ALOCAREA
SECVEN|IAL{
Alocarea secven\ial[ este foarte convenabil[ pentru implementarea
stivelor. O stiv[ va fi reprezentat[ printr-un tablou de pointeri la elementele
depuse, @mpreun[ cu o variabil[ @ntreag[ care ne indic[ pozi\ia din v[rful
stivei.
Opera\iile cu stive sunt urm[toarele:
crearea unei stive vide. Aceast[ opera\ie realizeaz[ crearea unei stive vide.
#n cazul aloc[rii secven\iale crearea propriu-zis[ a stivei (alocarea de
memorie pentru varful stivei ]i elemente) se realizeaz[ la compilare,opera\ia
realiz'[nd doar ini\ializarea stivei
testarea dac[ stiva este vid[. Aceast[ opera\ie testeaz[ dac[ stiva nu con\ine
nici un element
depunerea unui element @n stiv[. Aceast[ opera\ie depune un element @n
stiv[. @n cazul aloc[rii secven\iale opera\ia reu]e]te doar dac[ stiva nu era
deja plin[
extragerea unui element din stiv[. Aceast[ opera\ie cite]te ]i extrage un
element din v`rful stivei. Opera\ia reu]e]te dac[ stiva nu este vid[
213

citirea elementului din v`rful stivei. Aceast[ opera\ie determin[ elementul


aflat @n v`rful stivei. Opera\ia reu]e]te dac[ stiva nu este vid[.

5.6 COZI
5.6.1 NO|IUNI INTRODUCTIVE
Ori de c`te ori trebuie sincronizate un proces produc[tor de date ]i un
proces consumator de date, ce opereaz[ la rate diferite ]i nu neap[rat constante,
se va folosi o structur[ de tip coad[. La generarea unei date noi nu
exist[ certitudinea c[ ea va fi prelucrat[ imediat de consumator ]i atunci c`nd
trebuie prelucrat[ o dat[ nou[ nu exist[ certitudinea c[ ea a fost generat[ de
produc[tor. Din aceste motive, datele generate de produc[tor vor fi stocate @ntro coad[, de unde sunt extrase pentru a fi prelucrate de c[tre consumator,
p[str`ndu-se ordinea @n care au fost generate. Un exemplu concret este un
sistem de automatizare a v`nz[rilor unei re\ele de magazine. Fiecare cump[r[tor
@]i introduce comanda de la un terminal ]i dac[ produsele cerute sunt
disponibile @n stoc, el va fi servit ulterior de personalul re\elei respective de
magazine. Procesul produc[tor este reprezentat de comenzile introduse de
cump[r[tori ]i procesul consumator este reprezentat de serviciile oferite de
personalul re\elei de magazine. Pentru a nu se pierde, cererile poten\ialilor
cump[r[tori vor fi memorate @ntr-o coad[.
Formal, o coad[ este o list[ liniar[ @n care inser[rile se fac la un cap[t
numit spatele cozii, iar ]tergerile se fac de la cel[lalt cap[t numit fa\a cozii.
Datorit[ politicii de acces la elementele unei cozi, politic[ ce poate fi
descris[ succint prin urm[toarea formul[ metaforic[: ''primul intrat, primul ie]it'',
cozile se mai numesc ]i liste FIFO (First In, First Out).
5.6.2 REPREZENTAREA COZILOR UTILIZ~ND ALOCAREA
214

SECVEN|IAL{
Cozile se reprezint[ eficient folosind alocarea secven\ial[. O coad[ va fi
reprezentat[

printr-un

tablou

de

pointeri

la

elementele

componente

@mpreun[ cu dou[ variabile @ntregi fata ]i spate care ne indic[ cu o pozi\ia


@naintea elementului din fa\[ ]i respectiv pozi\ia elementului din spate al cozii.
La fiecare extragere ]i depunere variabilele fata ]i respectiv spate sunt
incrementate. Pentru evitarea risipei de memorie, tabloul va fi tratat ca fiind
circular @n sensul c[ dup[ ultimul element urmeaz[ primul element. Acest lucru
@nseamn[ c[ increment[rile variabilelor fata ]i spate se fac modulo num[rul de
elemente alocate tabloului. O astfel de coad[ este ilustrat[ @n figura 5.8.
spate

ordinea @n care se fac


depunerile ]i extragerile

fa\[

Fig. 5.8 Reprezentarea grafic[ a unei cozi


Ini\ial fa\a=0 ]i spate=0. Condi\ia fa\a=spate se va putea folosi pentru
determinarea dac[ coada este vid[. Pentru a se putea distinge @ntre situa\ia c`nd
coada este vid[ ]i situa\ia c`nd coada este plin[, se va folosi cu un element mai
pu\in dec`t num[rul total de elemente alocate tabloului. Ori de c`te ori se
215

efectueaz[ o depunere @n coad[ vom testa dac[ nu cumva acea depunere


determin[ ca egalitatea fa\a=spate sa devin[ adev[rat[. Acest

lucru

@nseamn[ c[ avem o coad[ plin[ ]i depunerea nu poate fi efectuat[. Opera\iile


cu cozi sunt urm[toarele:
crearea unei cozi vide. Aceast[ opera\ie realizeaz[ crearea unei cozi vide.
@n cazul aloc[rii secven\iale crearea propriu-zis[ a cozii (alocarea de
memorie pentru indicatorii fa\a ]i spate ]i elemente) se realizeaz[ la
compilare. #n acest caz, opera\ia realizeaz[ doar ini\ializarea cozii.
testarea dac[ coada este vid[. Aceast[ opera\ie testeaz[ dac[ coada nu con\ine
nici un element
depunerea unui element @n coad[. Aceast[ opera\ie depune un element @n
coad[. @n cazul aloc[rii secven\iale opera\ia reu]e]te doar dac[ coada nu era
deja plin[
extragerea unui element din coad[. Aceast[ opera\ie cite]te ]i extrage un
element din coad[. Opera\ia reu]e]te dac[ coada nu este vid[
citirea elementului din fa\[ al cozii. Aceast[ opera\ie determin[ elementul
aflat @n cap[tul din fa\[ al cozii. Opera\ia reu]e]te dac[ coada nu este vid[.

5.7 ARBORI
Listele sunt potrivite pentru reprezentarea datelor organizate liniar.
Dac[ @ns[ dorim s[ descriem date structurate ierarhic, simpla enumerare a
obiectelor componente cu ajutorul unor liste este insuficient[. Organizarea
datelor sub form[ ierarhic[ este frecvent @nt`lnit[ @n cele mai diverse domenii
aplicative. C`teva exemple sunt: organizarea administrativ[ sau managerial[ a
unei societ[\i, planificarea meciurilor unei competi\ii sportive de tip turneu,
structurarea unei c[r\i sau a directorului de fi]iere dintr-un sistem de operare,
reprezentarea expresiilor aritmetice ]i logice @ntr-un compilator, @n vederea
evalu[rii lor. Generaliz`nd, orice entitate poate fi descris[ la un nivel abstract
216

printr-un obiect primitiv sau la un nivel detaliat sub forma unei ierarhii de
obiecte componente.
Figurile 5.9 ]i 5.10 ilustreaz[ reprezentarea unei expresii aritmetice printr-un
arbore sintactic

]i respectiv organizarea arborescent[ a unei societ[\i

comerciale.

Fig. 5.9 Arborele unei expresii aritmetice

societate

directia
1
sectia A

atelier 1

...

...

directia
2
sectia B

atelier 4

echipa 1

...

...

echipa 2

217
membru

...

membru

directia
3

...

Fig. 5.10 Structura arborescent[ a unei societ[\i comerciale


Se observ[ c[ pentru definirea structurilor arborescente o aten\ie
important[ trebuie acordat[ rela\iei de ''ramificare'' sau echivalent ''subordonare''.
Spre exemplu, referindu-ne la figura 5.10, exist[ o rela\ie de subordonare @ntre
nodul directia 1 ]i nodurile sectia A @mpreun[ cu descenden\ii s[i, respectiv
sectia B @mpreun[ cu descenden\ii s[i. Aceast[ observa\ie ne conduce la
urm[toarea defini\ie formal[ a no\iunii de arbore: se nume]te arbore o mul\ime A
de unul sau mai multe noduri astfel @nc`t:
exist[ un nod special rad A, numit r[d[cina arborelui A
mul\imea celorlalte noduri din A cu excep\ia r[d[cinii este parti\ionat[ @n n
0 mul\imi nevide ]i disjuncte Ai, 1 i n, care sunt la r`ndul lor arbori.
A1, ..., An se numesc subarborii lui A.
Dac[ ordinea relativ[ a subarborilor A1, ..., An @n punctul al doilea al
defini\iei este important[, se spune c[ A este un arbore ordonat. #n acest caz A i
este al i-lea subarbore al lui A pentru 1 i n.
Dac[ pentru a distinge @ntre doi arbori se consider[ c[ ordinea
subarborilor este nerelevant[, atunci arborii se numesc orienta\i pentru a sugera
faptul c[ are importan\[ doar orientarea arcelor (de la r[d[cin[ spre r[d[cinile
subarborilor,) nu ]i ordinea relativ[ a acestora. Arborii orienta\i sunt un caz
particular de grafuri orientate. Ei trebuie deoesebi\i de arboresecen\e, care sunt
un caz particular de grafuri neorientate.
Prin @ns[]i natura sa, reprezentarea arborilor @n calculator induce o
rela\ie de ordonare a subarborilor. Din acest motiv, vom presupune @n
continuare @n mod tacit c[ to\i arborii la care ne referim sunt ordona\i, dac[ nu
se specific[ altfel. Structurile arborescente pot fi reprezentate grafic sau
alfanumeric @n diverse moduri care sugereaz[ @n fapt o aceea]i structur[.
218

C`teva exemple sunt ilustrate @n figura 5.11.

A
E
I

B
F

C
G

D
H

A
B
E
A
B

I
E
I
F

C
G
D
H
(A(B(E(I))(F))(C(G))(D(H))

A
E B
I

219

Fig. 5.11 Diverse moduri de reprezentare a arborilor


Gradul unui arbore reprezint[ num[rul de subarbori ai unui arbore.
Maximul gradelor subarborilor corespunz[tori fiec[rui nod al unui arbore se
nume]te aritatea arborelui. Un arbore de aritate n se nume]te arbore n-ar.
Nodurile cu gradul egal cu 0 se numesc noduri frunz[ sau noduri terminale.
Celelalte noduri se numesc noduri neterminale. @n cazul arborelui din figura de
mai sus, mul\imea nodurilor terminale este {B,E,D} ]i mul\imea nodurilor
neterminale este {A,C}. R[d[cinile subarborilor unui arbore cu r[d[cina X se
numesc copiii sau fiii nodului X. Orice nod este tat[l sau p[rintele fiilor s[i. #n
exemplul din figura 5.11, nodul A este p[rintele nodurilor B, C ]i D. Copiii unui
aceluia]i nod p[rinte se numesc fra\i.
Pentru orice nod X al unui arbore exist[ o unic[ cale care une]te r[d[cina
R a arborelui cu nodul X. Toate nodurile de pe aceast[ cale, except`ndu-l pe X,
formeaz[ mul\imea str[mo]ilor lui X. Num[rul str[mo]ilor lui X plus 1 reprezint[
nivelul nodului X. Prin @n[l\imea sau ad`ncimea unui arbore vom @n\elege
nivelul maxim al nodurilor ale. Arborele din figura anterioar[ are @n[l\imea 3.
Num[rul maxim de noduri ale unui arbore de aritate n ]i @n[l\ime h se atinge
c`nd toate nodurile neterminale au gradul n. #n acest caz, nivelul 1 con\ine 1
nod, nivelul 2 con\ine n noduri, nivelul 3 con\ine n 2 noduri, ..., nivelul h con\ine
nh-1 noduri. Rezult[ c[ num[rul maxim de noduri va fi:
1 + n + n2 + ... + nh-1 = (nh-1)/(n-1)
O mul\ime de n 0 arbori distinc\i se nume]te p[dure. Dac[ ordinea
arborilor unei p[duri este relevant[, atunci avem o p[dure ordonat[. #n
continuare, vom presupune @n mod tacit c[ toate p[durile la care ne referim
220

sunt ordonate, dac[ nu se specific[ altfel.


Cel mai natural mod de a reprezenta o p[dure este folosirea unei liste. Se
observ[ c[ prin eliminarea r[d[cinii unui arbore se ob\ine o p[dure format[ din
subarborii r[d[cinii. Rezult[ c[ o modalitate elegant[ de a construi un arbore
porne]te de la r[d[cina arborelui ]i p[durea subarborilor s[i. Fiecare nod N al
unei p[duri se poate eticheta cu o secven\[ de numere. Mul\imea acestor
secven\e luate @mpreun[ sugereaz[ o structur[ arborescent[. Dac[ p[durea are k
arbori, r[d[cinilor li se asociaz[ numerele 1, 2, ..., k. Dac[ alpha este secven\a
asociat[ unui nod oarecare de grad m, atunci copiilor li se vor asocia secven\ele
alpha.1, alpha.2, ..., alpha.m. Aceast[ metod[ de codificare a nodurilor unei
p[duri se nume]te nota\ia Dewey.
Un caz special de arbore frecvent @nt`lnit @n diverse domenii
aplicative este arborele binar. #ntr-un astfel de arbore, fiecare nod are maxim
doi subarbori; mai mult, c`nd este prezent un singur subarbore, se face distinc\ie
@ntre subarborele st`ng ]i subarborele drept. Formal, arborii binari se definesc
@n maniera urm[toare:: se nume]te arbore binar o mul\ime finit[ de noduri care
fie este vid[, fie const[ dintr-o r[d[cin[ ]i elementele a doi arbori binari disjunc\i
numi\i subarborele st`ng ]i subarborele drept ai r[d[cinii.

Fig. 5.12 Un exemplu de arbore binar


Analiz`nd aceast[ defini\ie cu aten\ie se observ[ c[ un arbore binar nu
este un caz particular de arbore. Astfel, un arbore binar poate avea subarborele
221

st`ng sau drept vid ]i, @n plus, un arbore binar poate s[ fie vid. Un exemplu de
arbore binar este prezentat @n figura 5.12. Puterea de reprezentare a arborilor
binari este aceea]i cu cea a unei p[duri.
5.7.1 PARCURGEREA ARBORILOR
Prelucrarea informa\iilor dintr-un arbore implic[ parcurgerea arborelui.
Se nume]te parcurgere o metod[ de examinare sistematic[ a nodurilor unui
arbore astfel @nc`t fiecare nod s[ fie vizitat exact o singur[ dat[. Parcurgerea
arborilor ne ofer[ o aranjare liniar[ a nodurilor, astfel @nc`t @n orice moment
vom ]ti precis care este urm[torul nod care va fi vizitat ]i prelucrat.
S[ consider[m arborele referitor la organizarea unei societ[\i. Vom presupune
c[

fiecare

nod

neterminal

con\ine

numele

persoanei

care

conduce

compartimentul corespunz[tor nodului respectiv, iar fiecare nod frunz[ con\ine


numele persoanei pe care nodul o reprezint[. #n func\ie de aplica\ie, acest
arbore poate fi parcurs @n diverse moduri. Dac[ se solicit[ lista personalului cu
func\ii de conducere, aceasta poate fi afi]at[ grup`nd persoanele pe niveluri
ierarhice sau astfel @nc`t s[ se reflecte rela\iile de subordonare @ntre niveluri.
Prima variant[ de parcurgere se nume]te parcurgere @n l[rgime, iar cea de a
doua, parcurgere @n ad`ncime. Tot o parcurgere @n ad`ncime presupune ]i
determinarea num[rului de angaja\i din fiecare compartiment, un compartiment
fiind reprezentat printr-un subarbore. Cele dou[ parcurgeri @n ad`ncime
men\ionate difer[ prin ordinea relativ[ de parcurgere a nodului r[d[cin[ ]i
respectiv a subarborilor. #n primul caz, avem o parcurgere @n preordine, care
se caracterizeaz[ prin parcurgerea @nt`i a r[d[cinii ]i apoi a fiec[rui subarbore
@n parte (@n exemplul considerat anterior - fig. 5.10 - se afi]eaz[ @nt`i
numele persoanei care conduce compartimentul superior ]i apoi numele
persoanelor din compartimentele direct subordonate). #n al doilea caz, avem o
parcurgere @n postordine, care se caracterizeaz[ prin parcurgerea fiec[rui
222

subarbore ]i apoi a r[d[cinii (num[rul de persoane dintr-un compartiment va


putea fi cunoscut ]i afi]at numai dup[ determinarea num[rului de persoane ale
fiec[rui compartiment direct subordonat).
#n continuare, vom analiza modul @n care se realizeaz[ fiecare tip de
parcurgere, pe cazul unei p[duri. Parcugerea unui arbore se va realiza
transform`nd @n prealabil arborele @ntr-o p[dure cu un singur arbore.
#n cazul parcurgerii @n l[rgime se prelucreaz[ mai @nt`i informa\ia din
r[d[cini, @n ordinea @n care arborii apar @n cadrul p[durii, dup[ care sunt
prelucrate, de la st`nga la dreapta, nodurile aflate pe primul nivel @n arborii
p[durii, apoi cele aflate pe al doilea nivel, ].a.m.d.
Parcurgerea @n l[rgime presupune folosirea unei cozi. Ini\ial coada este
vid[. Dac[ at`t coada c`t ]i p[durea sunt vide nu se efectueaz[ nici o prelucrare.
Dac[ p[durea este nevid[, se depune primul arbore al p[durii @n coad[ ]i
parcurgerea continu[ cu restul p[durii ]i noua coad[. Altfel, p[durea este vid[.
Dac[ coada este nevid[, se extrage un arbore din coad[, se viziteaz[ r[d[cina ]i se
continu[ parcurgerea cu p[durea subarborilor arborelui extras din coad[ ]i cu
restul cozii. Spre exemplu, prin parcurgerea @n l[rgime a p[durii din figura
anterioar[, nodurile vor fi vizitate @n ordinea A, E, B, C, D, F.
Figura 5.13 ilustreaz[ parcurgerea @n l[rgime a unei p[duri.
Fig. 5.13 Parcurgerea @n l[rgime a unei p[duri
E

#n cazul parcurgerii @n ad`ncime, copii unui nod sunt vizita\i tot de la


st`nga la dreapta, @ns[ trecerea de la nodul curent la fratele din dreapta are loc
numai dup[ ce a fost parcurs tot subarborele cu r[d[cina @n nodul curent.
223

Pentru a memora informa\iile relative la punctul de revenire (nodul tat[ ]i


urm[torul fiu neprelucrat al s[u) se folose]te o stiv[. Opera\ia de parcurgere @n
ad`ncime decurge absolut la fel ca ]i cea de parcurgere @n l[rgime, cu
deosebirea c[ @n locul opera\iilor cu cozi se folosesc opera\ii cu stive. #n plus,
la parcurgerea @n preordine r[d[cina este prelucrat[ @naintea parcurgerii
subarborilor

s[i,

iar

la

parcurgerea

@n

postordine

r[d[cina

este

prelucrat[ dup[ parcurgerea subarborilor s[i. Parcurgerea @n ad`ncime poate fi


definit[ direct folosind recursivitatea. Spre exemplu, parcurgerea @n preordine
a a unei p[duri presupune vizitarea r[d[cinii primului subarbore ]i apoi
parcurgerea @n preordine a p[durii rezultate prin concatenarea p[durii
subarborilor primului arbore cu restul p[durii, @n aceast[ ordine. Spre exemplu,
prin parcurgerea @n preordine a p[durii din figura prezentat[ la definirea
arborilor, nodurile vor fi vizitate @n ordinea A, B, C, D, E, F ]i prin parcurgerea
@n postordine a sa, nodurile vor fi vizitate @n ordinea B, C, D, A, F, E. Figura
5.14 ilustreaz[ parcurgerea @n preordine a unei p[duri.

Fig. 5.14 Parcurgerea @n preordine a unui arbore


Parcurgerile @n l[rgime ]i respectiv @n ad`ncime ale unui arbore binar
se pot defini @ntr-o manier[ aseman[toare parcurgerilor unui arbore oarecare.
Cu toate acestea, @n cazul arborilor binari este consacrat[ parcurgerea @n
ad`ncime. Datorit[ faptului c[ un arbore binar este compus din 3 componente:
r[d[cina R, subarborele st`ng S ]i subarborele drept D, rezult[ c[ se pot defini 3!
=6 parcurgeri @n ad`ncime, simbolizate sugestiv prin urm[toarele mnemonice:
SRD, RSD, SDR, DSR, DRS, RDS. Dintre acestea doar primele 3 au denumiri
224

consacrate, ]i anume: inordine, preordine ]i respectiv postordine. Prefixele in,


pre ]i post sugereaz[ ordinea relativ[ de vizitare a r[d[cinii @n raport cu cei doi
subarbori.

5.7.2 REPREZENTAREA ARBORILOR OARECARE


Cea mai elegant[ ]i mai r[sp`ndit[ metod[ de reprezentare a arborilor
oarecare o constituie alocarea @nl[n\uit[ ]i utilizarea leg[turilor fiu-frate.
Fiecare nod al unui arbore va avea 3 c`mpuri: c`mpul de informa\ie, c`mpul de
leg[tur[ c[tre primul s[u fiu ]i c`mpul de leg[tur[ c[tre fratele s[u. To\i subarborii
unui arbore vor fi @nl[n\ui\i prin intermediul leg[turilor frate @ntr-o
list[ @nl[n\uit[, iar leg[tura c[tre primul fiu indic[ @ntotdeauna spre capul unei
astfel de liste. #n plus, leg[tura frate se poate folosi pentru @nl[n\uirea arborilor
@ntr-o p[dure.
Opera\iile asupra unui arbore oarecare sunt urm[toarele:
crearea unui arbore format dintr-un singur nod frunz[
ad[ugarea unui arbore ca prim fiu al unui arbore dat. #n urma acestei
opera\ii gradul arborelui cre]te cu 1
determinarea primului fiu al unui arbore dat. Aceast[ opera\ie produce un
arbore valid doar dac[ arborele ini\ial nu se reduce la o frunz[
determinrea gradului unui arbore
determinarea informa\iei din r[d[cina unui arbore
determinarea fratelui unui subarbore
testarea dac[ un arbore se reduce la un nod frunz[.
5.7.3 REPREZENTAREA ARBORILOR BINARI

225

Arborii binari se reprezint[ fie utiliz`nd alocarea secven\ial[, fie utiliz`nd


alocarea @nl[n\uit[. S[ consider[m o numerotare a nodurilor unui arbore binar
complet (un arbore binar @n care fiecare nod neterminal are exact doi copii) de
@n[l\ime h, corespunz[toare unei parcurgeri @n l[rgime, astfel @nc`t r[d[cina
este numerotat[ cu 1, r[d[cina subarborelui st`ng cu 2, r[d[cina subarborelui
drept cu 3, r[d[cina subarborelui st`ng al subarborelui st`ng cu 4, ].a.m.d.
Aceast[ numerotare, pentru cazul h=3, este ilustrat[ @n figura 5.15.
Fig. 5.15 Reprezentarea unui arbore binar complet
1
2

4
8

5
9

10

6
11

12

7
13

14

15

Se observ[ c[ un arbore binar complet de @n[l\ime h con\ine 2 h-1 noduri.


Pentru orice nod 1 i 2h-1-1, fiul st`ng al s[u este 2i ]i fiul drept este 2i+1. Un
arbore binar de @n[l\ime cel mult h se poate reprezenta cu ajutorul unui tablou
de 2h-1 elemente, astfel @nc`t fiecare element 1

2h-1 al tabloului

s[ con\in[ nodul i al arborelui. Spre exemplu, figura 5.16 ilustreaz[ un arbore


binar ]i reprezentarea secven\ial[ corespunz[toare. Reprezentarea secven\ial[ are
dezavantajul consumului mare de memorie, chiar @n cazul @n care arborele
con\ine pu\ine noduri. Un alt dezavantaj este num[rul mare de ''goluri'' din
tabloul de noduri @n cazul @n care arborele este ''rar''. Aceast[ reprezentare se
folose]te totu]i @n cazul @n care arborele binar este plin. Un arbore binar se
nume]te plin dac[ exist[ un N astfel @nc`t nodurile arborelui sunt 1, 2, ..., N,
@n condi\iile folosirii numerot[rii introdus[ @n acest paragraf.

226

4
5

Fig. 5.16. Un arbore binar ]i reprezentarea sa secven\ial[


5.7.4 REPREZENTAREA ARBORILOR UTILIZ~ND ALOCAREA
#NL{N|UIT{
Cea mai elegant[ ]i mai r[sp`ndit[ modalitate de reprezentare a unui
arbore binar o constituie folosirea aloc[rii @nl[n\uite. Fiecare nod al unui arbore
binar va avea 3 c`mpuri: c`mpul de informa\ie, c`mpul de leg[tur[ c[tre
subarborele st`ng ]i c`mpul de leg[tur[ c[tre subarborele drept. Un arbore binar
se va reprezenta printr-o referin\[ c[tre r[d[cina sa. Un arbore binar vid se va
reprezenta prin referin\a vid[.
Utiliz`nd alocarea @nl[n\uit[, un arbore binar se reprezint[ ca @n figura 5.17.
Opera\iile cu arbori binari sunt ilustrate @n continuare:
crearea unui arbore binar vid
crearea unui arbore binar cunosc`nd r[d[cina, subarborele st`ng ]i
subarborele drept
determinarea subarborelui st`ng al unui arbore binar dat. Aceast[ opera\ie
produce un arbore valid doar dac[ arborele ini\ial nu este vid
determinarea subarborelui drept al unui arbore binar dat. Aceast[ opera\ie
produce un arbore valid doar dac[ arborele ini\ial nu este vid
determinarea informa\iei din r[d[cina unui arbore
227

testarea dac[ un arbore binar este vid.

Fig. 5.17 Reprezentarea unui arbore utiliz`nd alocarea @nl[n\uit[

5.8 FI}IERE
5.8.1 NO|IUNI INTRODUCTIVE
Dup[ cum s-a men\ionat @n capitolele precedente, un fi]ier reprezint[ o
colec\ie de date memorate pe un suport extern de memorie (dischet[, hard-disc,
CD, etc.). Un fi]ier poate fi considerat ca o mul\ime de date omogene din punct
de vedere al semnifica\iei lor ]i al cerin\elor de prelucrare. Aceast[ mul\ime de
date este organizat[ ca o list[ liniar[, cu elemente structurate arborescent.
Gruparea datelor ce formeaz[ un fi]ier se face @n @nregistr[ri ]i este
determinat[ at`t de necesit[\ile de prelucrare ]i reprezentare a datelor pe
suporturile fizice, c`t ]i de caracterul repetitiv al tipurilor de informa\ie
con\inute @n fi]ier. Unit[\ile de informa\ie con\inute de o @nregistrare se
numesc c`mpurile @nregistr[rii. Pentru exemplificare, se consider[ c[ datele
referitoare la angaja\ii unei @ntreprinderi se memoreaz[ @ntr-un fi]ier. Fiecare
228

angajat poate fi considerat ca o entitate, iar prin gruparea datelor privind un


angajat (marca, numele, data na]terii, adres[, profesia, func\ia, etc.) se ob\ine un
model al @nregistr[rii, iar marca, numele, etc. sunt c`mpuri ale @nregistr[rii.
#ntruc`t exploatarea fi]ierelor de date se realizeaz[ prin intermediul
sistemului de operare al sistemului de calcul utilizat, se poate considera c[ un
fi]ier oarecare are dou[ niveluri de organizare: nivelul logic ]i nivelul fizic.
Forma sub care un fi]ier este v[zut de c[tre utilizatori (o colec\ie de @nregistr[ri
con\in`nd fiecare mai multe c`mpuri) se nume]te nivelul logic de organizare a
fi]ierului. Forma sub care fi]ierul este reprezentat pe suportul fizic de informa\ie
se nume]te nivelul fizic de organizare a fi]ierului. Nivelul fizic de organizare a
unui fi]ier condi\ioneaz[ nivelul logic de organizare. #n mod similar,
@nregistr[rile unui fi]ier pot fi logice ]i fizice, corespunz[tor celor dou[ niveluri
de organizare. #nregistrarea logic[ a unui fi]ier este forma sub care
@nregistr[rile fi]ierului se reprezint[ la nivel logic. Deoarece @nregistr[rile
unui fi]ier au de obicei o structur[ arborescent[, reprezentarea acestora ca
@nregistr[ri logice se realizeaz[ prin parcurgerea @n preordine a structurii
arborescente. Pentru prelucrarea informa\iei ce formeaz[ o @nregistrare logic[,
este necesar ca aceast[ informa\ie s[ se afle @n memoria intern[ (RAM) a
calculatorului. Ansamblul de informa\ii transferate @ntre memoria intern[ ]i
suportul fizic al fi]ierului @n cursul unei opera\ii de intrare/ie]ire
formeaz[ @nregistrarea fizic[ a fi]ierului. O @nregistrare fizic[ poate fi
format[ din mai multe @nregistr[ri logice sau doar dintr-o parte a unei
@nregistr[ri logice.
Datorit[ faptului c[ fi]ierele au o structur[ de list[ liniar[, tipurile de
organizare la nivel fizic corespund tipurilor de reprezentare a listelor liniare pe
suporturile de informa\ie ]i anume: organizare secven\ial[, secven\ial-indexat[,
multiindexat[, direct[. Termenul de acces la un fi]ier se refer[ la modalitatea de
localizare a unei @nregistr[ri oarecare din fi]ier. Accesul la @nregistr[rile unui

229

fi]ier este determinat de tipul de organizare a fi]ierului. Accesul la nivel fizic


este de dou[ tipuri:
acces secven\ial, permi\`nd localizarea unei @nregistr[ri fizice prin
parcurgerea tuturor @nregistr[rilor care o preced
acces selectiv, permi\`nd localizarea direct[ a unei @nregistr[ri fizice.
Accesul selectiv poate fi folosit printr-una din urm[toarele variante:
acces indexat, cu adresare direct[ ]i indirect[.
Principalele tipuri de opera\ii ce se pot executa asupra informa\iilor
memorate @ntr-un fi]ier sunt:
citirea sau reg[sirea @nregistr[rilor logice
modificarea con\inutului unor @nregistr[ri
ad[ugarea de noi @nregistr[ri logice
]tergerea de @nregistr[ri logice.
5.8.2 FI}IERE SECVEN|IALE

#n cazul fi]ierelor secven\iale, @nregistr[rile sunt dispuse pe suportul de


memorie @n mod secven\ial, @n zone succesive sau @nl[n\uite, accesul la o
@nregistrare i fiind posibil numai dup[ parcurgerea celorlalte i-1 @nregistr[ri
care o preced. De obicei, pentru a u]ura c[utarea ]i a minimiza timpul de acces,
fi]ierele secven\iale se ordoneaz[ @n func\ie de valorile unui c`mp ( eventual
mai multe) existent @n toate @nregistr[rile. Opera\ia de ordonare a
@nregistr[rilor (articolelor) unui fi]ier dup[ unul sau mai multe c`mpuri, numite
chei, se nume]te sortare. Acest mod de acces al fi\ierelor este avantajos de
utilizat @n situa\iile @n care, @n mod curent, se prelucreaz[ toate
@nregistr[rile acestuia (de exemplu, un fi]ier con\in`nd date despre salariile
angaja\ilor unei firme, c[ruia i se actualizeaz[ toate @nregistr[rile de dou[ ori pe
lun[).
230

Esen\a

accesului

secven\ial

este

c[

@n

orice

moment

singur[ component[ a unui fi]ier secven\ial este imediat accesibil[.


Aceast[ component[ este precizat[ de indicatorul de pozi\ie @n fi]ier. Valoarea
acestui indicator poate fi schimbat[ fie spre a indica urm[torul obiect din fi]ier,
fie spre a indica prima pozi\ie din fi]ier, prin aplicarea unei opera\ii asupra
fi]ierului.
Sf`r]itul oric[rui fi]ier secven\ial este indicat @n majoritatea limbajelor
de programare printr-un marcaj de sf`r]it de fi]ier, numit EOF (End Of File).
Unele limbaje de programare memoreaz[ lungimea fi]ierului la @nceputul
acestuia, @n vederea detect[rii sf`r]itului de fi]ier, @n timp ce alte limbaje
utilizeaz[ o @nregistrare special[ plasat[ la sf``r]itul fi]ierului, cu valori
speciale, numit[ santinel[.
Dac[ se restr`nge dimensiunea @nregistr[rii logice a unui fi]ier
secven\ial la un singur octet, se ob\ine un tip particular de fi]ier secven\ial,
numit fi]ier text. Fi]ierele text sunt utilizate de obicei pentru stocarea de
documente ce con\in text, o @nregistrare logic[ put`nd con\ine @n acest caz fie
un caracter din text, fie un caracter de control (sf`r]it de linie, sf`r]it de fi]ier).
Unele limbaje de programare ofer[ facilit[\i speciale pentru manevrarea
fi]ierelor text.
5.8.3 FI}IERE CU ACCES SELECTIV (RELATIV, DIRECT )
#n cazul acestor fi]iere este permis accesul direct la @nregistr[rile
acestuia. Acest tip de stocare a fi]ierelor utilizeaz[ un algoritm aplicat asupra
valorilor c`mpului cheie (ace]ti algoritmi pot fi de tipul unor func\ii numite
func\ii hash sau func\ii de randomizare (aleatorizare) sau de tipul adres[rii
directe). #ntruc`t sunt destul de complicate, tehnicile de aleatorizare nu se vor
aborda @n cadrul acestei materii, dezvoltarea lor put`nd fi realizat[ @n anii
urm[tori, la materiile de programarea calculatoarelor. Nu toate limbajele de
231

programare ofer[ o implementare direct[ a fi]ierelor cu acces direct, din cauza


dependen\ei de aplica\ie a implement[rii, dar se poate realiza o simulare a
acestora prin implementare.
Fi]iere indexate
Accesul indexat la fi]iere are la baz[ ideea utiliz[rii unui index pentru
c[utare/localizare, similar indexului utilizat @n cazul fi]etelor cu c[r\i din
biblioteci. Indexul unui fi]ier const[ dintr-o list[ care con\ine valorile c`mpurilor
cheie ale fi]ierului ]i pozi\ia fiec[rei @nregistr[ri pe dispozitivul de memorare.
Se presupune c[ se cunoa]te valoarea/valorile c`mpului/c`mpurilor cheie ale
@nregistr[rii c[utate.Dac[ se utilizeaz[ mai multe c`mpuri cheie, primul c`mp
cheie se nume]te cheie primar[, al doilea, cheie secundar[ ].a.m.d., iar fi]ierul va
avea indec]i multipli. Dezavantajul utiliz[rii indec]ilor multipli const[ @n faptul
c[, la ]tergerea/ad[ugarea unor @nregistr[ri, trebuie modifica\i to\ii indec]ii,
ceea ce m[re]te timpul de actualizare a fi]ierului. De asemenea, este de dorit ca
indexul (c`mpurile cheie dup[ care se face indexarea) s[ fie c`t mai mic, pentru a
nu ocupa toat[ memoria intern[. Majoritatea limbajelor de programare de nivel
@nalt nu ofer[ comenzi speciale pentru manevrarea fi]ierelor indexate, acest
lucru put`ndu-se realiza @ns[ cu efort minim prin programe, utiliz`ndu-se
facilit[\ile oferite pentru lucrul cu fi]iere secven\iale.

232

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