Sunteți pe pagina 1din 13

Liste liniare alocate dinamic

Timar Larisa Clasa a XI-a A larii.marius05@yahoo.com C.N.O.Goga

.!e"initie Se numeste lista o structura de date ce reprezinta o succesiune de noduri astfel incat in fiecare nod se gaseste o legatura catre un alt nod (ex: urmatorul, precedentul etc.).

Acestea sunt folosite la implementarea mai multor structuri de date. Spre exemplu: - grafuri (liste de adiacenta) - cozi - stive

Crearea si #i$uali$area unei liste liniare in C

Liste im%lementate %rin ti%ul %ointer&


Din punct de vedere matematic, o list este o secven de zero sau mai multe elemente numite noduri, de un anumit tip numit tip de az.A!adar o list liniar este o colecie de zero sau mai multe noduri alecror proprieti se reduce "n principal la poziiile relative liniare (unidimensionale) ale acestor noduri. #n loc s pstrm o list liniar "n locaii successive de memorie sepoate folosi o sc$em mult mai flexi il, "n care fiecare nod este legat deur m t o r u l n o d a l l i s t e i p r i n c % m p u l ur m ( t o r ) a l l i s t e i , u n d e p e s t e o varia il pointer care indic primul nod. & x i s t p o s i i l i t a t e a d e a f o l o s i o v a r i a i l d e t i p n o d , " n c a r e c % m p u l u r m ( t o r ) i n d i c pr i m u l n o d e f e c t i v a l l i s t e i , i ar c e l e l a l t e c%mpuri, care ar conine informaia propriu-zis, ar rm%ne neasignate. 'ointerul p va indica "n aceaast situaie, acest nod fictive cap de list.(tilizarea acestui nod de "nceput simplific "n anumite situaii prelucrarea listelor "nlnuite. 'entru crearea listei se va crea mai "nt%i primul nod al listei. )ie po v a r i a i l p o i n t er ( d e t i p r ef e r i n ) c a r e v a i n d i c a m e r e u a d r e s a primului nod al listei !i * o varia il pointer a u x i l i a r t o t d e t i p referin. S c o n s i d e r m c a v e m c r e a t c e l p u i n p r i m u l n o d a l l i s t e i . ' e n t r u adugarea unui nou nod la "nceputul listei tre uie s procedm astfel: generm o nou locaie de memorie cu aceea!i structur a crei adres o memorm "ntr-o varia il de tip pointer *+ pregtim c%mpul c$eie !i c%mpul info al varia ilei pointer *+"n c%mpul urm al acestui nod tre uie s punem adresa primului nod p+ "n final, lui p "i atri uim adresa noului nod care devine acum primul. Clasificarea listelor liniare:

,.Liste sim%lu inlantuite -istele simplu inlantuite sunt structuri de date dinamice omogene. Spre deose ire de masive, listele nu sunt alocate ca locuri omogene de memorie, ci ca elemente separate de memorie. )iecare nod al listei contine, in afara ce informatia utila, adresa urmatorului element. Aceasta organizare permite numai acces secvential la elementele listei. 'entru accesarea listei tre uie cunoscuta adresa primului element (numita capul listei)+ elementele urmatoare sunt accesate parcurgand lista. .peratiile care se pot efectua asupra listelor simplu "nlantuite sunt: adaugarea unui element la lista, stergerea unui element din lista si cautarea dupa anumite criterii. 'entru toate aceste operatii se considera ca exista o varia ila, p, care memoreaza "nceputul listei (adresa primului element), iar elementele sunt definite prin urmatoarea structura: struct element /int data+ struct element 0next+ 1 0p, 0*, 0aux, el+ unde p va fi utilizata pentru memorarea primului element, q va fi utilizat pentru parcurgerea listei iar aux se va folosi la crearea unui nou element "n lista+ el este utilizat doar pentru a avea dimensiunea unui element, necesara pentru functia malloc.

1. Adaugarea unui element la nceputul listei

