This shows you the differences between two versions of the page.
sd-ca:laboratoare:lab-03 [2025/03/18 16:02] andrei.pirlea [LinkedList (conținut din laboratorul precedent)] |
sd-ca:laboratoare:lab-03 [2025/03/18 16:23] (current) andrei.pirlea [Exerciții] |
||
---|---|---|---|
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.// | + | 1) modificarea 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 123: | Line 148: | ||
<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 | Laborator 3]]** | + | 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-GR-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> |