• Nie Znaleziono Wyników

Informatyka II. INF & EIT.

N/A
N/A
Protected

Academic year: 2021

Share "Informatyka II. INF & EIT."

Copied!
2
0
0

Pełen tekst

(1)

Informatyka II. INF & EIT. Ćwiczenie 12.

Drzewa i grafy

Zagadnienia: Programowanie z wykorzystaniem drzew binarnych i grafów. Drzewo poszukiwań binarnych – podstawowe operacje. Implementacja grafów skierowanych – lista incydencji, macierz incydencji, macierz sąsiedztwa wierzchołków.

1. Zaprojektować funkcje służące do obsługi drzewa poszukiwań binarnych (drzewo binarne z ustalonym porządkiem) o następującej strukturze:

typedef struct ndbin *pnode; // wskaźnik na element drzewa

typedef struct ndbin { int klucz; pnode lewy, prawy; }; // element drzewa pnode pocz; // wskaźnik początku drzewa - program główny

Wskaźnik lewy zawiera adres elementu drzewa o mniejszej lub równej wartości klucza, niż wartość zawarta w polu klucz, natomiast wskaźnik prawy - adres elementu o wartości większej lub równej.

Deklaracje typów danych (typedef) oraz prototypy funkcji umieścić w pliku nagłówkowym prot.h, definicje funkcji umieścić w pliku defs.cpp, program główny nazwać drzewo.cpp.

W programie głównym umieścić pnode pocz. Utworzyć projekt drzewo i skompilować.

Opracować funkcje umożliwiające:

a) dodanie elementu o podanej wartości klucza zgodnie z porządkiem drzewa (dla ustalone- go węzła elementy o mniejszych (równych) wartościach kluczy są umieszczane w lewym następniku, natomiast elementy o większych wartościach kluczy – w prawym następniku;

funkcja przydziela dynamicznie pamięć dla elementu i umieszcza go w odpowiednim miejscu drzewa; prototyp funkcji: void DodajElementD(pnode& pocz, int klucz);

b) odnalezienie elementu o podanej wartości klucza; funkcja zwraca wskaźnik do odnale- zionego elementu; prototyp funkcji: pnode ZnajdzElementD(pnode pocz, int klucz);

c) usunięcie elementu o podanej wartości klucza; funkcja powinna odnaleźć element, zmo- dyfikować strukturę drzewa, a następnie zwolnić pamięć przydzieloną elementowi (jeżeli usuwany węzeł nie ma lewego następnika, to w miejsce usuwanego węzła wstawić jego prawego następnika; jeżeli usuwany węzeł posiada lewego następnika, to w lewym pod- drzewie węzła usuwanego znaleźć węzeł o maksymalnej wartości klucza - węzeł taki nie ma prawego następnika; klucz wpisać do węzła usuwanego, natomiast znaleziony węzeł usunąć, a w jego miejsce wstawić lewego następnika); prototyp funkcji:

void UsunElementD(pnode& pocz, int klucz);

d) usunięcie drzewa z pamięci; prototyp funkcji: void UsunDrzewo(pnode& pocz);

e) wyprowadzenie kluczy zapamiętanych w drzewie w porządku rosnącym;

prototyp funkcji: void PiszKlucze(pnode pocz).

Przetestować opracowane funkcje w programie głównym (np. losować wartości kluczy lub wprowadzać je z klawiatury). Przed zakończeniem programu zwolnić pamięć.

(2)

2. Opracować funkcję, która umożliwia wczytanie z klawiatury (pliku) i utworzenie w pamięci listy incydencji grafu skierowanego o N wierzchołkach (N - stała), a następnie wyprowadze- nie zawartości listy na ekran oraz związanych z nią macierzy sąsiedztwa wierzchołków i ma- cierzy incydencji (pętle własne, tj. krawędzie wychodzące i dochodzące do tego samego wierzchołka oznaczać za pomocą cyfry 2). Przyjąć, że elementy listy są wprowadzane wier- szami, tzn. najpierw jest podawany numer wierzchołka, a następnie numery wierzchołków incydentnych. Utworzone macierze wyprowadzić na ekran wierszami. W szczególności, lista incydencji w postaci:

Numer wierz. Numery wierz. incydentnych

1 1, 2

2 2, 3

3 4

4 1

reprezentuje graf pokazany na rysunku. Macierz sąsiedztwa wierzchołków - MSW (wiersze i kolumny są numerami wierzchołków) oraz macierz incydencji grafu INC (wiersze są wierzchołkami, kolumny - krawędziami) 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 może być zdefiniowana za pomocą następujących struktur:

typedef struct node *pnode; // wskaźnik wierzchołka incydentnego typedef struct node { // element listy incydencji

int na; // numer wierzchołka incydentnego

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

typedef struct lista *plista; // wskaźnik początku listy

typedef struct lista { // element reprezentujący wierzchołek grafu int nb; // numer wierzchołka

pnode pocz; // wskaźnik pierwszego wierzchołka incydentnego plista nastL; // wskaźnik następnego wierzchołka listy

};

plista pocz; // wskaźnik początku listy incydencji – program główny

Deklaracje typów danych (typedef) oraz prototypy funkcji umieścić w pliku nagłówkowym prot.h, definicje funkcji umieścić w pliku defs.cpp, program główny nazwać graf.cpp. W pro- gramie głównym umieścić plista pocz. Utworzyć projekt graf i skompilować.

Przetestować opracowane funkcje dla wybranych grafów. Przed zakończeniem programu zwolnić pamięć.

Literatura:

• Cormen T. H., Leiserson C. E., Rivest R. L.: Wprowadzenie do algorytmów, WNT, Warszawa, 1998.

• Sedgewick R.: Algorytmy w C++, Addison-Wesley, RM, Warszawa, 1999.

• Wirth N.: Algorytmy + struktury danych = programy, WNT, Warszawa, 1989.

1 2

4 3

Cytaty

Powiązane dokumenty

Zdefiniować wskaźnik funkcji double f(double). Zainicjować wskaźnik adresem standar- dowej funkcji sin. Za pomocą wskaźnika wyznaczyć wartości funkcji sin w N losowych punktach

Opracować program umożliwiający przekazanie do programu trzech liczb typu int za pomocą argumentów funkcji main(int argc, char *argv[]), gdzie argc – liczba

Nie zmieniając zawartości tablicy struktur i nie kopiując jej do innej tablicy zmodyfi- kować tablicę indeksów w taki sposób, aby kolejne pozycje w tablicy ind określały

Opracować program, który zapisze do pliku binarnego dane w formacie: rozmiar danej typu tdana (zmienna typu unsigned), liczba danych w pliku (zmienna typu long), ciąg danych

Opracować funkcję, która wyznacza wszystkie liczby pierwsze z przedziału [2,N] w oparciu o metodę „sita” (opis: wpisać wszystkie liczby z przedziału [2,N] do tablicy t[N+1],

Napisać program, który losuje k cyfr liczby binarnej do tablicy unsigned char dane[N], gdzie 1<= k <= N, a następnie oblicza wartość dziesiętną liczby.. Zadanie zrealizować z

przydzielić dynamicznie pamięć zmiennym typu char, int, long, float, double oraz zapamię- tać ich adresy w odpowiednich wskaźnikach. W przypadku, gdy alokacja pamięci powiedzie

a) tworzącą dynamiczną tablicę 2-wymiarową typu int A[nw][nk] o liczbie wierszy i liczbie kolumn wczytywanych do zmiennych int nw, nk; funkcja typu int** zwraca adres po-