Liste+Liniare

Se numeste //lista// o structura de date omogene ce memoreaza o succesiune de obiecte(numite noduri) intre care exista o relatie de ordonare. A=(a1,a2,a3,..an)
 * Liste liniare **
 * __1.Definitie __**

**omogene**=fiecare element al multimii are acceasi componenta relatie de **ordonare**=fiecare element din interiorul listei are predecesor si succesor

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

2.1 Liste alocate secvenţial = nodurile listei ocupă poziţii succesive în memorie, se realizează prin alocare statică întâlnită la vectori.  2.2 Liste alocate înlănţuit care pot implementate static sau dinamic.
 * __2. Implementare __**

 Listele inlănţuite pot fi:  A. Liste generale: <span style="font-family: Arial,sans-serif;"> a. lista simplu inlănţuită <span style="font-family: Arial,sans-serif;"> b. lista dublu înlănţuită <span style="font-family: Arial,sans-serif;"> c. lista circulara <span style="font-family: Arial,sans-serif;">B. Liste restrictive <span style="font-family: Arial,sans-serif;"> a. Stiva <span style="font-family: Arial,sans-serif;"> b. Coada

Liste liniare simplu inlantuite implementate dinamic:



<span style="font-family: Arial,sans-serif;">Listele simplu inlantuite sunt structuri de date dinamice omogene. Spre deosebire de masive, listele nu sunt alocate ca blocuri omogene de memorie, ci ca elemente separate de memorie. Fiecare nod al listei contine, in afara ce informatia utila, adresa urmatorului element. Aceasta organizare permite numai acces secvential la elementele listei.

<span style="font-family: Arial,sans-serif;">Pentru accesarea listei trebuie cunoscuta adresa primului element (numita capul listei); elementele urmatoare sunt accesate parcurgand lista.

<span style="font-family: Arial,sans-serif;">Pentru crearea listei se va crea mai întâi primul nod al listei. Fie po variabilă pointer (de tip referinţă) care va indica mereu adresa primului nod al listei şi q o variabilă pointer auxiliară tot de tipreferinţă. Să considerăm că avem creat cel puţin primul nod al listei. Pentru adăugarea unui nou nod la începutul listei trebuie să procedăm astfel: generăm o nouă locaţie de memorie cu aceeaşi structură a cărei adresă o memorăm într-o variabilă de tip pointer q; pregătim câmpul cheie şi câmpul info al variabilei pointer q;în câmpul urm al acestui nod trebuie să punem adresa primului nod p; în final, lui p îi atribuim adresa noului nod care devine acum primul.

<span style="font-family: Arial,sans-serif;"> Operatiile care se pot efectua asupra listelor simplu înlantuite sunt: adaugarea unui element la lista, stergerea unui element din lista si cautarea dupa anumite criterii. <span style="font-family: Arial,sans-serif;">Pentru toate aceste operatii se considera ca exista o variabila, //prim//, care memoreaza începutul listei (adresa primului element), iar elementele sunt definite prin urmatoarea structura: code struct nod{ <tip_de_data> inf; nod *next; }; nod *prim;

code <span style="font-family: Arial,sans-serif;">unde //prim// va fi utilizata pentru memorarea primului element,

Operația **de adăugare noduri**
<span style="font-family: Arial,sans-serif;">Pentru a insera primul element la începutul listei trebuie alocat spatiu de memorie pentru un nou element.
 * //<span style="font-family: Arial,sans-serif;">1. Ad //<span style="font-family: Arial,sans-serif;">a//ugarea primului element in lista// **

<span style="font-family: Arial,sans-serif;">Subprogramul pentru adaugarea primului nod cu informatia x in lista<span style="font-family: Arial,sans-serif;">:

code void initializare(int x)//adaugare primului nod cu informatia x in lista {   prim=new nod; prim->inf=x; prim->next=NULL; } code

//2.// **<span style="font-family: Arial,sans-serif;">Ad //<span style="font-family: Arial,sans-serif;">a //ugarea unui nod la începutul listei**

