Spojové seznamy, ukazatele, stromy (binární strom)
Formát: 30 min praktická úloha, 15 min obhajoba + teorie. Teorie pokrývá linked listy, BST a tree traversals. U téhle otázky malujte jako diví: diagramy stromů jsou klíčové.
Klasické pole má pevnou velikost a vkládání/mazání je drahé (musí se přesouvat prvky). Spojové struktury řeší:
Datové struktury
├─ Lineární
│ ├─ Pole (array) ........... pevná velikost, indexový přístup
│ ├─ Spojový seznam ......... dynamická velikost, sekvenční přístup
│ └─ Fronta, zásobník ....... omezený přístup (FIFO, LIFO)
├─ Hierarchické
│ ├─ Strom (Tree)
│ ├─ Binární strom
│ └─ BST (Binary Search Tree)
└─ Síťové
└─ Graf
int a = 10;
int* p = &a; // p drží ADRESU proměnné a
printf("%d", *p); // dereference: vypíše 10
| Symbol | Význam |
|---|---|
&a |
Adresa proměnné a v paměti |
*p |
Dereference: co je na adrese, kterou drží p |
Výhody C pointerů: přímá práce s pamětí, výkon. Nevýhody: segfault, memory leaks, neintuitivní.
C# pointery běžně nepoužívá, místo nich má reference, které jsou součástí jazyka pro každý class.
class Person { public string Name; }
Person p1 = new Person();
Person p2 = p1; // p2 ukazuje na STEJNÝ objekt
p2.Name = "axo";
Console.WriteLine(p1.Name); // "axo": obě ukazují na totéž
STACK HEAP
┌──────┐ ┌──────────────────┐
│ p1 → ●──────────▶│ Person {axo} │
│ p2 → ●──────────▶│ │
└──────┘ └──────────────────┘
Obě reference ukazují na 1 objekt