Differences

This shows you the differences between two versions of the page.

Link to this comparison view

sd-ca:laboratoare:lab-02 [2022/03/09 23:52]
iulia.corici [Laborator 2 - Liste înlănțuite]
sd-ca:laboratoare:lab-02 [2025/03/18 16:19] (current)
andrei.pirlea [LinkedList]
Line 3: Line 3:
 Responsabili Responsabili
  
-  * [[mailto:becheanudaniela04@gmail.com|Daniela Becheanu]] +  * [[mailto:andreipirlea03@gmail.com|Andrei Pîrlea]] 
-  * [[mailto:coriciiulia76@gmail.com|Iulia Corici]]+  * [[mailto:stef.dascalu@gmail.com|Ștefan-Teodor Dascălu]]
  
  
Line 24: Line 24:
 ===== LinkedList ===== ===== LinkedList =====
  
-O listă înlănțuită (LinkedList) reprezintă o structură de date liniară și omogenă. Spre deosebire de vector, lista înlănțuită nu își are elementele într-o zonă contiguă de memorie ci fiecare element (nod al listei) va conține pe langă informația utilă și legătură către nodul următor (listă simplu înlănțuită),​ sau legături către nodurile vecine (listă dublu înlănțuită). Alocând dinamic nodurile pe măsură ce este nevoie de ele, practic se pot obține liste de lungime limitată doar de cantitatea de memorie accesibilă programului.+O listă înlănțuită (LinkedList) reprezintă o structură de date liniară și omogenă. Spre deosebire de vector, lista înlănțuită nu își are elementele într-o zonă contiguă de memorieci fiecare element (nod al listei) va conține pe langă informația utilă și legătură către nodul următor (listă simplu înlănțuită),​ sau legături către nodurile vecine (listă dublu înlănțuită). Alocând dinamic nodurile pe măsură ce este nevoie de ele, practic se pot obține liste de lungime limitată doar de cantitatea de memorie accesibilă programului.
  
 <note important>​ <note important>​
Line 48: Line 48:
  
 Asupra unei liste înlănțuite ar trebui să putem executa urmatoarele operații: Asupra unei liste înlănțuite ar trebui să putem executa urmatoarele operații:
-  * ''<​nowiki>​void add_nth_node(struct LinkedList* list, int n, void* new_data);</​nowiki>''​ adaugă pe poziția n în listă elementul ''​new_data''​. Adăugarea presupune modificarea câmpului ''​next''​ al nodului în urma căruia se va adăuga noul nod, cât și a câmpului ''​next''​ al nodului adăugat pentru a face legăturile necesare ca lista sa funcționeze corect. Dacă nodul este adăugat pe prima poziție, atunci el va deveni ''​head''​-ul listei, iar dacă este adăugat pe ultima poziție, el va deveni ''​tail''​-ul listei. //​Complexitate:​ ''​O(n)''​. Dacă se adaugă elementul în capul sau coada listei, se obține o complexitate mai buna: ''​O(1)''​.//​+  * ''<​nowiki>​void add_nth_node(struct LinkedList* list, int n, void* new_data);</​nowiki>''​ adaugă pe poziția n în listă elementul ''​new_data''​. Adăugarea presupune modificarea câmpului ''​next''​ al nodului în urma căruia se va adăuga noul nod, cât și a câmpului ''​next''​ al nodului adăugat pentru a face legăturile necesare ca lista sa funcționeze corect. Dacă nodul este adăugat pe prima poziție, atunci el va deveni ''​head''​-ul listei, iar dacă este adăugat pe ultima poziție, el va deveni ''​tail''​-ul listei. //​Complexitate:​ ''​O(n)''​. Dacă se adaugă elementul în capul sau coada listei, se obține o complexitate mai bună: ''​O(1)''​.//​
  