//<span style="font-family: Arial,sans-serif;">Pentru a insera un nod la începutul listei trebuie alocat spatiu de memorie pentru un nou element si creata legatura între noul element si primul element din lista. //

code int esteVida//verificare daca lista nu contine noduri {   return prim==NULL; } code code void adaugaInceput(int x)//adaugare la inceputul listei { nod *p; if(esteVida)//nu am noduri in lista initializare(x); else{ p=new nod; p->inf=x; p->next=prim; prim=p;

}   }

code

//**<span style="font-family: Arial,sans-serif;">3. Ad **//**<span style="font-family: Arial,sans-serif;">a //ugarea unui element la sfâr//s//itul listei//** <span style="font-family: Arial,sans-serif;">Pentru aceasta operatie trebuie parcursa lista pâna la ultimul element care va fi legat de un element nou creat. <span style="font-family: Arial,sans-serif;">Instructiunile sunt: code void adaugaFinal(int x)//adaugarea unui nod la finalul listei nod {   nod *p,*q=prim; if (esteVida)//nu am noduri in lista initializare(x); else//am deja noduri in lista {       p=new nod;//aloc memorie pentru un nod nou p->inf=x;//adaug informatia in nod p->next=NULL; while(q->next!=NULL)//ma pozitionez pe ultimul nod in lista q=q->next; q->next=p;//leg ultimul nod din lista de noul nod creat } } code

<span style="font-family: Arial,sans-serif;">Pentru aceasta operatie trebuie: <span style="font-family: Arial,sans-serif;">-parcursa lista pâna la gasirea elementui cautat, astfel încât indicatorul sa se opreasca pe elementul care indeplineste conditia; <span style="font-family: Arial,sans-serif;">-se creeaza 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). <span style="font-family: Arial,sans-serif;">Subprogramul pentru adaugarea nodului cu informatia x dupa nodul cu informatia n code void adaugaDupaNod(int x, int n) { if(esteVida) initializare(x); else {nod *q = prim; while ( q && q->inf!= n) q = q->next; if(q==NULL) cout<<"Nu s-a gasit valoarea cautata"; else{ nod *aux = new nod; aux->inf=x; aux->next = q->next; q->next = aux;} } } code
 * //<span style="font-family: Arial,sans-serif;">4. //****//<span style="font-family: Arial,sans-serif;">Ad //<span style="font-family: Arial,sans-serif;">a//ugarea unui element dupa elementul care îndepline//s//te o anumit//a //condi//t//ie// **

<span style="font-family: Arial,sans-serif;">Pentru aceasta operatie trebuie: <span style="font-family: Arial,sans-serif;">-parcursa lista pâna la gasirea elementui inaintea celui cautat, astfel încât indicatorul sa se opreasca pe elementul anterior celui care indeplineste conditia; <span style="font-family: Arial,sans-serif;">-se creeaza 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). <span style="font-family: Arial,sans-serif;">Subprogramul pentru adaugarea nodului cu informatia x inainte de nodul cu informatia n code void adaugaInainteNod(int x, int n) { if(esteVida) initializare(x); else{ if (prim->inf == n) adaugaInceput(x); else {nod *q = prim; while (q->next->inf!= n) q = q->next; nod *aux = new nod; aux->inf=x; aux->next = q->next; q->next = aux;}}} code
 * //<span style="font-family: Arial,sans-serif;">5. Ad //<span style="font-family: Arial,sans-serif;">a//ugarea unui element inainte de elementul care îndepline//s//te o anumit//a //condi//t//ie// **

Operatia de stergere din lista
//**<span style="font-family: Arial,sans-serif;">6. Stergerea primului element din list **//**<span style="font-family: Arial,sans-serif;">a ** <span style="font-family: Arial,sans-serif;">Presupune crearea legaturii între elementul anterior elementului sters si cel urmator. Se va face distictie între primul element si celelalte elemente din lista.Memoria ocupata de nod trebuie eliberata la stergere prin comanda **delete.**

