{{indexmenu_n>9}} ====== 9 - Spojové seznamy, fronta, zásobník ====== ===== Procvičované témata ===== * Dynamická alokace * Rekurze * Valgrind * Spojový seznam * Zásobník vs. fronta ===== Úkoly na cvičení ===== - Implementujte frontu, která bude obsahovat celá čísla, která bude uživatel zadávat z klávesnice. - Společně s cvičícím navrhněte vhodnou datovou stukturu, na které bude fronta založena. - Společně s cvičícím navrhněte prototypy funkcí, které umožní vkládání dat do fronty (PUSH), odebírání z fronty (POP), dotaz na poslední prvek. - Vytvořte funkci, která vypíše na konzoli obsah celé fronty. - Nezapomeňte implementovat i funkci, která uvolní všechna data spojená s implementovanou frontou. - Kontrolujte správnost dynamické alokace paměti pomocí Valgrindu. - Upravte vhodně kód tak, abyste naimplementovali zásobník. - S cvičícím diskutujte změny, které jste v kódu provedli. ===== Další úkoly na procvičení ===== - Implementujte spojový seznam, který v sobě bude obsahovat vždy dvojici dat - dvě celá čísla - první bude datová složka a druhé bude představovat prioritu. - Upravte předchozí seznam tak, aby implementoval prioritní frontu tak, aby funkce PUSH od začátku vytvářela vnitřní stukturu seznamu seřazenou podle priority. ===== Ukázkové příklady ===== ==== 1. Lineární seznam ==== #include struct polozka { int data; struct polozka * dalsi; }; struct polozka * insert (struct polozka * a, int d) { struct polozka * tmp = (struct polozka *) malloc(sizeof(struct polozka)); tmp->data = d; tmp->dalsi = a; return tmp; } int projdi (struct polozka *a) { if (a == NULL) return 0; else { printf("data: %d\n", a->data); projdi (a->dalsi); } } int main() { struct polozka * seznam = NULL; seznam = insert(seznam, 10); seznam = insert(seznam, 20); seznam = insert(seznam, 30); projdi (seznam); return 0; } ==== 2. Zásobník ==== #include typedef struct u { int data; struct u * predchozi; } uzel; uzel * push (uzel * a, int data) { uzel * tmp = (uzel *)malloc(sizeof(uzel)); tmp->data = data; tmp->predchozi = a; return tmp; } uzel * pop (uzel * a, int * data) { *data = a->data; uzel * tmp = a->predchozi; free (a); return tmp; } int main() { int a; uzel * zasobnik = NULL; zasobnik = push (zasobnik, 10); zasobnik = push (zasobnik, 33); zasobnik = pop (zasobnik, &a); printf("pop: %d\n", a); zasobnik = pop (zasobnik, &a); printf("pop: %d\n", a); return 0; }