Documente Academic
Documente Profesional
Documente Cultură
Limbaje de
Programare
Curs 12 - Liste
Inlantuite
Dan Novischi
Review
Liste
Definire
Reprezentare Limbaje de Programare
Creere / Distrugere
Lista Vida si Apartenta
Curs 12 - Liste Inlantuite
Insertia unui Element
Stergerea unui Element
Afisarea Listei
Dubla Inlanturire Dan Novischi
Aplicatie
16 Mai
Sumar
Limbaje de
Programare
Curs 12 - Liste
Inlantuite
Dan Novischi
Review 1 Review
Liste
Definire
Reprezentare
Creere / Distrugere 2 Liste
Lista Vida si Apartenta
Insertia unui Element
Definire
Stergerea unui Element Reprezentare
Afisarea Listei Creere / Distrugere
Dubla Inlanturire
Lista Vida si Apartenta
Aplicatie
Insertia unui Element
Stergerea unui Element
Afisarea Listei
Dubla Inlanturire
Aplicatie
Review
Limbaje de
Programare
Curs 12 - Liste
Inlantuite
Dan Novischi Prin intermediul facilitatilor pentru definirea unor tipuri de date mai
complexe putem modela sau abstractiza diferite concepte/obiecte din
Review lumea reala.
Liste
Definire
Un astfel de concept sunt multimile matematice, care au fost modelate
Reprezentare
Creere / Distrugere
folosind atat facilitatiile de alocare dinamica cat si definirea array-urilor
Lista Vida si Apartenta sau a structurilor.
Insertia unui Element
Stergerea unui Element
Afisarea Listei
Generic ne referim la diverse astfel de abstractizari ca reprezentand
Dubla Inlanturire structuri de date.
Aplicatie
Limbaje de
Programare
Curs 12 - Liste
Inlantuite
Dan Novischi
Review Citirea sau scrierea datelor intr-un program se poate realiza utilizand
Liste
fisiere, nu numai tastura sau ecranul (consola).
Definire
Reprezentare Biblioteca stdio.h ne pune la dispozitie o serie de functii pentru
Creere / Distrugere
manipularea fisierelor care actioneaza asupra tipului de date FILE.
Lista Vida si Apartenta
Insertia unui Element
Stergerea unui Element Astfel, putem deschide/inchide, citi, scrie si/sau adauga informatiile
Afisarea Listei
dorite in fisiere.
Dubla Inlanturire
Aplicatie
Fisierele se impart in doua categorii si anume: text sau binare. Astfel,
operatiile asupra fisierelor care contin text sunt analoage celor lucrului cu
tastatura si/sau ecranul, in timp ce informatia in fisiere binare se
realizeaza prin scrierea si/sau citirea de valori binare ale reprezentarilor
pentru diverse tipuri de date.
Definire
Limbaje de
Programare Listele inlantuite sunt structuri de date (colectii dinamice de date) ale
Curs 12 - Liste
Inlantuite caror elemente sunt reprezentate de noduri.
Dan Novischi Un nod are in componenta datele de interes si cel putin o legatura la un
nod vecin.
Review
Liste
Aranjamentul nodurilor in cadrul unei liste este linear, similar array-urilor
Definire
(utilizate pentru reprezentarea unei multimi in Cursul 11). Dar spre
Reprezentare deosebire de acestea, accesul la date se realizeaza prin parcurgerea
Creere / Distrugere
legaturilor dintre noduri, NU prin indexarea array-urilor.
Lista Vida si Apartenta
Insertia unui Element In functie structura interna a legaturilor listele pot fi: simplu sau dublu
Stergerea unui Element inlantuite si/sau circulare sau necirculare.
Afisarea Listei
Dubla Inlanturire
Aplicatie
Limbaje de
Programare
Curs 12 - Liste In vederea exemplificarii reprezentarii unei liste vom realiza o lista simplu
Inlantuite
inlatuita necirculara. Acesta va stoca elemente intregi in nodurile sale
Dan Novischi
(analog desenului anterior).
Review
Pentru a defini lista propriu-zisa avem nevoie mai intai de definitia unui
Liste nod al acesteia (deci de definitia la ce inseamna elementele componente
Definire
Reprezentare
ale listei).
Creere / Distrugere
Lista Vida si Apartenta
Astfel, conform desenului precedent un nod contine datele utile,
Insertia unui Element reprezentate in acest caz de intregi, si o legatura catre nodul urmator:
Stergerea unui Element
Afisarea Listei typedef struct ListNode{
Dubla Inlanturire
int data; // Datele continute de un nod
Aplicatie
struct ListNode *next; // Link catre urmatorul element
}ListNode;
Limbaje de Similar multimiilor din Cursul 11, avem nevoie de functii pentru creerea si
Programare
Curs 12 - Liste distrugerea unei liste.
Inlantuite
Astfel, creerea unei liste presupune alocarea unei structuri List si setarea
Dan Novischi
aferata a campurilor acesteia:
Review
List* createList(void){
Liste List* newList = (List*) malloc(sizeof(List));
Definire
newList->head = NULL;
Reprezentare
Creere / Distrugere
newList->size = 0;
Lista Vida si Apartenta }
Insertia unui Element
Stergerea unui Element La distrugerea unei liste trebuie avut in vedere faptul ca lista poate sa
Afisarea Listei contina noduri, altfel spus, este posibil ca lista sa nu fie goala. Prin
Dubla Inlanturire
urmare va trebui sa de-alocam mai intai toate nodurile din cadrul listei si
Aplicatie
apoi structura in sine:
void destroyList(List *list){
ListNode* aux;
ListNode *it = list->head;
while(it != NULL){
aux = it;
it = it->next;
free(aux);
}
free(list);
}
Lista Vida si Apartenta
Limbaje de
Programare
Curs 12 - Liste Similar multimilor, putem creea relatii pentru a verifica daca o lista este
Inlantuite vida (nu contine nici un element):
Dan Novischi
int isEmpty(List *list){
Review
return (list->head == NULL);
Liste }
Definire
Reprezentare
Creere / Distrugere
Mai mult, putem creea functii pentru cautarea unui nod care stocheaza
Lista Vida si Apartenta anumite date si/sau testa apartenta acestuia la o anumita lista:
Insertia unui Element
Stergerea unui Element /* Gasirea unui anumit nod (daca exista) */
Afisarea Listei
Dubla Inlanturire
ListNode* find(List *list, int data){
Aplicatie ListNode *it = list->head;
while(it != NULL && it->data != data){
it = it->next;
}
return it;
}
Limbaje de
Programare
Insertia datelor intr-o lista se realizeaza prin creerea unui nod care
Curs 12 - Liste stocheaza datele si introducerea acestuia dupa caz: intr-o anumita
Inlantuite
pozitie, la inceput sau la sfarsitul acesteia.
Dan Novischi
Pentru exemplificare vom insera intr-o anumita pozitie (daca aceasta
Review exista). Acest proces poate fi vizualizat astfel:
Liste
Definire
Reprezentare
Creere / Distrugere
Lista Vida si Apartenta
Insertia unui Element 1. Gasirea locului de insertie si creerea unui nou
Stergerea unui Element nod
Afisarea Listei
Dubla Inlanturire
Aplicatie
Limbaje de
Programare
Curs 12 - Liste
Inlantuite
Astfel, functia de inserare intr-o anumita pozitie poate fi implementata
dupa cum urmeaza:
Dan Novischi
void insertNth(List *list, long poz, int data){
Review ListNode *prev = NULL;
Liste ListNode *it = list->head;
Definire
Reprezentare
Creere / Distrugere
/* Gasirea punctului de insertie */
Lista Vida si Apartenta while(it != NULL && poz-- > 1){
Insertia unui Element prev = it;
Stergerea unui Element
it = it->next;
Afisarea Listei
Dubla Inlanturire
}
Aplicatie
list->size++;
/* Crearea nodului */
ListNode* newNode = (ListNode*) malloc(sizeof(ListNode));
newNode->data = data;
Insertia unui Element
Limbaje de
Programare
Curs 12 - Liste /* Caz particular: lista este goala si pozitia este 1 */
Inlantuite if(list->head == NULL && poz == 1){
Dan Novischi newNode->next = list->head;
list->head = newNode;
Review
return;
Liste
}
Definire
Reprezentare
Creere / Distrugere /* Setarea legaturii nounlui nod */
Lista Vida si Apartenta
newNode->next = prev->next;
Insertia unui Element
Stergerea unui Element
Afisarea Listei /* Setarea legaturii nodului anterior */
Dubla Inlanturire prev->next = newNode;
Aplicatie
}
Insertia unui Element
Limbaje de
Programare
Curs 12 - Liste Similar, am putea creea functia de insetie la inceput. In acest caz, ne
Inlantuite putem folosi direct de legatura head (care indica inceputul listei) fara a fi
Dan Novischi necesara o parcurgere:
Review void insertFront(List *list, long poz, int data){
Liste /* Crearea nodului */
Definire ListNode* newNode = (ListNode*) malloc(sizeof(ListNode));
Reprezentare
newNode->data = data;
Creere / Distrugere
Lista Vida si Apartenta
Insertia unui Element /* Setarea legaturii nounlui nod */
Stergerea unui Element newNode->next = list->head;
Afisarea Listei
Dubla Inlanturire
Aplicatie
/* Setarea legaturii nodului anterior */
list->head = newNode;
}
Stergerea unui Element
Limbaje de
Programare
Curs 12 - Liste Stergerea unui nod presupune gasirea lui, modificarea aferenta a
Inlantuite legaturilor nodurilor vecine si de-alocarea acestuia. Procesul poate fi
Dan Novischi vizualizat astfel:
Review
Liste
Definire
Reprezentare 1. Gasirea nodului de sters (daca exista)
Creere / Distrugere
Lista Vida si Apartenta
Insertia unui Element
Stergerea unui Element
Afisarea Listei
Dubla Inlanturire
Aplicatie
Limbaje de
Programare
Curs 12 - Liste Astfel functia de stergere a unui anumit nod va poate fi implementata
Inlantuite dupa cum urmeaza:
Dan Novischi
void delete(List* list, int data){
Review ListNode *prev = NULL;
Liste
ListNode *it = list->head;
Definire
Reprezentare /* Gasirea nodului de sters */
Creere / Distrugere
while(it != NULL && it->data != data){
Lista Vida si Apartenta
Insertia unui Element
prev = it;
Stergerea unui Element it = it->next;
Afisarea Listei }
Dubla Inlanturire
Aplicatie
/* Daca nodul nu exista */
if(it == NULL) return;
list->size--;
Limbaje de
Programare
Curs 12 - Liste /* Refacerea legaturilor intre vecini */
Inlantuite prev->next = it->next;
Dan Novischi
/* De-alocarea nodului */
Review
free(it);
Liste
}
Definire
Reprezentare
Creere / Distrugere
Lista Vida si Apartenta
Insertia unui Element
Stergerea unui Element
Afisarea Listei
Dubla Inlanturire
Aplicatie
Afisarea Listei
Limbaje de
Programare
Curs 12 - Liste Pentru afisarea unei liste de intregi putem organiza parcurgerea si afisarea
Inlantuite succesiva a valorilor din noduri intr-o functie astfel:
Dan Novischi
void printList(List *list){
Review ListNode *it = list->head;
Liste
printf("\n[");
Definire
while(it != NULL){
Reprezentare printf("%d ", it->data);
Creere / Distrugere
it = it->next;
Lista Vida si Apartenta
Insertia unui Element
}
Stergerea unui Element printf("]\n");
Afisarea Listei }
Dubla Inlanturire
Aplicatie
Dubla Inlanturire
Limbaje de
Programare
Curs 12 - Liste Similar listelor simplu inlantuite, putem utiliza constructiile limbajului C
Inlantuite pentru a defini liste lista duble inlatuite si relatiile asociate acestora
Dan Novischi urmarind desenul de la inceputul cursului.
Review Astfel, pentru definirea listei dublu inlatuite se va porni tot prin definirea
Liste
unui nod al listei si ulterior a tipului de date. Spre exemplu, pentru o lista
Definire dublu inlatuita putem scrie urmatoarele definitii:
Reprezentare
Creere / Distrugere typedef struct ListNode{
Lista Vida si Apartenta
int data; // datele stocate in nod
Insertia unui Element
Stergerea unui Element
struct ListNode *next; // Pointer la nodul urmator
Afisarea Listei strict ListNode *prev; // Pointer la nodul anterior
Dubla Inlanturire }ListNode;
Aplicatie
Limbaje de
Programare
Curs 12 - Liste Se da un fisier text care contine notele obtinute la o anumita materie de
Inlantuite studentii unei facultati. In acest fisier, pe prima linie se afla un numar de
Dan Novischi intrari, iar pe liniile succesive notele. Cititi fisierul stocand notele intr-o
lista simplu inlantuita. Utilizati lista pentru a calcula media notelor.
Review
while(it != NULL){
s += it->data;
it = it->next;
}
return s;
}
Aplicatie
Limbaje de
Programare
Curs 12 - Liste int main(void){
Inlantuite int n = 0, i;
Dan Novischi float nota, medie;
Review
List *list = createList();
Liste
FILE *file = fopen("input.txt", "r");
Definire
Reprezentare
Creere / Distrugere fscanf(file, "%d", &n);
Lista Vida si Apartenta
for(i = 0; i < n; i++){
Insertia unui Element
Stergerea unui Element
fscanf(file, "%f", ¬a);
Afisarea Listei insertFront(list, nota);
Dubla Inlanturire }
Aplicatie
medie = sum(list)/n;
destroyList(list);
fclose(file);
return 0;
}