<span style="font-family: Arial,sans-serif;">Instructiunile sunt: code void stergeInceput{ nod *p=prim; if(esteVida) cout<<"Lista este vida"<<endl; else{ prim=prim->next; delete p;} } code

<span style="font-family: Arial,sans-serif;">**7**. //**<span style="font-family: Arial,sans-serif;">Stergerea nodului cu informatia x **// <span style="font-family: Arial,sans-serif;"> Presupune crearea legaturii între elementul anterior elementului sters si cel urmator. Se va face distictie între primul element si celelalte elemente din lista.Memoria ocupata de nod trebuie eliberata la stergere prin comanda **<span style="font-family: Arial,sans-serif;">delete. ** code void stergere(int x) { if (prim->inf == x) {nod *aux = prim; prim = prim->next; delete aux; } else {nod *q = prim; while (q->next!=NULL && q->next->inf != x ) //daca data din elementul urmator este egala cu x q = q->next; if(q->next==NULL) cout<<" nu exista nodul "<<x<<endl; else{

nod *aux = q->next; q->next = q->next->next; delete aux; } } } code

Operatia de afisare a listei
code void afisare//afisare lista {   nod *p=prim; while(p)// am noduri in lista {       cout<<p->inf<<" "; p=p->next; }   cout<<endl; } code

=**Exemple de implementare:**=
 * 1) <span style="font-family: Arial,sans-serif; line-height: 1.5;">[[file:liste_alocate_dinamic.cpp|Lista liniara alocata dinamic]], [[file:liste_alocate_dinamic_1.cpp|Var 1]], [[file:4_lista.cpp|Var2]],
 * 2) <span style="font-family: Arial,sans-serif; line-height: 1.5;">[[file:2_liste_alocate_dinamic.cpp|Creare 2 liste & sortare prin insertie]]
 * 3) [[file:vicov/Stiva.cpp|Stiva]]
 * 4) [[file:vicov/Coada.cpp|Coada]]


 * Exercitii:**
 * 1) <span style="font-family: Verdana,sans-serif; font-size: 9pt;">Sa se construiasca o lista liniara simplu inlantuita care sa contina o secventa de numere intregi citite din fisierul **lista.txt** . Construiti subprograme adecvate astfel incat:
 * <span style="font-family: Verdana,sans-serif; font-size: 9pt; line-height: 1.5;">Sa se afiseze **elementele** listei
 * <span style="font-family: Verdana,sans-serif; font-size: 9pt; line-height: 1.5;"><span style="font-family: Verdana,sans-serif; font-size: 9pt; line-height: 1.5;">Sa se afiseze **numarul de noduri** din lista
 * <span style="font-family: Verdana,sans-serif; font-size: 9pt; line-height: 1.5;">Sa se testeze daca **x**-numar intreg citit de la tastatura se gaseste in lista.
 * Sa se separe elementele pare de cele impare in **2 liste separate**.
 * Modificati lista initiala astfel incat sa se <span style="font-family: Verdana,sans-serif; font-size: 9pt;"> **insereze** dupa fiecare nod care memoreaza o valoare para un nod care sa memoreze jumatate din valoarea acestuia
 * <span style="font-family: Verdana,sans-serif; font-size: 9pt;">Stergeti din lista initiala nodurile cu valori pare.

2. Sa se creeze o lista liniara simplu inlantuita care sa memoreze urmatoarele informatii despre elevii unei clase formata din n elevi: - numele (sir de maxim 20 de caractere)

- prenumele (sir de maxim 20 de caractere) - 3 note intr-un vector cu 3 componente reale b) Sa se afiseze numele, prenumele si media fiecarui elev. c) Sa se scrie o functie care calculeaza si returneaza media clasei. ...+ fisier

<span style="font-family: Arial,sans-serif; font-size: 11pt;">3. Intr-un fisier text se gasesc numere naturale. Sa se ordoneze crescator numerele din fisier folosind o lista liniara simplu inlantuita. Se va folosi metoda sortarii prin insertie.

4. [|Grile cu Liste] 5. [|Test Liste]