Documente Academic
Documente Profesional
Documente Cultură
• Extragerea unui nod dintr-o listă liniară alocată înlănţuit se realizează mult mai uşor decât
extragerea unui nod dintr-o listă liniară alocată secvenţial. Pentru alocarea secvenţială o
asemenea ştergere implică în general deplasarea unei părţi din listă în locaţii diferite. O concluzie
similară se obţine în cazul inserării unui nod în cadrul unei liste liniare.
• Accesul la diferite părţi din listă este mult mai rapid în cazul alocării secvenţiale. Aşa cum am
văzut, locaţia nodului k din listă în cazul alocării secvenţiale este o funcţie liniară de k, deci
pentru a obţine accesul la acest nod se consumă un timp constant. În cazul alocării înlănţuite acest
acces necesită k iteraţii urmărind referinţele a k-1 noduri. Astfel utilizarea memoriei înlănţuite
este mai eficientă când parcurgerea listei se face secvenţial şi nu aleatoriu.
• Alocarea înlănţuită permite o mai mare flexibilitate în ceea ce priveşte reunirea a două sau mai
multor liste într-o singură listă sau desfacerea unei liste în mai multe părţi.
• Spre deosebire de variabilele statice, variabilele dinamice se alocă şi se distrug la
cererea utilizatorului; ele nu sunt declarate într-o secţiune var, deci nu se pot
identifica prin nume şi nici nu există pe toată durata activării blocului în care s-au
creat. Din acest motiv, variabilele dinamice prezintă un mare avantaj comparativ
cu cele statice, şi anume posibilitatea utilizării mult mai eficiente a memoriei.
• Variabilele dinamice se alocă dinamic într-o zonă specială, numită HEAP
care este eliberată la „distrugerea” variabilei dinamice. Neavând nume, variabilele
dinamice trebuie referite prin intermediul altor variabile, numite din acest motiv
variabile reper(sau variabile referinţă).
• Zona HEAP cuprinde, de obicei, memoria liberă rămasă în momentul
executării unui program. Dimensiunea zonei STACK şi/sau dimensiunea minimă şi
maximă a zonei HEAP pot fi specificate prin comanda MEMORY SIZES din meniul
OPTIONS sau prin directiva de compilare $M. Dimensiunea minimă implicită a
zonei HEAP este 0, iar cea maximă 640 KB.
• Variabilele reper sunt alocate static şi au ca valori adrese ale unor variabile
dinamice de un anumit tip.
Definiţie :
prim ultim
Inf urm
Observaţie :
type adresa=^ nod ; Ultimul element al listei (cel aflat la adresa
nod= record ultim) conţine ca informaţie de legătură valoarea
inf :tip_informaţie; constantei predefinite nil, cu semnificaţia că după
urm : adresă; acest element nu mai există în listă nici un alt
end; element .
Var prim ,ultim :adresă
inf urm
inf urm
q
1. se alocă spaţiu pentru noul nod q
new(q ); procedure adauga_in_fata(p:adresa);
2. se copie informaţia din nodul p în var q:adresa;
nodul q begin
q^.inf:=p^.inf; new(q);
3. se citeşte noua informaţie în p q^.inf:=p^.inf;
write(‘dati informatia: ’); write(‘dati informatia:’);
readln(p^.inf); readln(p^.inf);
4. se leagă nodul q la listă q^.urm:=p^.urm;
q^.urm:=p^.urm; p^.urm:=q;
5. se leagă nodul p de nodul q end;
p^.urm:=q;
inf urm inf urm inf urm inf urm
inf urm inf urm ................. inf urm
nil inf nil
prim p ultim
Parcurgem nodurile liste cu ajutorul unui pointer p care, plecând de la primul nod
va referi pe rând fiecare nod al listei : prelucrăm informaţia din nodul p, mutăm p la
următorul nod şi prelucrarea continuă.
Procedure parcurgere(prim:adresa);
var p:adresa;
Cât timp pointerul p nu a ajuns la sfârşitul begin
listei {p<>nil}: p:=prim;
- prelucrăm informaţia din nodul p (p^.inf) while p<>nil do
- mutăm pointerul p la nodul următor begin
{p:=p^.urm} {prelucrarea informatiei din nodul p}
p:=p^.urm;
end;
end;
Cât timp pointerul p nu a ajuns la sfârşitul listei {p<>nil} şi informaţia memorată
în zona inf a nodului curent este diferită de x :
- mutăm pointerul p la nodul următor
Procedure parcurgere(prim:adresa);
var p:adresa;
Cât timp pointerul p nu a ajuns la sfârşitul begin
listei {p<>nil}: p:=prim;
- prelucrăm informaţia din nodul p (p^.inf) writeln;
- mutăm pointerul p la nodul următor write(‘rezultatul este:’);
{p:=p^.urm} while p<>nil do
begin
{prelucrarea informatiei din nodul p }
p:=p^.urm;
end;
writeln;
end;
2. Stiva
Ce este o stiva?
Prin stivă (în limba engleză stack) înţelegem o listă
unidirecţională cu proprieta-tea că operaţiile de
introducere şi extragere a elementelor se fac la un
singur capăt al ei. Poziţia ocupată în stivă de ultimul
element introdus poartă numele de vîrf. O stivă fără
niciun element se numeşte stivă vidă.
Pentru exemplificare, în figura 2 este prezentată o
stivă care conţine elementele A, B, C.
Cum se reprezinta o stiva?
S C
S C
B
B
A
A
Reprezentatea generalizată
D D
S
C s s
C C
B B B
A A A
Introducearea elementului D Extragerea elementelor D şi C
Stiva iniţială
6 13
4 8 12 15
2 5 7 9 11 14 16
1 3