vineri, 24 ianuarie 2014
Liste
O lista este o colecție de elemente de informație (noduri) aranjate într-o
anumită ordine. Lungimea unei liste este numărul de noduri din lista. Structura
corespunzătoare de date trebuie să ne permită să determinăm eficient care este
primul/ultimul nod din structură și care este predecesorul/succesorul unui nod dat
(dacă există). Iată cum arată cea mai simplă lista, lista liniară:
O listă circulară este o lista în care, după ultimul nod, urmează primul nod,
deci fiecare nod are succesor și predecesor.
Câteva dintre operațiile care se efectuează asupra listelor sunt: inserarea
(adăugarea) unui nod, extragerea (ștergerea) unui nod, concatenarea unor liste,
numărarea elementelor unei liste etc.
Implementarea unei liste se realizează în două moduri: secvențial și înănțuit.
Implementarea secvențială se caracterizează prin plasarea nodurilor în locații
succesive de memorie, în conformitate cu ordinea lor în listă. Avantajele acestui
mod de implementare sunt accesul rapid la predecesorul/succesorul unui nod și
găsirea rapidă a primului/ultimului nod. Dezavantajele sunt modalitățile relativ
complicate de inserarea/ștergere a unui nod și faptul că, în general, nu se folosește
întreaga memorie alocată listei.
Implementarea înlănțuită se caracterizează prin faptul că fiecare nod conține
două părți: informația propriu-zisă și adresa nodului succesor. Alocarea memoriei
pentru fiecare nod se poate face n mod dinamic, în timpul rulării programului.
Accesul la un nod necesită parcurgerea tuturor predecesorilor săi, ceea ce conduce
la un consum mai mare de timp pentru această operatie. In schimb, operatiile
de inserare/ștergere sunt foarte rapide. Se consumă exact atât spațiu de memorie
cât este necesar dar, evident, apare un consum suplimentar de memorie pentru
inregistrarea legăturii către nodul succesor. Se pot folosi două adrese in loc de
una, astfel incat un nod să conțină pe lângă adresa nodului succesor și adresa
nodului predecesor. Obținem astfel o lista dublu inlantuita, care poate fi traversată
in ambele directii.
Listele inlantuite pot fi reprezentate prin tablouri. În acest caz, adresele
nodurilor sunt de fapt indici ai tabloului.
O alternativă este să folosim două tablouri val și next astfel: să memorăm
informația fiecarui nod din locatia val[i], iar adresă nodului sau succesor din locația
next[i]. Indicele locatA¸iei primului nod este memorat in variabila p. Vom conveni că,
pentru cazul listei vide, să avem p =0¸ si next[u] = 0 unde u reprezintă ultimul nod
din lista. Atunci, val[p] va conține informația primului nod al listei, next[p] adresă
celui de-al doilea nod, val[next[p]] informația din al doilea nod, next[next[p]]
adresă celui de-al treilea nod, etc. Acest mod de reprezentare este simplu dar apare problema gestionarii locațiilor libere.
Abonați-vă la:
Postare comentarii (Atom)
Niciun comentariu:
Trimiteți un comentariu