Documente Academic
Documente Profesional
Documente Cultură
2.2. Coada – lista liniara pentru care accesul se face pe la unul din capete (varful
cozii), iar depunerea unui element pe la capatul opus (baza cozii).
Principiul de functionare: FIFO (First In – First Out).
2.3. Coada completa – lista liniara in care depunerile si extragerile sunt permise la
oricare din capetele listei (capatul stang, capatul drept).
Daca la unul dintre capetele cozii complete nu sunt permise operatii de depunere
(extragere) = coada completa restrictionata la intrare (iesire) la acel capat.
2. Liste liniare particulare
2.4. Coada cu prioritati : f : H → A x P, unde A – multime de valori de acelasi tip,
H = {1, 2, …, n}, P = {1, 2, …, m}, f (k) = (v (k), p (k)), v (k) – valoarea
corespunzatoare elementului de pe pozitia k, p (k) – prioritatea elementului de
pe pozitia k.
Cu cat valoarea prioritatii unui element este mai mica, cu atat elementul este mai
prioritar. Implementarea standard presupune p (1) ≥ p (2) ≥ … ≥ p (n).
Varful cozii cu prioritati – pt extragere; baza cozii cu prioritati – pt depunere.
Depunerea unui element:
• q, prioritatea elementului nou, nu apare in coada de prioritati:
• q mai mica decat oricare prioritate existenta => depunere la varf;
• q mai mare decat oricare prioritate existenta => depunere la baza;
• Celelalte cazuri: se determina k a.i. p (k ) > q > p (k + 1), si depunerea se
realizeaza intre elementele k si k + 1.
• q, prioritatea elementului nou, apare in coada de prioritati:
• p (1) = q, depunerea se realizeaza la baza cozii cu prioritati;
• Se determina cea mai mica valoare k pt care p (k) = q si depunerea se
face intre elementele k – 1 si k.
3. Implementarea secventiala a listelor liniare
= elementele listei sunt memorate unul dupa altul in ordinea in care apar in lista, in
locatii de memorie consecutive. (realizare practica: vectori)
x => C: z <= C:
daca B = m daca B = V
atunci underflow
atunci daca V = 0
altfel
atunci overflow V = V + 1; z = A(V)
altfel
pentru i = V + 1, …, B
A(i – V) = A(i)
B = B – V; V = 0
B = B + 1; A(B) = x
3. Implementarea secventiala a listelor liniare
3.2. Coada secventiala
Implementare seventiala circulara
B – baza cozii; V – elementul de dinaintea celui din varful cozii
modulom: N → {1, 2, …, m}
modulom(k) = 1 + r, unde r – restul impartirii lui k la m
Initializarea cozii (C = Φ): B = V = m
x => C: z <= C:
daca V = modulom(B + 1) daca B = V
atunci underflow
atunci overflow
altfel
altfel V = modulom(V + 1);
B = modulom(B + 1) z = A(V)
A(B) = x
3. Implementarea secventiala a listelor liniare
3.3. Coada secventiala completa
D – coada completa; A – vector de m elemente; DL – capat stang; DR – capat drept
Implementare seventiala cu decalare unitara
A(1) = DL; P – pointerul cozii complete; initializare (D = Φ): P = 0
x => DL: x=> DR:
daca P = m daca P = m
atunci overflow
atunci overflow
altfel
altfel P = P + 1; A(P) = x
pentru i = P,…,1
A(i + 1) = A(i)
P = P + 1; A(1) = x
-------------------------------------------------------------------------------------------
z <= DL: z <= DR:
daca P = 0 daca P = 0
atunci underflow
atunci underflow
altfel
altfel z = A(P); P = P -1
z = A(1)
pentru i = 2,…,P
A(i - 1) = A(i)
P=P-1
3. Implementarea secventiala a listelor liniare
3.3. Coada secventiala completa
Implementare seventiala circulara
L - variabila pentru indicarea capatului stang DL; R - variabila pentru indicarea
capatului drept DR; initializare (D = Φ): L = R = m
x => DL: x=> DR:
daca R = modulom(L - 1) daca L = modulom(R + 1)
atunci overflow
atunci overflow
altfel
altfel R = modulom(R + 1)
A(L) = x A(R) = x
L = modulom(L - 1)
-------------------------------------------------------------------------------------------
z <= DL: z <= DR:
daca L = R daca L = R
atunci underflow
atunci underflow
altfel
altfel z = A(R)
L = modulom(L - 1) R = modulom(R - 1)
z = A(L)
3. Implementarea secventiala a listelor liniare
3.4. Coada secventiala cu prioritati
C – coada cu prioritati; baza = primul element; varful = ultimul element; initializare
(C = Φ): E = 0
Implementare cu doi vectori: V, P de dimensiune m; V(i) = valoarea elementului;
P(i) = prioritatea corespunzatoare valorii
(x,y) => C: z <= C:
daca E = m daca E = 0
atunci underflow
atunci overflow
altfel
altfel z = V(E)
P(E + 1) = -1; k = 1 E=E-1
pentru P(k) > y
-------------------------------------------------------------------------------------------
k=k+1
pentru i = E, …, k
V(i + 1) = V(i)
P(i + 1) = P(i)
E=E+1
V(k) = x; P(k) = y
3. Implementarea secventiala a listelor liniare
3.4. Coada secventiala cu prioritati
Implementare printr-un singur vector cu structura de articol
(x,y) => C: z <= C:
daca E = m daca E = 0
atunci underflow
atunci overflow
altfel
altfel z = A(E).V
A(E + 1).P = -1; k = 1 E=E-1
-------------------------------------------------------------------------------------------
pentru A(k).P > y
k=k+1
pentru i = E, …, k
A(i + 1) = A(i)
E=E+1
A(k).V = x; A(k).P = y
3. Implementarea secventiala a listelor liniare
3.5. Liste secventiale cu spatiu partajat
Mai multe structuri liniare partajeaza acelasi spatiu alocat. Restrictie: informatiile
structurilor sunt de acelasi tip.
Ex. Toate structurile implicate sunt stive.
A – vector cu m elemente. S1,…, Sn stive care impreuna nu pot avea simultan mai
mult de m elemente niciodata.
A(1) – baza primei stive nevide. Stivele sunt una in continuarea celeilalte.
V – vector cu n + 2 elemente pt memorarea varfurilor stivelor
S0 – stiva fictiva cu varful in A(0) (element fictiv)
V(i + 1) – varful stivei Si
Sn+1 – stiva fictiva
Initializare {Si = Φ}, i = 1,…,n:
pentru i = 1,…, n + 2
V(i)=0
3. Implementarea secventiala a listelor liniare
3.5. Liste secventiale cu spatiu partajat
x => Si
daca V(n + 2) = m
atunci overflow
altfel
pentru j = V(n + 2), …, V(i + 1) + 1
A(j + 1) = A(j)
pentru j = i + 1, …, n + 1
V(j + 1) = V(j + 1) + 1
A(V(i + 1) + 1) = x; V(i + 1) = V(i + 1) + 1
z <= Si
daca V(i) = V(i + 1)
atunci underflow
altfel
z = A(V(i + 1)); V(i + 1) = V(i + 1) – 1
pentru j = V(i + 1) + 2, …, V(n + 2)
A(j – 1) = A(j)
pentru j = i + 1, …, n + 1
V(j + 1) = V(j + 1) - 1
4. Implementarea inlantuita a listelor liniare
(v, l) = celula; v = valoarea, inf. utila; l = adresa urmatorului elem., inf. de legatura
l = Λ => celula reprezinta capat al listei (legatura nu face referire la o locatie de
memorie valida
Lista vida adresa primului element = Λ.
Lista simplu inlantuita = inf. de legatura are o singura valoare
Lista dublu inlantuita = inf. de leg. are doua val.
Avantaj – alocare dinamica a datelor.
x => C
GETCELL (a)
daca a = Λ
atunci overflow
altfel
inf(a) = x, llink(a) = Λ, rlink(a) = B, B = a
daca V = Λ
atunci V = B
4. Implementarea inlantuita a listelor liniare
4.5. Implementarea cozilor cu dubla inlantuire
z <= C
daca V = Λ
atunci underflow
altfel
a = V, z = inf(a)
V = llink(a), FREECELL(a)
daca V = Λ
atunci B = Λ
altfel rlink(V) = Λ
4. Implementarea inlantuita a listelor liniare
4.6. Implementarea cozilor circulare cu dubla inlantuire
C, B, trecerea spre varful cozii se face cu rlink. V este dat de legatura llink a lui B.
C = Φ: B = Λ
x => C
GETCELL(a)
daca a = Λ
atunci overflow
altfel
inf(a) = x
daca B = Λ
atunci B = a, rlink(a) = a, llink(a) = a
altfel
rlink(a) = B, llink(a) = llink(B)
llink(B) = a, rlink(llink(B)) = a
B=a
4. Implementarea inlantuita a listelor liniare
4.6. Implementarea cozilor circulare cu dubla inlantuire
z <= C
daca B = Λ
atunci underflow
altfel
a = llink(B), z = inf(a)
daca llink(a) = rlink(a)
atunci B = Λ
altfel rlink(llink(a)) = B, llink(B) = llink(a)
FREECELL(a)
4. Implementarea inlantuita a listelor liniare
4.7. Implementarea cozilor cu prioritati cu dubla inlantuire
CP, (llink, inf, prior, rlink), B, V
CP = Φ: B = V = Λ
z <= CP: ca la cozile simple
(x, p) => CP
GETCELL(a)
daca a = Λ
atunci overflow
altfel
inf(a) = x, prior(a) = p
daca B = Λ
atunci llink(a) = Λ, rlink(a) = Λ, B = a, V = a
altfel
daca p ≥ prior(B)
atunci rlink(a) = B, llink(a) = Λ, B = a
altfel
4. Implementarea inlantuita a listelor liniare
4.7. Implementarea cozilor cu prioritati cu dubla inlantuire
q=B
cat timp rlink(q) ≠ Λ si p < prior(q)
q = rlink(q)
daca rlink(q) = Λ si p < prior(q)
atunci
rlink(q) = a, llink(a) = V
rlink(a) = Λ, V = a
altfel
rlink(a) = q, llink(a) = llink(q)
rlink(llink(q)) = a, llink(q) = a