|
Liste
Aspecte teoretice. Defini?ie. Opera?ii asupra listelor
O list? L e o secven?? de zero sau mai multe elemente, numite noduri, toate fiind de acela?i tip de baza T. L=a1,a2,...,an (n>=0)
Dac? n>=1, a1 se spune c? este primul nod al listei, iar an, ultimul nod. Daca n=0, lista este vida.
O proprietate important? a unei liste este aceea c? nodurile sale pot fi ordonate liniar func?ie de pozi?ia lor în cadrul listei. Se spune c? ai precede pe ai+1 (i=1,2,...,n-1), iar ai succede pe ai-1 (i=2,3,...,n), ai aflându-se pe pozi?ia i.
Se postuleaz?(presupune) existenta pozi?iei urm?toare ultimului element al listei ?i se introduce func?ia FIN(L) ce va returna pozi?ia urm?toare pozi?iei n din lista L de n elemente.
Folosind nota?iile anterioare ?i notând x(de tip T) un nod al listei, iar p fiind de tip pozi?ie, se introduce urm?torul set reprezentativ de operatori aplicabili obiectelor de tip lista:
INSEREAZA(L,x,p)- insereaz? în lista L nodul x, în pozi?ia p;
dac? L=a1,a2,...,an, în urma inser?iei:
pFIN(L),rezultatul inser?iei este imprevizibil.
Implementarea listelor . Structuri recursive de tip list? Cu ajutorul tipului pointer, se define?te structura unui nod al listei liniare care apare ca o structur? recursiv?, având o component? de tip identic cu al structurii complete.
type PointerNod=^Nod;
Nod=record
cheie:TipCheie; urmator:PointerNod; info:TipInfo end; var început:PointerNod; Caracteristica unei astfel de structuri const? în prezenta unei singure înl?n?uiri. Câmpul cheie serve?te la identificarea nodului( acest câmp poate face parte din informa?ia util?, el este utilizat în cazul c?ut?rilor, sort?rii…), câmpul urm?tor e pointer de înl?n?uire la nodul urm?tor, iar cel info con?ine informa?ia util?. Variabila început indica spre primul nod al listei; în unele situa?ii în locul lui început se utilizeaz? un nod fictiv, adic? o variabila de tip nod cu câmpurile cheie ?i info neprecizate, dar câmpul urm?tor indicând spre primul nod al listei.
De asemenea uneori e util a se p?stra pointerul spre ultimul nod al listei.
O varianta este a listelor circulare la care dispare no?iunea de prim, ultim nod.
Tehnici de inser?ie a nodurilor ?i de creare a listelor înl?n?uite
a)inser?ia unui nod la începutul listei Dac? început e variabila pointer ce indica spre primul nod al listei, iar q o variabila auxiliara de tip pointer, secven?a urm?toare realizeaz? inser?ia la începutul listei ?i actualizeaz? pointerul început:
new(q); {creeaz? spa?iu pentru un nou nod}
q^.urmator:=inceput;
{asignarea câmpurilor cheie ?i info}
inceput:=q;
Secven?a e corect? ?i pentru inser?ia într-o list? vid?, caz în care inceput=nil (nil fiind pointerul vid, care nu se refera la nici o variabil? indicat?).
b)inser?ia unui nod la sfâr?itul listei
|