• Nie Znaleziono Wyników

Algorytmy i struktury danych, USM, zaoczne.

N/A
N/A
Protected

Academic year: 2021

Share "Algorytmy i struktury danych, USM, zaoczne."

Copied!
2
0
0

Pełen tekst

(1)

Algorytmy i struktury danych, USM, zaoczne. Ćwiczenie 8.

Drzewa i grafy

Cel ćwiczenia: Projektowanie algorytmów wykorzystujących drzewa i grafy. Wykonywanie operacji na drzewach poszukiwań binarnych (wstawianie, wyprowadzanie, wyszukiwanie, usuwanie elementów). Drzewa poszukiwań doskonale zrównoważone i drzewa AVL. Grafy skierowane - lista incydencji, macierz sąsiedztwa wierzchołków, macierz incydencji.

1. Zdefiniować drzewo poszukiwań binarnych za pomocą typedef struct ndbin* pw; struct ndbin {int klucz; pw lewy, prawy; }; pw pocz; (korzeń drzewa). Przyjąć, że mniejszy lub równy element jest umieszczany w lewym następniku węzła, natomiast większy element w prawym następniku. Opracować następujące funkcje:

a) dodającą element do drzewa z zachowaniem porządku; funkcja przydziela dynamicz- nie pamięć dla elementu i umieszcza go w odpowiednim miejscu drzewa;

void Dodaj(pw& pocz, int klucz);

b) znajdującą węzeł o podanej wartości klucza (funkcja zwraca wskaźnik węzła lub NULL, jeśli węzeł nie został znaleziony); pw Znajdz(pw pocz, int klucz);

c) wyprowadzającą na ekran klucze zapisane w drzewie w porządku rosnącym;

void PiszKlucze(pw pocz);

d) usuwającą węzeł o podanej wartości klucza (znaleźć węzeł i zmodyfikować strukturę drzewa w taki sposób, aby zachowany został porządek; zwolnić pamięć przydzieloną usuwanemu węzłowi); void UsunElement(pw& pocz, int& klucz);

e) usuwającą drzewo z pamięci; void UsunDrzewo(pw& pocz).

Przetestować opracowane funkcje w programie głównym. Przed zakończeniem programu zwolnić pamięć.

2. Opracować funkcje tworzenia doskonale zrównoważonego drzewa poszukiwań binarnych, w którym wszystkie klucze są różne. W drzewie doskonale zrównoważonym spełniona jest następująca własność: dla każdego węzła liczby węzłów w jego lewym i prawym poddrzewie różnią się co najwyżej o jeden. Wyprowadzić elementy drzewa na ekran.

3. Opracować funkcję tworzenia zrównoważonego drzewa poszukiwań binarnych, w którym wszystkie klucze są różne (drzewa AVL). W drzewie zrównoważonym spełniona jest na- stępująca własność: dla każdego węzła wysokości dwóch jego poddrzew różnią się co najwyżej o jeden. Wyprowadzić elementy drzewa na ekran.

4. Opracować program, który czyta z pliku tekstowego o nazwie igraf.txt listę incydencji grafu skierowanego, tworzy listę oraz związane z nią macierz sąsiedztwa wierzchołków i macierz incydencji (pętlę własną, tzn. krawędź wychodzącą i dochodzącą do tego same- go wierzchołka grafu oznaczać za pomocą cyfry 2). W szczególności graf pokazany na rysunku reprezentuje lista incydencji w postaci:

Numer wierz. Numery wierz. incydentnych

1 1, 2

2 2, 3

3 4

4 1

1 2

4 3

(2)

Macierz sąsiedztwa wierzchołków grafu - MSW (wiersze i kolumny reprezentują numery wierzchołków grafu) oraz macierz incydencji grafu - INC (wiersze reprezentują wierz- chołki, natomiast kolumny krawędzie grafu) przedstawiono poniżej.









=

0 0 0 1

1 0 0 0

0 1 1 0

0 0 1 1 MSW









=

0 0 1 1 0 0

0 0 0 1 1 0

2 0 0 0 1 1

0 2 1 0 0 1 INC

Lista incydencji grafu jest zdefiniowana w sposób następujący:

typedef struct tnode *pnode; // wskaźnik wierzchołka incydentnego struct tnode { // element – wierzchołek incydentny int a; // numer wierzchołka

pnode nextN; // wskaźnik następnego wierzchołka incydentnego };

typedef struct tlista *plista; // wskaźnik początku listy struct tlista { // element – wierzchołek główny

int b; // numer wierzchołka

pnode firstN; // wskaźnik pierwszego wierzchołka incydentnego plista nextL; // wskaźnik następnego węzła listy

};

plista pocz; // wskaźnik początku listy incydencji

Lista incydencji jest zapisana w pliku wierszami w taki sposób, że w każdym wierszu znajdują się numery wierzchołków incydentnych do kolejnych wierzchołków grafu oddzielone spacją (np. sekwencja: 1 2, 2 3, 4, 1 reprezentuje graf pokazany na rysunku).

Utworzone macierze wyprowadzić na ekran i zapisać do plików wierszami. W szczegól- ności zapisać macierz sąsiedztwa do pliku tekstowego msgraf.txt, a macierz incydencji do pliku migraf.txt. Przetestować działanie programu dla wybranych grafów. Przed zakoń- czeniem programu zwolnić pamięć.

Cytaty

Powiązane dokumenty

• Kody cykliczne jako idea ly w odpowiednich pier´scieniach ilorazowych.. Cykliczne

Filip Tobiasz (student) - członek komisji.. W głosowaniu jawnym RW jednogłośnie przyjęła proponowany skład Komisji Skrutacyjnej. Wojciech Domitrz, prof. Konstanty

Wyznaczyć czasy działania algorytmów w przypadku sortowania tablicy liczb całkowitych (wykorzystać funkcję pomiaru czasu). Wyprowadzić na ekran czasy

W programie głównym zdefiniować tablicę tab typu ttab oraz zmienną ile typu unsigned, w której pamiętana jest liczba struktur wprowadzonych do tablicy

c) zapisującą do pliku tekstowego losowe struktury typu tosoba oraz znaki przejścia do nowej linii (’\n’); otwarcie i zamknięcie pliku zrealizować wewnątrz

Prostsza wersja zadania może polegać na dokonaniu konwersji pliku tekstowego do binarnego, sortowaniu pliku binarnego i zapisaniu wyniku sortowania ponownie do pliku

Jeżeli operacja przydziału pamięci dla t1 i t2 zakończyła się pomyślnie (wskaźniki t1 i t2 są różne od NULL), to zainicjować tablicę t1 losowymi znakami o kodach należących

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);