Algorytmy i struktury danych, USM, zaoczne. Ćwiczenie 7.
Dynamiczne struktury informacyjne - listy
Cel ćwiczenia: Projektowanie algorytmów wykorzystujących dynamiczne struktury informa- cyjne. Operacje na listach jednokierunkowych i dwukierunkowych. Listy uporządkowane.
Implementacja kolejki i stosu z wykorzystaniem listy.
1. Zadeklarować typy danych określające listę jednokierunkową:
typedef int tdana; // typ danej klucza
typedef struct tlista *plista; // wskaźnik na element listy struct tlista { tdana klucz; plista nast; }; // element listy
Zdefiniować zmienną pocz typu plista wskazującą na początek listy. Wykorzystać przedstawione definicje do implementacji stosu (kolejki typu LIFO). Opracować funkcje:
a) dodającą element o podanej wartości klucza na stos; przydzielić pamięć, wpisać daną x do klucza, zmodyfikować wskaźnik wierzchołka stosu pocz; prototyp funkcji:
void NaStos(plista &pocz, tdana x); // LIFO
b) zdejmującą element z wierzchołka stosu; zapamiętać wartość klucza w zmiennej x, zmodyfikować wskaźnik wierzchołka stosu pocz, zwolnić pamięć; prototyp funkcji:
void ZeStosu(plista &pocz, tdana &x);
c) wyprowadzającą na ekran zawartość stosu oraz adresy jego poszczególnych elementów (%p); prototyp funkcji: void Pisz(plista pocz);
Deklaracje typów danych oraz prototypy funkcji umieścić w pliku nagłówkowym prot.h, definicje funkcji umieścić w pliku defs.cpp, program główny nazwać stos.cpp. W programie głównym umieścić plista pocz. Utworzyć projekt i skompilować.
Przetestować funkcje w programie. Przed zakończeniem programu zwolnić pamięć.
2. Wykorzystując listę jednokierunkową zdefiniowaną w zadaniu 1 zrealizować kolejkę typu FIFO. Przyjąć zmienne pocz i kon typu plista za, odpowiednio, początek i koniec kolejki.
Wartości początkowe: pocz = kon = NULL. Opracować funkcje:
a) dodającą element o podanej wartości klucza na koniec kolejki; przydzielić pamięć, wpisać daną x do klucza, zmodyfikować wskaźniki kolejki (pocz, kon); prototyp funkcji: void DoKolejki(plista &pocz, plista &kon, tdana x); // FIFO
b) pobierającą element z początku kolejki; zapamiętać wartość klucza w zmiennej x, zmodyfikować wskaźniki kolejki (pocz, kon), zwolnić pamięć; prototyp funkcji:
void ZKolejki(plista &pocz, plista &kon, tdana &x);
c) wyprowadzającą na ekran zawartość kolejki oraz adresy jej poszczególnych elementów (%p); prototyp funkcji: void Pisz(plista pocz);
Deklaracje typów danych oraz prototypy funkcji umieścić w pliku nagłówkowym prot.h, definicje funkcji umieścić w pliku defs.cpp, program główny nazwać kolejka.cpp. W programie głównym umieścić plista pocz, kon. Utworzyć projekt i skompilować.
Przetestować funkcje w programie. Przed zakończeniem programu zwolnić pamięć.
3. Zdefiniować listę dwukierunkową w sposób następujący:
typedef int tdana; // typ danej klucza
typedef struct tlistad *plistad; // wskaźnik na element listy struct tlistad { tdana klucz; plistad nast, pop; }; // element listy
Przyjąć, że zmienna pocz typu plistad wskazuje na początek listy.
Opracować następujące funkcje:
a) dodającą element do listy z zachowaniem porządku klucza (np. wczytywanie danych z pliku z zachowaniem porządku klucza, tj. dane z pliku ustawić na liście zgodnie z rosnącymi lub malejącymi wartościami klucza);
b) znajdującą wskaźnik pierwszego elementu o podanej wartości klucza;
c) usuwającą pierwszy element o podanej wartości klucza;
d) wyprowadzającą zawartość listy oraz adresy jej elementów na ekran.
Przetestować opracowane funkcje w programie głównym.
4. Utworzyć listę dwukierunkową złożoną z N losowych elementów typu tdana, gdzie N jest liczbą typu int wprowadzaną z klawiatury (tj. wpisać losowe dane do listy). Opracować następujące funkcje:
a) wyprowadzającą zawartość listy na ekran;
b) obliczającą sumę elementów;
c) sortującą elementy wprowadzone do listy (tj. posortować dane wpisane do listy).
Przetestować opracowane funkcje w programie głównym.