-  * ''<​nowiki>​struct Node* remove_nth_node(struct LinkedList* list, int n);</​nowiki>''​ șterge și întoarce al ''​n''​-lea element al listei. Operația presupune modificarea listei astfel încât între nodurile vecine celui eliminat să se refacă legaturile pentru a permite listei ​sa funcționeze în continuare. Daca nu există un nod următor, ''​head''​ va deveni NULL, iar lista va fi goală. Dacă nodul eliminat era ''​head-ul''​ listei, atunci succesorul său îi va lua locul. Analog pentru ultimul nod, însă în această situație, nodul precedent devine ''​tail''​. //​Complexitate:​ ''​O(n)''​. Dacă se șterge primul nod, se obține o complexitate mai buna: ''​O(1)''​. Aceeași complexitate se obține și dacă lista este dublu înlănțuită și se șterge ultimul nod.//+  * ''<​nowiki>​struct Node* remove_nth_node(struct LinkedList* list, int n);</​nowiki>''​ șterge și întoarce al ''​n''​-lea element al listei. Operația presupune modificarea listei astfel încât între nodurile vecine celui eliminat să se refacă legaturile pentru a permite listei ​să funcționeze în continuare. Daca nu există un nod următor, ''​head''​ va deveni NULL, iar lista va fi goală. Dacă nodul eliminat era ''​head-ul''​ listei, atunci succesorul său îi va lua locul. Analog pentru ultimul nod, însă în această situație, nodul precedent devine ''​tail''​. **Atentie!** Funcția doar returnează nodul eliminat din listă, deci rămâne de datoria voastră să eliberați memoria ocupată de nodul obținut în urma apelului funcției. //​Complexitate:​ ''​O(n)''​. Dacă se șterge primul nod, se obține o complexitate mai bună: ''​O(1)''​. Aceeași complexitate se obține și dacă lista este dublu înlănțuită și se șterge ultimul nod.//
  
-  * ''<​nowiki>​int get_size(struct LinkedList* list);</​nowiki>''​ întoarce numărul curent de elemente stocate în listă. //​Complexitate:​ ''​O(1)''//​+  * ''<​nowiki>​int get_size(struct LinkedList* list);</​nowiki>'' ​-  ​întoarce numărul curent de elemente stocate în listă. ​ 
 + 
 +//​Complexitate:​ ''​O(1)'' ​- DACA LISTA CONTINE CAMPUL SIZE IN STRUCTURA//​ 
 + 
 +//​Complexitate:​ ''​O(n)''​ - trebuie parcursa toata lista pentru a afla numarul de noduri ​//
  
 <note important>​ <note important>​
Line 98: Line 102:
 {{sd-ca:​playground:​lista_circ_simplu.png?​direct&​ |}} {{sd-ca:​playground:​lista_circ_simplu.png?​direct&​ |}}
  
-===== Schelet ===== 
  
-{{:​sd-ca:​laboratoare:​lab2_skel.zip|}} 
  
 ===== Exerciții ===== ===== Exerciții =====
  
-<​note ​important+<​note>​ 
-Pentru a rezolva laboratorul folosind Github Classroom, urmați [[sd-ca:laboratoare/tutorial-github-classroom#​adaugarea_solutiei_unui_laborator|acești pași]]. Asigurați-vă ca ați creat branchul pentru acest laborator **din branchul ''​master''​** al repository-ului vostru.+Trebuie să vă creați cont de [[https://​code.devmind.ro/ ​Devmind]], dacă nu v-ați creat deja, pe care îl veți folosi la SD pe toată durata semestrului.
 </​note>​ </​note>​
 +
 +{{:​sd-ca:​laboratoare:​lab_2:​skel_lab2-2025.zip|Scheletul de laborator}}
 +
 +Enunțul problemei îl găsiți pe Devmind, unde veți și încărca soluțiile voastre.
  
 ===== Interviu ===== ===== Interviu =====
Line 112: Line 118:
 Această secțiune nu este punctată și încearcă să vă facă o oarecare idee a tipurilor de întrebări pe care le puteți întâlni la un job interview (internship,​ part-time, full-time, etc.) din materia prezentată în cadrul laboratorului. Această secțiune nu este punctată și încearcă să vă facă o oarecare idee a tipurilor de întrebări pe care le puteți întâlni la un job interview (internship,​ part-time, full-time, etc.) din materia prezentată în cadrul laboratorului.
  
-  ​- Implementați o funcție de ștergere a duplicatelor dintr-o listă simplu înlănțuită sortată. +  - Implementați o funcție de detectare a unui ciclu într-o listă simplu înlănțuită:​[[https://​leetcode.com/​problems/​linked-list-cycle/​ |Linked List Cycle]]
-  ​- Implementați o funcție de detectare ​(+ înlăturare) ​a unui ciclu într-o listă simplu înlănțuită. +  - Eliminarea ​celui de-al k-lea nod de la sfârșit spre început într-o listă simplu înlănțuită:​[[https://​leetcode.com/​problems/​remove-nth-node-from-end-of-list|Remove Nth Node From End of List]]
-  - Găsirea ​celui de-al k-lea nod de la sfârșit spre început într-o listă simplu înlănțuită. +  - Inversarea unei liste simple înlățuite:​ [[https://​leetcode.com/​problems/​reverse-linked-list| Reverse Linked List]].
 Și multe altele... Și multe altele...
  
sd-ca/laboratoare/lab-02.1646862751.txt.gz · Last modified: 2022/03/09 23:52 by iulia.corici
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0