Sunteți pe pagina 1din 19

Limbaje de Programare

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

Facilitatile oferite in general de orice structura de date sunt:


creerea/distrugerea, cautarea/accesul la anumit element si
adaugarea/stergerea de elemente.

In functie de implementare, se pot furniza si alte facilitati. Spre exemplu,


pentru multimea ordonata de intregi am definit facilitati precum:
intersectia, re-uniunea sau diferenta.
Review

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

Lista simplu inlantuita necirculara

Lista dublu inlantuita necirculara


Reprezentare

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;

Avand reprezentarea unui nod, putem defini tipul de date List cu


ajutorul caruia ne vom referi la o anumita lista intr-un program C:

typedef struct List{


ListNode *head; // Link catre inceputul listei
long size; // Numarul de elemente din lista
}List;
Creere / Distrugere

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;
}

/* Verificarea existentei unui anumit nod */


ListNode* contains(List *list, int data){
return (find(list, data) != NULL);
}
Insertia unui Element

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

2. Setarea legaturi next a noului nod

3. Setarea legaturi next a nodului anterior


Insertia unui Element

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

/* Daca pozitia de insertie nu exista */


if(it == NULL && poz != 1)
return;

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

2. Refacerea legaturilor intre vecini

3. De-alocarea nodului si distrugerea implicita a


legaturii acestuia
Stergerea unui Element

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--;

/*Caz particular: nodul exista si este primul */


if(it == list->head){
list->head = list->head->next;
free(it);
return;
}
Stergerea unui Element

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

typedef struct List{


ListNode *first; // Pointer catre primul nod
ListNode *last; // Pointer catre ultimul nod
}List;
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

Liste #include <stdio.h>


Definire
#include <stdlib.h>
Reprezentare
Creere / Distrugere
Lista Vida si Apartenta ...
Insertia unui Element
Stergerea unui Element
Afisarea Listei
float sum(List *list){
Dubla Inlanturire float s = 0;
Aplicatie ListNode* it = list->head;

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", &nota);
Afisarea Listei insertFront(list, nota);
Dubla Inlanturire }
Aplicatie

medie = sum(list)/n;

destroyList(list);
fclose(file);

return 0;
}

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

  • Smart Cities
    Smart Cities
    Document5 pagini
    Smart Cities
    Camer Aptula
    Încă nu există evaluări
  • Realitate Virtuala in Medicina - Asc
    Realitate Virtuala in Medicina - Asc
    Document5 pagini
    Realitate Virtuala in Medicina - Asc
    Camer Aptula
    Încă nu există evaluări
  • Infrastructura Deschisă Pentru Rezultate (ASC)
    Infrastructura Deschisă Pentru Rezultate (ASC)
    Document6 pagini
    Infrastructura Deschisă Pentru Rezultate (ASC)
    Camer Aptula
    Încă nu există evaluări
  • Realitate Virtuala in Medicina - Asc
    Realitate Virtuala in Medicina - Asc
    Document7 pagini
    Realitate Virtuala in Medicina - Asc
    Camer Aptula
    Încă nu există evaluări
  • Metodologie Acs
    Metodologie Acs
    Document5 pagini
    Metodologie Acs
    Camer Aptula
    Încă nu există evaluări
  • Metodologie Acs
    Metodologie Acs
    Document5 pagini
    Metodologie Acs
    Camer Aptula
    Încă nu există evaluări
  • TEMA Finala ASC
    TEMA Finala ASC
    Document1 pagină
    TEMA Finala ASC
    Camer Aptula
    Încă nu există evaluări
  • Smart City
    Smart City
    Document4 pagini
    Smart City
    Camer Aptula
    Încă nu există evaluări
  • Ia2 L3
    Ia2 L3
    Document18 pagini
    Ia2 L3
    Cristian Mihai
    Încă nu există evaluări
  • IA2 L1 PDF
    IA2 L1 PDF
    Document22 pagini
    IA2 L1 PDF
    Mihai Gatea
    100% (1)
  • ASC - Sectiune2 - L1 - Prez IDE - Ex
    ASC - Sectiune2 - L1 - Prez IDE - Ex
    Document51 pagini
    ASC - Sectiune2 - L1 - Prez IDE - Ex
    Camer Aptula
    Încă nu există evaluări
  • Lab 10
    Lab 10
    Document2 pagini
    Lab 10
    Camer Aptula
    Încă nu există evaluări
  • L2. Functii MATLAB de Interes General. Functii Matematice Uzuale. Reprezentarea Graficelor
    L2. Functii MATLAB de Interes General. Functii Matematice Uzuale. Reprezentarea Graficelor
    Document18 pagini
    L2. Functii MATLAB de Interes General. Functii Matematice Uzuale. Reprezentarea Graficelor
    Camer Aptula
    Încă nu există evaluări
  • Lab 12
    Lab 12
    Document1 pagină
    Lab 12
    Camer Aptula
    Încă nu există evaluări
  • LP Curs12
    LP Curs12
    Document19 pagini
    LP Curs12
    Camer Aptula
    Încă nu există evaluări
  • Lab 12
    Lab 12
    Document1 pagină
    Lab 12
    Camer Aptula
    Încă nu există evaluări
  • LP Curs9
    LP Curs9
    Document32 pagini
    LP Curs9
    Camer Aptula
    Încă nu există evaluări
  • Lab 09
    Lab 09
    Document3 pagini
    Lab 09
    Camer Aptula
    Încă nu există evaluări
  • LP Curs6
    LP Curs6
    Document28 pagini
    LP Curs6
    Camer Aptula
    Încă nu există evaluări
  • LP Curs10
    LP Curs10
    Document15 pagini
    LP Curs10
    Camer Aptula
    Încă nu există evaluări
  • Lab 11
    Lab 11
    Document2 pagini
    Lab 11
    Camer Aptula
    Încă nu există evaluări
  • Lab 10
    Lab 10
    Document2 pagini
    Lab 10
    Camer Aptula
    Încă nu există evaluări
  • LP Curs8 PDF
    LP Curs8 PDF
    Document25 pagini
    LP Curs8 PDF
    Camer Aptula
    Încă nu există evaluări
  • Lab 06
    Lab 06
    Document2 pagini
    Lab 06
    Camer Aptula
    Încă nu există evaluări
  • Lab 04
    Lab 04
    Document2 pagini
    Lab 04
    Camer Aptula
    Încă nu există evaluări
  • Lab 05
    Lab 05
    Document3 pagini
    Lab 05
    Camer Aptula
    Încă nu există evaluări
  • Lab 07
    Lab 07
    Document2 pagini
    Lab 07
    Camer Aptula
    Încă nu există evaluări
  • LP Curs8 PDF
    LP Curs8 PDF
    Document25 pagini
    LP Curs8 PDF
    Camer Aptula
    Încă nu există evaluări
  • LP Curs5 PDF
    LP Curs5 PDF
    Document29 pagini
    LP Curs5 PDF
    Camer Aptula
    Încă nu există evaluări