Sunteți pe pagina 1din 31

Algoritmi, Structuri de date şi

Complexitate

Tema: Liste simplu înlănţuite. Liste înlănţuite


ciclic. Liste dublu înlănţuite. Liste dublu
înlănţuite ciclic.

Ludmila NOVAC
Dr., conf. univ.
Dep. Informatică
Unităţi de conţinut
Structuri dinamice de date
1. Structuri dinamice de date (arbori binari, liste, stive, cozi).
Arbori binari. Crearea arborilor. Accesul la elementele unui arbore.
Parcurgerea arborilor binari. Arbori binari plini. Arbori binari de căutare.
Exemplu de clasă generică de reprezentare a arborilor binari de căutare.
2. Liste simplu înlănţuite. Liste înlănţuite ciclic. Liste dublu înlănţuite.
Liste dublu înlănţuite ciclic. Exemple de clase generice de reprezentare
a listelor.
3. Stive. Stive prin buffer de lungime fixă. Stive prin liste simplu
înlănţuite. Exemple de clase generice de reprezentare a stivelor.
Realizarea algoritmului de sortare rapidă prin utilizarea stivei
4. Cozi. Cozi prin buffer ciclic. Cozi prin liste simplu înlănţuite.
Exemple de clase generice de reprezentare a cozilor.
Planul Lecţiei
• Liste simplu înlănţuite. Liste înlănţuite ciclic.
• Operaţii asupra elementelor listelor simplu înlănţuite şi înlănţuite ciclic
(Crearea, Parcurgerea, Căutarea, Inserarea, ştergerea elementelor).

• Liste dublu înlănţuite. Liste dublu înlănţuite ciclic.


• Operaţii asupra elementelor listelor simplu înlănţuite şi înlănţuite ciclic
(Crearea, Parcurgerea, Căutarea, Inserarea, ştergerea elementelor).

• Reprezentarea în memorie a Listelor. (Alocarea dinamică a memoriei)

• Stive. Stive prin buffer de lungime fixă. Stive prin liste simplu înlănţuite.
Realizarea algoritmului de sortare rapidă prin utilizarea stivei
• Cozi. Cozi prin buffer ciclic. Cozi prin liste simplu înlănţuite.

• Exemple de Liste, stive, cozi. Aplicaţii.


• Liste simplu înlănţuite. Liste înlănţuite ciclic.
• Operaţii asupra elementelor listelor simplu
înlănţuite şi înlănţuite ciclic:
– Crearea listei,
– Parcurgerea listei,
– Căutarea elementelor,
– Inserarea elementelor,
– ştergerea elementelor.
Listă. Noţiuni de bază.
• Listă (engl. list, finite sequence) este o SDD omogenă compusă
dintr-un set de elemente de una şi aceiaşi structură compusă din
două componente:
• - prima componentă conţine informaţia atribuită acestui element.
Conţinutul acestei componente depinde de tipul utilizat pentru
componentele structurii listei.
- a doua componentă asigură legăturile între elementele listei.
De obicei acesta este un pointer care asigură legătura cu celelalte
componente ale listei.
• Spre deosebire de masive, listele nu sunt alocate ca blocuri
omogene de memorie, ci ca elemente separate de memorie.
Fiecare nod al listei conţine, în afara de informaţia utilă, adresa
următorului element. Această organizare permite numai acces
secvenţial la elementele listei.
Listă simplu înlănţuită,
Listă simplu înlănţuită circulara

• La lista simplu înlănţuită (engl. chained list, linked list) compartimentul doi
reprezintă un pointer la următorul element al listei. La ultimul element acest
pointer are valoarea NULL.

• În cazul listei înlănţuite circular (engl. circular linked list, ring list), pointerul din
componenta a doua al ultimului element conţine adresa primului element din
listă.
Operaţii cu liste:
• crearea listei;
• căutarea în listă;
• adăugarea/ inserarea unui element nou (la început, la
sfârşit, în poziţia indicată, după elementul indicat,
înaintea elementului indicat, în locul elementului indicat);
• excluderea unui element din listă (de la început, de la
sfârşit, din poziţia indicată, un element specificat);
• concatenarea listelor.
Structura listei simplu înlănţuite
• Pentru a asigura un grad mai mare de generalitate listei a fost creat un alias
pentru datele utile (în cazul nostru un întreg):

În cazul în care se doreşte memorarea unui alt tip de date, trebuie schimbată
doar declaraţia aliasului Date. Pentru memorarea listei se foloseşte o structură
autoreferită. Această structură va avea forma:

În cazul în care elementul este ultimul din listă, pointerul urmator va avea valoarea
NULL. Declararea listei se face sub forma:
Parcurgerea şi afişarea listei simplu înlănţuite

Lista este parcursă pornind de la pointerul spre primul element şi avansând


