type pointer=^nod; nod=record info:tip_info; anterior,urmator:pointer end;Listele circulare se folosesc si in varianta in care se pastreaza o variabila pointer spre primul nod, ultimul avind inlantuirea nil, precum si in varianta circulara in care primul nod se inlantuie dublu cu ultimul;in varianta circulara, dispare notiunea de prim, ultim nod, existind doar un pointer ce indica un nod oarecare din lista, parcurgerea celorlalte putind fi facuta in oricare din cele doua sensuri.
Asupra tipului abstract de date stiva sint definiti urmatorii cinci operatori:
Se definesc urmatorii operatori:
Coada bazata pe prioritate e structura de date abstracta care permite insertia unui nou element si suprimarea celui mai mare element dintre cele existente. Structura difera de coada ( din care se suprima primul venit, deci elementul cel mai vechi ) si de stiva ( din care se suprima ultimul venit, deci cel mai nou ).
Asupra acestei structuri de date, ale carei elemente sint articole cu chei ( sau prioritati ), se definesc operatiile :
Flexibilitatea acestei structuri de date e mare, se foloseste in baze de date, dar manipularea este dificila.
Unitatea fundamentala in LISP este atomul ( sir de caractere si/sau cifre ).
O lista este o multime de paranteze ce contin un numar oarecare de atomi si liste.
Atomii si listele sint memorate cu structuri de date speciale numite liste generalizate, cu nodurile avind trei cimpuri :
-Atom - boolean -Info - daca Atom este true, altfel un -Pointer - spre o lista -Urm - cimp de inlantuireIn PASCAL, o astfel de structura este definita :
type ListaGeneralizata=^Nod; Nod=record Urm:ListaGeneralizata; case Atom:boolean of true:( Info:char); false:(Lista:ListaGeneralizata) end;
Uneori nu se poate stabili o expresie matematica prin care sa se exprime asocierile tuturor valorilor tipului domeniu, astfel incit trebuie memorate valorile lui M(D) pentru fiecare D.
Operatiile ce se definesc asupra structurii de tip asociere sint:
De asemenea, asocierea memoriei se mai implementeaza si printr-o lista, fiecare nod continind o pereche (D,V). 7.Aplicatii 1.Se cere sa se implementeze operatorii de prelucrare pentru liste dublu inlantuite, utilizind drept suport de implementare structuri de date de tip: a) tablou b) pointer c) cursor. Fiecare din aceste implementari se vor realiza in doua variante: una obisnuita si o a doua , in care lista e circulara, avind un nod fictiv care "inchide lista ". Se vor masura timpii de executie ai operatorilor, facind aprecieri asupra performantelor. 2.O lista dublu inlantuita existenta in memorie contine o expresie aritmetica in notatie postfix, in care operanzii sint reprezentati prin litere mici, iar operatorii pot fi +, -, * sau / , nodurile avind urmatoarea structura: type pointer=^nod; nod=record oper:char; {litera (numele variabilei) sau unul din operatorii admisi } val:real; {valoarea operandului sau 0 daca nodul corespunde unui operator } urm,ant:pointer {inlantuirile inainte si inapoi} end; Sa se scrie cite o procedura de evaluare a expresiei in urmatoarele variante: -reducind pe rind cite trei noduri (continind 2 operanzi si un operator) la un nod continind rezultatul partial, pina la reducerea listei la un singur nod continind rezultatul final -folosind o stiva in care se depun valorile operanzilor si rezultatele partiale (se va implementa stiva printr-o lista sau tablou) Pe parcursul evaluarii, se vor face verificarile privind corectitudinea expresiei, o eroare find semnalata printr-un mesaj si oprind evaluarea expresiei. Sa se compare timpii de executie ai celor doua variante. 3.Este posibil sa fie memorate doua structuri de date de tip stiva intr-un acelasi tablou, una crescind de la pozitia 1 spre sfirsit, cealalta in sens invers. Se cere sa se redacteze o procedura PUSH(X,S) unde S este una sau alta dintre stive. Procedura va include toate testele de eroare necesare, care vor fi semnalate prin mesaje corespunzatoare. 4.Se cere sa se elimine recursivitatea din urmatoarele proceduri: function combinari(n,m:integer):integer; {calculeaza combinari de n luate cite m presupunind ca 0<=m<=n si n>=1} begin if (n=1) or (m=0) or (m=n) then combinari:=1 else combinari:=combinari(n-1,m)+combinari(n-1,m-1) end; procedure inversare(var l:lista); {inverseaza lista l} var x:tip_element; begin if not {lista vida} then begin x:=furnizeaza(primul(l),l); suprima(primul(l),l); inversare(l); insereaza(l,x,fin(l)) end end; Sa se compare timpii de executie pentru variantele recursiva si nerecursiva. 5.O coada cu doua capete (DEQUEUE) este o lista in care elementele pot fi suprimate sau inserate la ambele capete. Se cere sa se dezvolte implementarea unor astfel de cozi utilizind structuri de tip tablou, pointer si cursor.