• Nie Znaleziono Wyników

Pracownia programowania (C/C++). Zaoczne inżynierskie (INK). Ćwiczenie 7.

N/A
N/A
Protected

Academic year: 2021

Share "Pracownia programowania (C/C++). Zaoczne inżynierskie (INK). Ćwiczenie 7."

Copied!
1
0
0

Pełen tekst

(1)

Pracownia programowania (C/C++). Zaoczne inżynierskie (INK). Ćwiczenie 7.

Zagadnienia: Programowanie z wykorzystaniem drzew i grafów. Drzewo binarne – 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 uporządkowanego drzewa binarnego 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 wartości klucza, niż wartość zawarta w polu klucz, natomiast wskaźnik prawy - adres elementu o większej wartości.

Deklaracje wykorzystywanych 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. Utworzyć projekt drzewo.prj i skompilować (w projekcie umieścić tylko pliki z rozszerzeniem cpp) .

Opracować funkcje umożliwiające:

a) dodanie elementu o podanej wartości klucza zgodnie z porządkiem drzewa (dla ustalonego 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 odnalezionego elementu; prototyp funkcji: pnode ZnajdzElementD(pnode pocz, int klucz);

c) usunięcie elementu o podanej wartości klucza (zadanie dla chętnych); funkcja powinna odnaleźć element, zmodyfikować 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 poddrzewie 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ęć. Wyświetlić

stan pamięci na początku i na końcu programu (coreleft).

(2)

2. Opracować funkcję, która umożliwia wczytanie z klawiatury i utworzenie w pamięci listy incydencji grafu skierowanego o N wierzchołkach (N - stała), a następnie wyprowadzenie zawartości listy na ekran oraz związanych z nią macierzy sąsiedztwa wierzchołków

i macierzy 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 wierszami, 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 nastp; // 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

};

Deklaracje wykorzystywanych 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. Utworzyć projekt graf.prj i skompilować (w projekcie umieścić tylko pliki z rozszerzeniem cpp) .

Przetestować opracowane funkcje dla wybranych grafów. Przed zakończeniem programu zwolnić pamięć. Wyświetlić stan pamięci na początku i na końcu programu (coreleft).

Literatura:

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

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

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

1 2

4 3

Cytaty

Powiązane dokumenty

Wyznaczyć zmienną losową X przyjmującą wartości - liczbę rzutów kostką do momentu wyrzucenia szóstki oraz rozkład prawdopodobieństwa tej zmiennej losowej. A

b). Wartość oczekiwaną tej zmiennej losowej

W pewnym momencie każda z nich wskakuje na losowo wybranego psa (to oznacza, że będziemy zakładać, że każdy możliwy rozkład tych t pcheł na n psach jest jednakowo

[-10.2, 15.3). Wykorzystując standardową funkcję qsort opracować funkcję, która sortuje elementy tablicy rosnąco. Wyprowadzić zawartość tablicy na ekran. Zainicjować tablicę

Wyprowadzić współrzędne znalezionych punktów na ekran w trybie graficznym... Zdefiniować N - elementową tablicę wskaźników na struktury typu struct tosoba { char naz[20];

b) usunięcie elementu z początku kolejki (wierzchołka stosu); zwolnić pamięć, zmodyfikować wskaźnik początku kolejki (stosu); prototyp funkcji void Usun(pnode &pocz,

e) wstawiającą, pomiędzy istniejące dane, nową daną na zadanej pozycji w pliku o podanej nazwie; prototyp: void Fwstaw (FILE *f, char *nazwa, long poz, const tosoba *r);. f)

W programie głównym umieścić plik nagłówkowy oraz wywołania trzech funkcji oblicza- jących sumę liczb. Utworzyć projekt umożliwiający kompilację programu wielomoduło- wego.