SDA Lucrarea 3: Diferență între versiuni

De la WikiLabs
Jump to navigationJump to search
Linia 19: Linia 19:


= Implementarea secvenței cu vectori =
= Implementarea secvenței cu vectori =
În cazul implementării cu vectori, elementele sunt plasate într-un vector de dimensiune fixă și cunoscută. Din cauza faptului că secvența are dimensiune nelimitată, se cere ca implementarea acesteia cu vectori să suporte redimensionarea dinamică a acestora pentru a acomoda elemente suplimentare în momentul când vectorii se umplu. Astfel, suntem obligați ca pentru implementarea secvențelor să folosim alocare dinamică de memorie, iar tipul date care poate fi folosit pentru stocarea adreselor alocate este pointerul. Totuși cunoaștem din lecțiile anterioare faptul că o variabilă de tip pointer nu memorează decât o adresă de start a zonei de memorie alocată, nu și dimensiunea ei. Prin urmare vom defini o structură numită <code>ArrayList</code> care va stoca adresa de start dar și dimensiunea zonei alocate. Mai jos este un exemplu de secvență de valori întregi pe 16 biți:
<syntaxhighlight lang="C">
struct ArrayList {
    short * array;    // pointer la zona de memorie alocată
    unsigned capacity; // dimensiunea zonei alocate
};
</syntaxhighlight>


= Implementarea secvenței cu liste simplu și dublu înlănțuite =
= Implementarea secvenței cu liste simplu și dublu înlănțuite =


= Exerciții =
= Exerciții =

Versiunea de la data 22 martie 2016 13:52

În acest laborator se vor implementa secvențe cu vectori și liste simplu și dublu înlănțuite.

Secvența (lista abstractă - List)

Secvența este o structură de date abstractă care stochează datele sub forma unui șir de elemente de același fel.

Secvența are următoarele proprietăți:

  1. Datele sunt stocate într-o anumită ordine (se poate spune că un element este plasat înaintea sau după un alt element în structură).
  2. Numărul de elemente ce poate fi stocat de structură este nelimitat (a nu se confunda cu infinit, există întotdeauna limita dată de memoria disponibilă).
  3. Elementele stocate în secvență sunt de același fel.

Secvența suportă următoarele operații de bază:

  1. Interogarea numărului de elemente din secvență.
  2. Inserția unui element pe o anumită poziție în secvență.
  3. Ștergerea unui element de pe o anumită poziție din secvență.
  4. Căutarea unui element în secvență (căutare care va întoarce indexul pe care apare elementul în strucutră).
  5. Accesarea unui element de pe o anumită poziție.
  6. Dacă există o relație de ordine pe mulțimea din care fac parte elementele, se poate defini operația de sortare a secevenței care implică mutarea elementelor pe alte poziții, astfel încât un element considerat mai mic după relația de ordine folosită să fie plasat înaintea oricărui element considerat mai mare.

Implementarea secvenței cu vectori

În cazul implementării cu vectori, elementele sunt plasate într-un vector de dimensiune fixă și cunoscută. Din cauza faptului că secvența are dimensiune nelimitată, se cere ca implementarea acesteia cu vectori să suporte redimensionarea dinamică a acestora pentru a acomoda elemente suplimentare în momentul când vectorii se umplu. Astfel, suntem obligați ca pentru implementarea secvențelor să folosim alocare dinamică de memorie, iar tipul date care poate fi folosit pentru stocarea adreselor alocate este pointerul. Totuși cunoaștem din lecțiile anterioare faptul că o variabilă de tip pointer nu memorează decât o adresă de start a zonei de memorie alocată, nu și dimensiunea ei. Prin urmare vom defini o structură numită ArrayList care va stoca adresa de start dar și dimensiunea zonei alocate. Mai jos este un exemplu de secvență de valori întregi pe 16 biți:

struct ArrayList {
    short * array;     // pointer la zona de memorie alocată
    unsigned capacity; // dimensiunea zonei alocate
};

Implementarea secvenței cu liste simplu și dublu înlănțuite

Exerciții