Laboratorium 4 –ADT kolejki priorytetowej i realizacja za pomocą list wiązanych Cele:
• Zastosowanie struktur wiązanych, zwanych również dynamicznymi lub rekurencyjnymi strukturami danych do realizacji kolejki priorytetowej. Realizacja kolejki priorytetowej w postaci ADT za pomocą jednej z wybranych list: jednokierunkowej nieuporządkowanej, dwukierunkowej nieuporządkowanej lub uporządkowanej.
• Porównanie liczby elementarnych operacji czyli porównań, przypisań, operacji arytmetycznych, indeksowań, wyłuskań itd. dla dwóch realizacji kolejki priorytetowej: jednej wykonanej przez studenta, opartej na wybranej liście oraz np. wykonanej w oparciu o algorytmy stogowe (kol_p2.cpp).
• Zastosowanie parametrów funkcyjnych do tworzenia kolejki priorytetowej wg różnych atrybutów danych: nazwiska, wieku itd.
Proponowane zadania do wykonania:
Program 1. Należy wykonać program, w którym są następujące opcje:
1.1 Wybór kryterium wstawiania i usuwania danych typu strukturalnego Osoba z kolejki: wg nazwiska lub wg wieku itp.
1.2 Wstawianie do kolejki, zrealizowanej za pomocą wybranego typu listy, danych w prowadzanych z klawiatury.
1.3 Usuwanie największego elementu
1.4 Wyświetlanie danych z kolejki za pomocą funkcji przejścia przez kolejkę Dla_kazdego, 1.5 Wykonanie eksperymentu do oceny czasochłonności operacji na kolejce priorytetowej
15.1. Wybór rozkładu danych wstawianych do kolejki np. wybór rozkładu losowego przez wywołanie funkcji srand z ustalonym parametrem, lub wybór danych posortowanych przez przygotowanie danych w tablicy, posortowanych w sposób rosnący lub malejący wg wybranej składowej w opcji 1.1.
1.5.2. Wykonanie eksperymentu: wstawienie 1000 danych do kolejki priorytetowej zgodnie z wybranym rozkładem danych (funkcja random lub pobranie danych posortowanych z tablicy). Zliczenie operacji elementarnych (patrz Wyjaśnienia) 1.5.3. Usunięcie 1000 danych z kolejki priorytetowej, zliczając operacje elementarne za pomocą liczników, używanych
podczas wstawiania 1000 elementów w opcji 1.5.2.
1.5.4. Zapisanie w pliku wartości liczników elementarnych operacji
1.6 Prezentacja na ekranie liczby operacji zapisanych w pliku po wykonaniu eksperymentu z punktu 1.5. Zapamiętanie wyników liczenia operacji w pliku pozwoli porównać je z wynikami dla kolejki, budowanej na bazie jednego z drzew poszukiwań binarnych, tworzonej w laboratorium 5).
Uwaga: można wykorzystać kolejkę priorytetową wykonaną za pomocą listy jednokierunkowej (kol_p3.cpp), uzupełnionej o funkcje podane powyżej (ocena 4.0-4.5).
Wyjaśnienia:
• Funkcja Dla_kazdego (funkcja przechodząca przez wszystkie elementy listy o przekładowym nagłówku void Dla_kazdego(kolejka_p Kolejka_P, funkcja wykonaj), gdzie typ funkcja jest zdefiniowana jako typedef void (*funkcja)(dane) oraz typedef struct Osoba dane dla kolejki. Może ona np. wyświetlać dane umieszczone w elementach kolejki na ekranie (jeśli podstawiona funkcja pod parametr funkcyjny wykonaj typu funkcja potrafi wyświetlić na ekranie dane umieszczone w elementach kolejki lub zapisywać je w pliku (jeśli podstawiona funkcja pod parametr funkcyjny wykonaj typu funkcja potrafi zapisywać w pliku dane umieszczone w elementach kolejki).
void Dla_kazdego(kolejka_p& Kolejka_P, funkcja wykonaj) //w programie przykładowe wywołanie Dla_kazdego(Kolejka_P, Pokaz_dane) { // tutaj uzupełnić kod //nagłówek funkcji void Pokaz_dane(dane Dane)
while (lista != NULL) {
d = lista->Dane;
wykonaj(d);
//tutaj uzupełnij kod }
}
• Wyznaczenie liczby elementarnych operacji typu porównania, przypisania, wywołania funkcji, operacji arytmetycznych, wyłuskań (np. struktura->składowa oznacza sumę: wyłuskanie + wybór składowej za pomocą operatora . (*wskstruktura).składowa) występujących przy wstawianiu 1000 danych, zależnych od rozkładu wstawianych danych i przy usuwaniu wszystkich elementów z kolejki. Ważne są łączne liczby wykonanych operacji elementarnych występujących w kodzie funkcji do wstawiania i usuwania (np. suma operacji porównania przy dodawaniu i usuwaniu 1000 elementów).
• Wybór kryterium wstawiania i usuwania z kolejki można zrealizować za pomocą przypisania nazwy funkcji porównującej wybrany atrybut do parametru funkcyjnego przekazywanego do funkcji wstawiającej i usuwającej (tak jak w funkcji Dla_kazdego)
Program 2. Należy w programie tworzącym kolejkę priorytetową w pliku kol_p2.cpp dodać funkcje przedstawione w punkcie 1 i porównać w obu rozwiązaniach liczby operacji elementarnych. Przy liczeniu operacji elementarnych należy indeksowanie potraktować jako sumę operacji wyłuskania i arytmetycznej tab[i] → *(tab+i).
Uwaga: można wprowadzić zmiany w pisanych programach, jeśli zostaną zachowane cele laboratorium 4.