folosind pointerii din structură pană la sfârşitul listei (pointer NULL).
Adăugarea / inserarea unui element nou
Inserarea unui element se poate face la începutul sau la sfârşitul
listei.
a) Inserare la începutul listei
Acesta este cazul cel mai simplu: trebuie doar alocat elementul, legat
de primul element din lista şi repoziţionarea capului listei.
b) Inserare la sfârşitul listei.
În acest caz trebuie întâi parcursă lista şi după aceea adăugat
elementul şi legat de restul listei. De asemenea, trebuie avut în
vedere cazul în care lista este vida.
c) inserare după un element dat.
Inserarea unui element la începutul listei
Inserarea unui element la sfârşitul listei
Excluderea / ştergerea
unui element din listă
a) Ştergerea unui element din interiorul listei (diferit de capul listei).
În acest caz avem nevoie de adresa predecesorului elementului de şters.
Se modifică legăturile în sensul scurtcircuitării elementului de şters, după
care se eliberează memoria corespunzătoare elementului de şters:
b) Ştergerea unui element de pe o anumită poziţie:
Dacă elementul este primul din listă, atunci se modifică capul listei,
altfel se caută elementul şi se şterge folosind funcţia definite anterior:
c) Ştergerea după o valoare :
Se caută predecesorul elementului şi se foloseşte funcţia de
ştergere a elementului:
• Liste dublu înlănţuite.
• Liste dublu înlănţuite ciclic.
• Operaţii asupra elementelor listelor dublu
înlănţuite şi dublu înlănţuite ciclic:
– Crearea listei,
– Parcurgerea listei,
– Căutarea elementelor,
– Inserarea elementelor,
– ştergerea elementelor.
Listă dublu înlănţuită
La listele dublu înlănţuite compartimentul doi conţine doi pointeri,
primul din care indică la următorul element al listei (are valoarea NULL
la ultimul element), iar al doilea indică legătura către elementul
precedent al listei (are valoarea NULL la primul element).
Liste dublu înlănţuite
• Listele dublu înlănţuite sunt structuri de date dinamice omogene. Ele au
aceleaşi caracteristici de bază ca şi listele simplu înlănţuite. Diferenţa faţă
de acestea constă în faptul că, pentru fiecare nod, se reţine şi adresa
elementului anterior, ceea ce permite traversarea listei în ambele direcţii.
Lista dublu înlănţuită poate fi reprezentată grafic astfel:
Listă dublu înlănţuită ciclic

La listele dublu înlănţuite ciclic componenta a doua tot conţine doi


pointeri. Spre deosebire de tipul precedent primul din aceşti doi
pointeri al ultimului element conţine adresa primului element al listei,
iar al doilea pointer al primul element conţine adresa ultimului element
al listei.
Structura listei dublu înlănţuite
Structura folosită este similară cu cea de la
liste simple. Pentru a asigura un grad mai
mare de generalitate listei a fost creat un alias
pentru datele utile (în cazul nostru un întreg):

În cazul În care se doreşte memorarea unui alt tip de date, trebuie schimbată doar
declaraţia aliasului Date. Pentru memorarea listei se foloseşte o structură
autoreferită. Acesta structură va avea forma:

În cazul in care elementul este


ultimul din listă, pointerul
urmator va avea valoarea
NULL. Pentru primul element,
pointerul anterior va avea
valoarea NULL.
Declararea listei se face sub
forma:
În cazul in care se doreşte crearea unei liste circulare,
pointerul urmator al ultimului element va referi primul
element al listei, iar pointerul anterior al primului element
va referi ultimul element.
Inserarea unui element în lista dublu înlănţuită

15

Inserarea unui element în lista dublu înlănţuită poate fi făcută:


a) la începutul listei,
b) la sfârşitul listei,
c) după un element dat.
Excluderea / ştergerea unui element
din lista dublu înlănţuită

Excluderea unui element din lista dublu înlănţuită poate fi făcută:


a) de la începutul listei,
b) de la sfârşitul listei,
c) un element indicat.
Inserarea unui element
Inserarea unui element se poate face la începutul sau la sfârşitul listei.
• a) Inserare la începutul listei: Acesta este cazul cel mai simplu: trebuie doar
alocat elementul, legat de primul element din listă şi repoziţionarea capului
listei:
b) Inserare la sfârşitul listei:
În acest caz trebuie întâi parcursă lista şi după aceea de adăugat
elementul şi legat de restul listei. De asemenea, trebuie avut în vedere

cazul în care lista este vidă.


c) inserare după un element dat:
Ştergerea element din lista dublu înlănţuită
a) Ştergerea unui element din interiorul listei (diferit de capul listei)
b) Ştergerea unui element de pe o anumită poziţie :
Daca elementul este primul din lista, atunci se modifica capul listei,

altfel se caută elementul şi se şterge folosind funcţia definită anterior:


c) Ştergerea elementului după o valoare:

Se caută elementul şi se foloseşte funcţia de ştergere a elementului:


Avantaje / dezavantaje de utilizare a listelor
Avantaje
• Eficacitatea adăugarea şi eliminarea elementelor (în timp constant),
• Mărimea este limitată doar de volumul de memorie a calculatorului şi de numărul de
pointeri,
• Adăugarea şi eliminarea dinamică a elementelor.
Dezavantaje
Dezavantajele listelor înlănţuite provin din proprietatea principală - acces secvenţial la
date:
• Dificultatea accesului direct la un element, şi anume determinarea unei adrese fizice
prin indexul său (număr de ordine) din listă
• Utilizarea memoriei suplimentare pentru câmpurile pointerului (indicii pentru
elementul următor şi precedent), (pentru tablouri, de exemplu nu sunt necesari
pointeri),
• Unele operaţii cu liste sunt mai lente decât cu tablouri, deoarece un element arbitrar
al listei poate fi accesat numai după parcurgerea tuturor elementelor precedente,
• elementele vecine ale unei liste pot fi distribuite în memorie non-local, ceea ce va
reduce eficienţa de prelucrare a datelor în memoria cache de către procesor,
• Asupra listelor înlănţuite este mult mai dificil, în comparaţie cu tablourile, de efectuat
operaţii vectoriale paralele, (deşi este posibil să se efectueze), spre ex. calcularea
sumei: cheltuielile generale pentru alegerea elementelor reduc eficienţa de
paralelizare.

https://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA
Liste simplu înlănţuite vs. tablouri dinamice
Timpul de execuţie a operaţiilor

https://en.wikipedia.org/wiki/Linked_list
Condiţiile pentru lucrarea de laborator №3 la ASDC
„Structuri dinamice de date”

S-ar putea să vă placă și