'entru a insera un element la "nceputul listei tre uie alocat spatiu de memorie pentru un nou element si creata legatura "ntre noul element si primul element din lista. Apoi tre uie mutat "nceputul listei pentru a indica noul element. 2nstructiunile sunt: aux 3 (element 0) malloc (sizeof(el))+ cin 44 aux-5data+ aux-5next 3 p+ p3aux+ 2. Adaugarea unui element la sfrsitul listei 'entru aceasta operatie tre uie parcursa lista p%na la ultimul element care va fi legat de un element nou creat. 2nstructiunile sunt: * 3 p+ 6$ile (*-5next 73 8(--) * 3 *-5next+ aux 3 (element 0) malloc (sizeof(el))+ cin 44 aux-5data+ aux-5next 3 8(--+ *-5next 3 aux+ 3. Adaugarea unui element naintea unui element care ndeplineste o anumita conditie 'entru aceasta operatie tre uie parcursa lista p%na la gasirea elementui cautat, astfel "nc%t indicatorul sa se opreasca pe elementul anterior. Apoi tre uie creat un nou element si se vor crea legaturile (elementul indicat este legat de elementul nou si elementul nou este legat de urmatorul element din lista). Situatia tre uie tratata "n mod diferit pentru primul element fata de celelalte,

deoarece inserarea unui element "naintea primului element al listei presupune mutarea "nceputului listei. 2nstructiunile sunt: cout 44 92ntroduceti elementul din lista:+ cin 55 n+ if (p-5data 33 n) /aux 3 (element 0) malloc (sizeof(el))+ cin 44 aux-5data+ aux-5next 3 p+ p3aux+1 else /* 3 p+ 6$ile (*-5next-5data 73 n) ;;daca data din elementul urmator este egala cu n * 3 *-5next+ aux 3 (element 0) malloc (sizeof(el))+ cin 44 aux-5data+ aux-5next 3 *-5next+ *-5next 3 aux+ 1 4. Stergerea unui element din lista 'resupune crearea legaturii "ntre elementul anterior elementului sters si cel urmator. Se va face distictie "ntre primul element si celelalte elemente din lista. 2nstructiunile sunt: cout 44 92ntroduceti elementul pe care doriti sa il stergeti:+ cin 55 n+ if (p-5data 33 n)

/aux 3 p+ p 3 p-5next+ free(aux)+ 1 else /* 3 p+ 6$ile (*-5next-5data 73 n) ;;daca data din elementul urmator este egala cu n * 3 *-5next+ aux 3 *-5next+ *-5next 3 *-5next-5next+ free(aux)+ 1

<.-iste du lu inlantuite -istele du lu "nlantuite prezinta avanta=ul legarii fiecarui element at%t cu elementul urmator c%t si cu cel anterior, astfel "nc%t parcurgerea listei se poate face "n am ele sensuri. .peratiile care se pot efectua asupra listelor du lu "nlantuite sunta aceleasi ca pentru listele simplu "nlantuite, adica: adaugarea unui element la lista, stergerea unui element din lista si cautarea dupa anumite criterii. 'entru toate aceste operatii se considera ca exista o varia ila, p, care memoreaza "nceputul listei (adresa primului element), iar elementele sunt definite prin urmatoarea structura: struct element /int data+ struct element 0next, 0prev+

1 0p, 0*, 0aux, el+ unde p va fi utilizata pentru memorarea primului element, q va fi utilizat pentru parcurgerea listei iar aux se va folosi la crearea unui nou element "n lista+ el este utilizat doar pentru a avea dimensiunea unui element, necesara pentru functia malloc. 1. Adaugarea unui element la nceputul listei 'entru a insera un element la "nceputul listei tre uie alocat spatiu de memorie pentru un nou element si creata legatura "ntre noul element si primul element din lista. Apoi tre uie mutat "nceputul listei pentru a indica noul element. 2nstructiunile sunt: aux 3 (element 0) malloc (sizeof(el))+ cin 44 aux-5data+ aux-5next 3 p+ aux-5prev 3 p-5prev+ p-5prev 3 aux+ p3aux+ 2. Adaugarea unui element la sfrsitul listei 'entru aceasta operatie tre uie parcursa lista p%na la ultimul element care va fi legat de un element nou creat. 2nstructiunile sunt: * 3 p+ 6$ile (*-5next 73 8(--) * 3 *-5next+ aux 3 (element 0) malloc (sizeof(el))+ cin 44 aux-5data+ aux-5next 3 8(--+ *-5next 3 aux+

aux-5prev 3 *+ 3. Adaugarea unui element dupa unui element care ndeplineste o anumita conditie 'entru aceasta operatie tre uie parcursa lista p%na la gasirea elementui cautat. Apoi tre uie creat un nou element si se vor crea legaturile. Situatia tre uie tratata "n mod diferit pentru primul element fata de celelalte, deoarece inserarea unui element "naintea primului element al listei presupune mutarea "nceputului listei. 2nstructiunile sunt: cout 44 92ntroduceti elementul din lista:+ cin 55 n+ if (p-5data 33 n) /aux 3 (element 0) malloc (sizeof(el))+ cin 44 aux-5data+ aux-5next 3 p+ p-5prev 3 aux+ p3aux+1 else /* 3 p+ 6$ile (*-5data 73 n) * 3 *-5next+ aux 3 (element 0) malloc (sizeof(el))+ cin 44 aux-5data+ aux-5next 3 *-5next+ *-5next-5prev 3 aux+ *-5next 3 aux+ aux-5prev 3 *+ 1

4. Stergerea unui element din lista 'resupune crearea legaturii "ntre elementul anterior elementului sters si cel urmator. Se va face distictie "ntre primul element si celelalte elemente din lista. cout 44 92ntroduceti elementul pe care doriti sa il stergeti:+ cin 55 n+ if (p-5data 33 n) /aux 3 p+ p 3 p-5next+ free(aux)+ 1 else /* 3 p+ 6$ile (*-5next-5data 73 n) ;;daca data din elementul urmator este egala cu n * 3 *-5next+ aux 3 *-5next+ *-5next 3 *-5next-5next+ *-5next-5next-5prev 3 *+ free(aux)+ 1

'.Liste circulare sim%lu inlantuite Sunt similare listelor simplu "nlantuite, dar ultimul element este legat de primul. .peratiile sunt similare, iar diferentele apar doar la prelucrarea ultimului element (adaugarea unui element la sf%rsitul listei, stergerea acestuia), precum si la conditia de oprire la parcurgerea listei, deoarece adresa memorata de ultimul element nu mai este 8(--, ci este adresa "nceputului listei. &lementele sunt definite prin urmatoarea structura: struct element /int data+ struct element 0next+ 1 0p, 0*, 0aux, el+ unde p va fi utilizata pentru memorarea primului element, q va fi utilizat pentru parcurgerea listei iar aux se va folosi la crearea unui nou element "n lista+ el este utilizat doar pentru a avea dimensiunea unui element, necesara pentru functia malloc. 1. Adaugarea unui element la nceputul listei 'entru a insera un element la "nceputul listei tre uie alocat spatiu de memorie pentru un nou element si creata legatura "ntre noul element si primul element din lista, precum si legatura "ntre ultimul element din lista si noul element creat. Apoi tre uie mutat "nceputul listei pentru a indica noul element. 2nstructiunile sunt: * 3 p+ 6$ile (*-5next 73 p)

* 3 *-5next+ ;; * va indica ultimul element din lista aux 3 (element 0) malloc (sizeof(el))+ cin 44 aux-5data+ aux-5next 3 p+ *-5next 3 aux+ p3aux+ 2. Adaugarea unui element la sfrsitul listei 'entru aceasta operatie tre uie parcursa lista p%na la ultimul element care va fi legat de un element nou creat. 2nstructiunile sunt: * 3 p+ 6$ile (*-5next 73 p) * 3 *-5next+ aux 3 (element 0) malloc (sizeof(el))+ cin 44 aux-5data+ aux-5next 3 p+ *-5next 3 aux+ (.Liste circulare du)lu inlantuite Sunt similare listelor du lu "nlantuite, dar primul si ultimul element sunt legate "ntre ele..peratiile sunt similare, iar diferentele apar la prelucrarea primului si ultimului element (adaugarea unui element la "nceput;sf%rsit, stergerea acestuia), precum si la conditia de oprire la parcurgerea listei, deoarece adresa memorata de ultimul element nu mai este 8(--, ci este adresa "nceputului listei. &lementele sunt definite prin urmatoarea structura: struct element

/int data+ struct element 0next, 0prev+ 1 0p, 0*, 0aux, el+ unde p va fi utilizata pentru memorarea primului element, q va fi utilizat pentru parcurgerea listei iar aux se va folosi la crearea unui nou element "n lista+ el este utilizat doar pentru a avea dimensiunea unui element, necesara pentru functia malloc. 1. Adaugarea unui element la nceputul listei 'entru a insera un element la "nceputul listei tre uie alocat spatiu de memorie pentru un nou element si creata legatura "ntre noul element si primul element din lista, precum si legatura "ntre ultimul element din lista si noul element creat. Apoi tre uie mutat "nceputul listei pentru a indica noul element. 2nstructiunile sunt: aux 3 (element 0) malloc (sizeof(el))+ cin 44 aux-5data+ aux-5next 3 p+ p-5prev-5next 3 aux+ aux-5prev 3 p-5prev+ p-5prev 3 aux+ p3aux+ 2. Adaugarea unui element la sfrsitul listei 'entru aceasta operatie tre uie parcursa lista p%na la ultimul element care va fi legat de un element nou creat. 2nstructiunile sunt:

* 3 p+ 6$ile (*-5next 73 8(--) * 3 *-5next+ aux 3 (element 0) malloc (sizeof(el))+ cin 44 aux-5data+ *-5next 3 aux+ aux-5prev 3 *+ aux-5next 3 p+ p-5prev 3 aux+

*i)liogra"ie& htt%&++,,,.scri)d.com+doc+((-(0../+Crearea-0i-1i$uali$area-2neiListe-Liniare-in-C $ttp:;;acs.ase.ro;Structuri;Suport;>?@-isteSimple.pdf $ttp:;;tet.pu .ro;mat;an,;sda@la ;-ucrarea?.pdf