Вы находитесь на странице: 1из 6

Liste simplu inlantuite

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. Pentru accesarea listei trebuie cunoscuta adresa primului element (numita capul listei); elementele urmatoare sunt accesate parcurgand lista. Lista simplu inlantuita poate fi reprezentata grafic astfel:

1. Structura listei
Pentru a asigura un grad mai mare de generalitate listei a fost creat un alias pentru datele utile (in cazul nostru un intreg):
// Datele asociate unui // element dintr-o lista typedef int Date;

In cazul in care se doreste memorarea unui alt tip de date, trebuie schimbata doar declaratia aliasului Date. Pentru memorarea listei se foloseste o structura autoreferita. Acesta structura va avea forma:
// Structura unui element // dintr-o lista simplu inlantuita struct Element { // datele efective memorate Date valoare; // legatura catre nodul urmator Element* urmator; };

In cazul in care elemenul este ultimul din lista, pointerul urmator va avea valoarea NULL. Declararea listei se face sub forma:
// declarare lista vida Element* cap = NULL;

2. Operatii cu liste
Principalele operatii cu liste sunt:

Parcurgere si afisare lista


Lista este parcursa pornind de la pointerul spre primul element si avansand folosind pointerii din structura pana la sfarsitul listei (pointer NULL).
// Parcurgere si afisare lista simpla void Afisare(Element* cap) { // cat timp mai avem elemente // in lista while (cap != NULL) { // afiseaza elementul curent cout << cap->valoare << endl; // avanseaza la elementul urmator cap = cap->urmator; } }

Inserare element
Inserarea unui element se poate face la inceputul sau la sfarsitul listei. a) Inserare la inceput Acesta este cazul cel mai simplu: trebuie doar alocat elementul, legat de primul element din lista si repozitionarea capului listei:
// Inserare element la inceputul unei // liste simplu inlantuite void InserareInceput(Element* &cap, Date val) { // Alocare nod si initializare valoare Element *elem = new Element; elem->valoare = val; // legare nod in lista elem->urmator = cap; // mutarea capului listei cap = elem; }

b) Inserare la sfarsitul listei In acest caz trebuie intai parcursa lista si dupa aceea adaugat elementul si legat de restul listei. De asemenea, trebuie avut in vedere cazul in care lista este vida.
// Inserare element la sfarsitul unei // liste simplu inlantuite void InserareSfarsit(Element* &cap, Date val) {

// Alocare si Element *elem elem->valoare elem->urmator

initializare nod = new Element; = val; = NULL;

// daca avem lista vida if (cap == NULL) // doar modificam capul listei cap = elem; else { // parcurgem lista pana la ultimul nod Element *nod = cap; while (nod->urmator != NULL) nod = nod->urmator; // adaugam elementul nou in lista nod->urmator = elem; } }

c) inserare dupa un element dat


void InserareInterior(Element* &cap, Element* p, Date val) { // Alocare si initializare nod Element *elem = new Element; elem->valoare = val; elem->urmator = NULL; // lista vida if (cap == NULL) { cap = elem; return; } // inserare la inceputul listei if (cap == p) { elem->urmator = cap; cap = elem; return; } // inserare in interior elem->urmator = p->urmator; p->urmator = elem; }

Cautare element
Cautarea unui element dintr-o lista presupune parcurgerea listei pentru identificarea nodului in functie de un criteriu. Cele mai uzuale criterii sunt cele legate de pozitia in cadrul listei si de informatiile utile continute de nod. Rezultatul operatiei este adresa primului element gasit sau NULL. a) Cautarea dupa pozitie

Se avanseaza pointerul cu numarul de pozitii specificat:


// Cautare element dupa pozitie Element* CautarePozitie(Element* cap, int pozitie) { int i = 0; // pozitia curenta // parcurge lista pana la // pozitia ceruta sau pana la // sfarsitul listei while (cap != NULL && i < pozitie) { cap = cap->urmator; i++; } // daca lista contine elementul if (i == pozitie) return cap; else return NULL; }

b) Cautarea dupa valoare Se parcurge lista pana la epuizarea acesteia sau identificarea elementului:
// Cautare element dupa valoare Element* CautareValoare(Element* cap, Date val) { // parcurge lista pana la gasirea // elementului sau epuizarea listei while (cap != NULL && cap->valoare != val) cap = cap->urmator; return cap; }

