Differences

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

Link to this comparison view

sd-ca:laboratoare:lab-03 [2024/03/16 23:22]
melih.riza [Exerciții]
sd-ca:laboratoare:lab-03 [2025/03/18 16:23] (current)
andrei.pirlea [Exerciții]
Line 3: Line 3:
 Responsabili Responsabili
  
-  * [[mailto:melih.riza03@gmail.com|Melih Riza]] +  * [[mailto:dragos.o.dragan@gmail.com|Dragos Dragan]] 
-  * [[mailto:popaiarina13@gmail.com|Iarina-Ioana Popa]]+  * [[mailto:marina@oprea.eu|Marina Oprea]]
  
  
Line 15: Line 15:
 ===== LinkedList (conținut din laboratorul precedent) ===== ===== LinkedList (conținut din laboratorul precedent) =====
  
-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 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.
  
 <note important>​ <note important>​
Line 40: Line 40:
  
 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: ​
  
-  * ''<​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.//+1modificarea câmpului ​''​next''​ al nodului în urma căruia se va adăuga noul nod
  
-  ​* ''<​nowiki>​int get_size(struct LinkedList* list);</​nowiki>''​ întoarce numărul curent de elemente stocate în listă. //​Complexitate:​ ''​O(1)''//​+2) campul ''​next''​ al nodului adăugat pentru a face legăturile necesare ca lista sa funcționeze corect.  
 + 
 +3) Dacă nodul este adăugat pe prima poziție, atunci el va deveni ''​head''​-ul listei 
 + 
 +4) 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>​struct Node* remove_nth_node(struct LinkedList* list, int n);</​nowiki>''​ - șterge și întoarce al ''​n''​-lea element al listei.  
 + 
 +Operația presupune:​ 
 + 
 +1) modificarea listei astfel încât între nodurile vecine celui eliminat să se refacă legaturile pentru a permite listei sa funcționeze în continuare 
 + 
 +2) Daca nu există un nod următor, ''​head''​ va deveni NULL, iar lista va fi goală.  
 + 
 +3) 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>​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 60: Line 85:
 === Listă liniară simplu înlănțuită === === Listă liniară simplu înlănțuită ===
  
-Prezentată în laboratorul precedent.+{{:​sd-ca:​playground:​nod_lista_simplu_inlantuita.png?​direct|}}
  
 === Listă liniară dublu înlănțuită === === Listă liniară dublu înlănțuită ===
Line 119: Line 144:
 ===== Schelet ===== ===== Schelet =====
 <note important>​Daca folositi **Github Classroom**,​ va rugam sa va actualizati scheletul cu cel de mai jos. Cel din repo-ul clonat initial nu este la cea mai recenta versiune.</​note>​ <note important>​Daca folositi **Github Classroom**,​ va rugam sa va actualizati scheletul cu cel de mai jos. Cel din repo-ul clonat initial nu este la cea mai recenta versiune.</​note>​
-{{:​sd-ca:​laboratoare:​lab3sd-v2.zip|Scheletul de laborator}}+{{:​sd-ca:​laboratoare:​sd-lab-03V2.zip|Scheletul de laborator}}
 ===== Exerciții ===== ===== Exerciții =====
  
 <​note>​ <​note>​
-Trebuie să vă creați cont de [[https://​beta.lambdachecker.io/​ | Lambda Checker]], dacă nu v-ați creat deja, pe care îl veți folosi la SD pe toată durata semestrului. Aveti grija sa selectati contestul corect la submit, si anume **[[https://​beta.lambdachecker.io/​contest/​69/​problems?​page=1]]**+Trebuie să vă creați cont de [[https://​beta.lambdachecker.io/​ | Devmind]], dacă nu v-ați creat deja, pe care îl veți folosi la SD pe toată durata semestrului. Aveti grija sa selectati contestul corect la submit, si anume **[[https://​beta.lambdachecker.io/​contest/​69/​problems?​page=1 ​| Laborator 3]]**
 </​note>​ </​note>​
  
-[**5p**] Implementaţi,​ plecând de la scheletul de cod, lista circulară dublu înlănțuită. (problema **Circular Doubly LinkedList** pe LambdaChecker)+[**5p**] Implementaţi,​ plecând de la scheletul de cod, lista circulară dublu înlănțuită. (problema **Circular Doubly LinkedList** pe Devmind)
  
-[**2p**] Rezolvati problema desemnata grupei voastre. O veti gasi pe LambdaChecker ​sub forma **SD-CA-LAB-03-31XCA**.+[**2p**] Rezolvati problema desemnata grupei voastre. O veti gasi pe Devmind ​sub forma **SD-CA-LAB-03-GR-31XCA**.
  
 <note important>​**Important!** Problemele folosesc liste dublu inlantuite **liniare**,​ nu circulare!</​note>​ <note important>​**Important!** Problemele folosesc liste dublu inlantuite **liniare**,​ nu circulare!</​note>​
sd-ca/laboratoare/lab-03.1710624152.txt.gz · Last modified: 2024/03/16 23:22 by melih.riza
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