Stergere element
a) Stergerea unui element din interiorul listei (diferit de capul listei) In acest caz avem nevoie de adresa predecesorului elementului de sters. Se modifica legaturile in sensul scurtcircuitarii elementului de sters, dupa care se elibereaza memoria corespunzatoare elementului de sters:
// sterge un element din interiorul listei // primind ca parametru adresa predecesorului void StergereElementInterior(Element* predecesor) { // salvam referinta la elementul de sters Element* deSters = predecesor->urmator; // scurcircuitam elementul predecesor->urmator = predecesor->urmator->urmator; // si il stergem delete deSters;

b) Stergerea unui element de pe o anumita pozitie Daca elementul este primul din lista, atunci se modifica capul listei, altfel se cauta elemental si se sterge folosind functia definite anterior:
void StergerePozitie(Element* &cap, int pozitie) { // daca lista e vida nu facem nimic if (cap == NULL) return; // daca este primul element, atunci // il stergem si mutam capul if (pozitie == 0) { Element* deSters = cap; cap = cap->urmator; delete deSters; return; } // daca este in interor, atunci folosim // functia de stergere Element* predecesor = CautarePozitie(cap, pozitie-1); StergereElementInterior(predecesor); }

c) stergerea dupa o valoare Se cauta predecesorul elementului si se foloseste functia de stergere element:
void StergereValoare(Element* &cap, Date val) { // daca lista e vida nu facem nimic if (cap == NULL) return; // daca este primul element, atunci // il stergem si mutam capul if (cap->valoare == val) { Element* deSters = cap; cap = cap->urmator; delete deSters; return; } // cautam predecesorul Element* elem = cap; while (elem->urmator != NULL && elem->urmator->valoare != val) elem = elem->urmator;

// daca a fost gasit, atunci il stergem if (elem->urmator != NULL) StergereElementInterior(elem); }

3. Probleme
Sa se realizeze functiile pentru: 1. Interschimbarea a doua elemente prin modificarea legaturilor. 2. Concatenarea a doua liste simplu inlantuite. 3. Copierea unei liste simplu inlantuite. 4. Stergerea unei liste simplu inlantuite. 5. Sortarea unei liste simplu inlantuita. 6. Gasirea elementului aflat pe pozitia i de la sfarsitul listei. 7. Inversarea elementelor unei liste prin modificarea legaturilor. 8. Stabilirea simetriei unei liste. 9. Conversia unei matrice in matrice rara memorata ca lista simpla.

10. Se considera o lista ce contine elemente care au ca informatie utila: cod produs, cantitate si pret. Scrieti si apelati functia care calculeaza total valoare pentru materialele existente in lista. 11. Enumerati avantajele si dezavantajele listelor simple fata de masive alocate static/dinamic. Dati exemple de cazuri in care este mai eficenta flosirea listelor si cazuri in care este mai eficienta folosirea vectorilor.

Вам также может понравиться

  • LICENTA1
    LICENTA1
    Документ531 страница
    LICENTA1
    Ovidiu Vidi
    Оценок пока нет
  • Atestat
    Atestat
    Документ27 страниц
    Atestat
    Raluka Popescu
    Оценок пока нет
  • Liste Simplu Inlantuite
    Liste Simplu Inlantuite
    Документ6 страниц
    Liste Simplu Inlantuite
    Radu Andrei
    Оценок пока нет
  • Lista Simpla Inlantuita
    Lista Simpla Inlantuita
    Документ3 страницы
    Lista Simpla Inlantuita
    Delia Vlogs
    Оценок пока нет
  • Liste Dublu Inlantuite - Structuri de Date Alocate Dinamic
    Liste Dublu Inlantuite - Structuri de Date Alocate Dinamic
    Документ4 страницы
    Liste Dublu Inlantuite - Structuri de Date Alocate Dinamic
    Gheorghe Manolache
    Оценок пока нет
  • Continutul Practicii Temaclasa Lista Simplu Inlantuita
    Continutul Practicii Temaclasa Lista Simplu Inlantuita
    Документ9 страниц
    Continutul Practicii Temaclasa Lista Simplu Inlantuita
    violetachka
    Оценок пока нет
  • Liste Dublu Inlantuite
    Liste Dublu Inlantuite
    Документ17 страниц
    Liste Dublu Inlantuite
    Pow Paulboy
    Оценок пока нет
  • Laborator 3
    Laborator 3
    Документ10 страниц
    Laborator 3
    Matryko Motya
    Оценок пока нет
  • Asdc 7
    Asdc 7
    Документ31 страница
    Asdc 7
    Dan 421
    Оценок пока нет
  • Stiva Coada
    Stiva Coada
    Документ3 страницы
    Stiva Coada
    Mihaela Cojocaru
    Оценок пока нет
  • IC.03.Tipul Abstract de Date Lista
    IC.03.Tipul Abstract de Date Lista
    Документ22 страницы
    IC.03.Tipul Abstract de Date Lista
    Bogdan Curmei
    Оценок пока нет
  • L12
    L12
    Документ2 страницы
    L12
    Ady Cristina
    Оценок пока нет
  • 2.2.1. Liste Alocate Dinamic - Teorie Si Aplicatii - 1
    2.2.1. Liste Alocate Dinamic - Teorie Si Aplicatii - 1
    Документ5 страниц
    2.2.1. Liste Alocate Dinamic - Teorie Si Aplicatii - 1
    Amar Bumbacea
    Оценок пока нет
  • Intrebari
    Intrebari
    Документ14 страниц
    Intrebari
    bravalys
    Оценок пока нет
  • C4 - Liste - Continuare. Stive. Cozi.
    C4 - Liste - Continuare. Stive. Cozi.
    Документ40 страниц
    C4 - Liste - Continuare. Stive. Cozi.
    Anonymous lfOHpq
    Оценок пока нет
  • Laborator 2-3 SDA Kulev
    Laborator 2-3 SDA Kulev
    Документ18 страниц
    Laborator 2-3 SDA Kulev
    Cucu Eugen
    100% (1)
  • Lista, Stiva, Coada
    Lista, Stiva, Coada
    Документ5 страниц
    Lista, Stiva, Coada
    Alin Ionuț Buţu
    100% (1)
  • Alocarea Dinamica
    Alocarea Dinamica
    Документ25 страниц
    Alocarea Dinamica
    Silvia Maria
    Оценок пока нет
  • Prolog
    Prolog
    Документ1 страница
    Prolog
    lilianamuzica
    Оценок пока нет
  • C8 Tablouri Liste Iteratori PDF
    C8 Tablouri Liste Iteratori PDF
    Документ51 страница
    C8 Tablouri Liste Iteratori PDF
    Maria Hertug
    Оценок пока нет
  • Subiecte Examen1 (Ciurea)
    Subiecte Examen1 (Ciurea)
    Документ54 страницы
    Subiecte Examen1 (Ciurea)
    laurablue96
    Оценок пока нет
  • SDA (Examen)
    SDA (Examen)
    Документ12 страниц
    SDA (Examen)
    Саня Про
    Оценок пока нет
  • PCLP3
    PCLP3
    Документ15 страниц
    PCLP3
    bravalys
    Оценок пока нет
  • Atestat Ciausu
    Atestat Ciausu
    Документ18 страниц
    Atestat Ciausu
    Ionela Oana Ciausu
    Оценок пока нет
  • Algoritmi Si Structuri de Date
    Algoritmi Si Structuri de Date
    Документ5 страниц
    Algoritmi Si Structuri de Date
    IulianNeculaiPricopie
    Оценок пока нет
  • Sda 4
    Sda 4
    Документ4 страницы
    Sda 4
    ThomasMusa
    Оценок пока нет
  • Implementare Stiva
    Implementare Stiva
    Документ8 страниц
    Implementare Stiva
    jores
    Оценок пока нет
  • Structuri Dinamice de Date
    Structuri Dinamice de Date
    Документ2 страницы
    Structuri Dinamice de Date
    Anastasia Gherman
    Оценок пока нет
  • Lab 12structuri Dinamice de Date
    Lab 12structuri Dinamice de Date
    Документ12 страниц
    Lab 12structuri Dinamice de Date
    l3utzu1
    Оценок пока нет
  • Lucrarea de Laborator NR 7
    Lucrarea de Laborator NR 7
    Документ17 страниц
    Lucrarea de Laborator NR 7
    Elena Bejan
    Оценок пока нет
  • SDALab 02
    SDALab 02
    Документ7 страниц
    SDALab 02
    Ioana Turean
    Оценок пока нет
  • Structuri de Date - Lista Liniara C++
    Structuri de Date - Lista Liniara C++
    Документ5 страниц
    Structuri de Date - Lista Liniara C++
    diana
    Оценок пока нет
  • Stive Si Cozi - Moduri de Implementare
    Stive Si Cozi - Moduri de Implementare
    Документ5 страниц
    Stive Si Cozi - Moduri de Implementare
    Cosnita Emilia-Felicia
    Оценок пока нет
  • Planificare Lista
    Planificare Lista
    Документ3 страницы
    Planificare Lista
    Alex Florea
    Оценок пока нет
  • Liste Stive Cozi
    Liste Stive Cozi
    Документ5 страниц
    Liste Stive Cozi
    Catalina Stefan
    Оценок пока нет
  • Liste Stive Cozi
    Liste Stive Cozi
    Документ5 страниц
    Liste Stive Cozi
    Catalina Stefan
    Оценок пока нет
  • Mat Discreta 2,3
    Mat Discreta 2,3
    Документ6 страниц
    Mat Discreta 2,3
    Dorin Graur
    Оценок пока нет
  • STIVA
    STIVA
    Документ2 страницы
    STIVA
    libreinfo
    Оценок пока нет
  • Treap Rezumat P
    Treap Rezumat P
    Документ9 страниц
    Treap Rezumat P
    epaule
    Оценок пока нет
  • Lista Stiva Coada Alocare Statica C++
    Lista Stiva Coada Alocare Statica C++
    Документ25 страниц
    Lista Stiva Coada Alocare Statica C++
    Duma Tudor
    Оценок пока нет
  • Structuri Dinamice
    Structuri Dinamice
    Документ7 страниц
    Structuri Dinamice
    Aricv Mechamed
    100% (1)
  • Python Tutorial 5
    Python Tutorial 5
    Документ7 страниц
    Python Tutorial 5
    Adrian
    Оценок пока нет
  • Curs 5 An
    Curs 5 An
    Документ40 страниц
    Curs 5 An
    Mădălina Hapciu
    Оценок пока нет
  • Lucrarea Practică Nr.2
    Lucrarea Practică Nr.2
    Документ9 страниц
    Lucrarea Practică Nr.2
    Matei Catalin
    Оценок пока нет
  • Teme Laborator
    Teme Laborator
    Документ4 страницы
    Teme Laborator
    Andrei Pleșa
    Оценок пока нет
  • SDALab 03
    SDALab 03
    Документ6 страниц
    SDALab 03
    Stefy Niculicioiu
    Оценок пока нет
  • Liste Python
    Liste Python
    Документ16 страниц
    Liste Python
    preda andrei
    Оценок пока нет
  • Lucrarea-De-Laborator-Nr.-4 SDA-1
    Lucrarea-De-Laborator-Nr.-4 SDA-1
    Документ13 страниц
    Lucrarea-De-Laborator-Nr.-4 SDA-1
    Alexandru
    Оценок пока нет
  • Algoritmi Si Structuri de Date 2 - Info 1 - Laborator 8
    Algoritmi Si Structuri de Date 2 - Info 1 - Laborator 8
    Документ11 страниц
    Algoritmi Si Structuri de Date 2 - Info 1 - Laborator 8
    RoccoSuasito
    Оценок пока нет
  • Rezolvari Probleme Liste 1
    Rezolvari Probleme Liste 1
    Документ10 страниц
    Rezolvari Probleme Liste 1
    marian ciorasteanu
    Оценок пока нет
  • Vectori Informatica
    Vectori Informatica
    Документ9 страниц
    Vectori Informatica
    Andreea Ralu
    Оценок пока нет
  • Listedublu
    Listedublu
    Документ4 страницы
    Listedublu
    George Klein
    Оценок пока нет
  • Algoritmi de Sortare
    Algoritmi de Sortare
    Документ10 страниц
    Algoritmi de Sortare
    Pascaru
    Оценок пока нет
  • Proiect Informatica
    Proiect Informatica
    Документ15 страниц
    Proiect Informatica
    Cosmin Leonard Rotaru
    Оценок пока нет
  • Curs 7
    Curs 7
    Документ39 страниц
    Curs 7
    Patricia Isabell
    Оценок пока нет
  • Laborator 4
    Laborator 4
    Документ15 страниц
    Laborator 4
    Matryko Motya
    Оценок пока нет
  • IC.04.Tipurile Abstracte de Date Stiva Si Coada
    IC.04.Tipurile Abstracte de Date Stiva Si Coada
    Документ18 страниц
    IC.04.Tipurile Abstracte de Date Stiva Si Coada
    Cosma Aurelian
    Оценок пока нет