ĆWICZENIE 3
Podstawowe dynamiczne struktury danych - stos
Celem ćwiczenia jest zapoznanie studentów z najprostszą dynamiczną strukturą danych: stosem.
I. PRZEBIEG ĆWICZENIA
Tworzenie elementarnego stuktury:
Uwaga: Typy danych przechowywanych w dowolnego rodzaju dynamicznych strukturach danych są oczywiście całkowicie dowolne. W tej instrukcji dane te oznaczane są dużymi literami, np. „DOL”, „ELEMENT 3”, itd. Zamiast tych nazw oczywiście używa się danych odpowiedniego typu (np. liczb typu int).
Każdą tworzoną dynamicznie strukturę należy utworzyć przy pomocy instrukcji wskaznik = new(TTypStrukturalny);
a następnie należy przypisać jego polom określone dane: Wskaznik jest najczęściej zwykłą zmienną statyczną (tworzoną przy pomocy TTypStrukturalny * Wskaznik).
Wskaznik
TTypStrukturalny * Wskaznik;
Wskaznik
????????????? SMIECI ??????????
SMIECI Wskaznik = new TtypStrukturalny;
Wskaznik
DANE
NIL
Wskaznik->DANE=Dane;
Wskaznik->Nastepny=NULL;
Stos:
Stos jest dynamiczną strukturą danych, w której dołączanie i usuwanie elementów zachodzi tylko w jednym miejscu: na wierzchołku. Stos można wyobrazić sobie jako stos książek: chcąc wyjąć jedną, należy wcześniej wyjąć wszystkie znajdujące się powyżej:
ELEMENT NA WIERZCHOLKU
Element 2
Element 3
DÓL Wierzcholek
NIL
Rysunek 1 - Stos
Tworzenie stosu:
Wierzcholek
DÓL
NIL
Wierzcholek = new TTypStrukturalny;
Wierzcholek->DANE = DÓŁ;
Wierzcholek->Nastepny = NULL;
(To już jest stos, tyle, że nieco mało użyteczny.... Od teraz dodawanie każdego nowego elementu będzie przebiegało identycznie).
Najpierw należy utworzyć elementarną „cegiełkę”:
Wierzcholek
DÓL
Element 3 Tmp
NIL
NIL
Tmp = new TTypStrukturalny;
Tmp->DANE = Element_3;
Tmp->Nastepny = NULL; //To przypisanie w zasadzie nie jest konieczne, gdyż zaraz zostanie // zmienione
Następnie można połączyć tę nową „cegiełkę” z resztą stosu:
TMP
Element 3
Wierzcholek
NIL
DÓL
Tmp->Nastepny = Wierzcholek;
Ponieważ w przypadku stosu KONIECZNE jest zapewnienie, aby Wierzcholek wskazywał na rzeczywisty wierzchołek stosu:
TMP
Element 3 Wierzcholek
NIL
DÓL
Wierzcholek = Tmp;
Element 3 Wierzcholek
NIL
DÓL
(Gotowy stos; Zmienna Tmp nie jest już potrzebna i można ją wykorzystać do innych celów)
Dodawanie nowego elementu do stosu o dwóch elementach
Należy zauważyć, że dodawanie danych do stosu o dowolnym rozmiarze (od pustego stosu do utworzenia potrzebnej liczby elementów) przebiega zawsze w ten sam, omówiony wcześniej sposób:
Element 3 Wierzcholek
NIL
DÓL
Element 2 Tmp
NIL
Tmp = new TtypStrukturalny;
Tmp->DANE = Element_2;
Tmp->Nastepny = Wierzcholek;
Wierzcholek
NIL
DÓL Element 2 Tmp
Element 3
Wierzcholek = Tmp;
Wierzcholek
NIL
DÓL Element 2 Tmp
Element 3
(Prawie) gotowy stos;
Porównaj strzałkę (wskaźnik
Tmp->Nastepny)
Wierzcholek
NIL
DÓL Element 2
Element 3
Gotowy stos. Zmienna Tmp nie jest już potrzebna i można ją wykorzystać do innych celów.
Dodawanie pozostałych elementów następuje analogicznie.
Usuwanie elementów ze stosu:
Przy usuwaniu elementu ze stosu również będzie niezbędne użycie pomocniczego wskaźnika Tmp.
Wierzcholek
NIL
DÓL Element 2
Element 3 TMP
ODCZYTAJ_DANE_ZE_STUKTURY(Wierzcholek->DANE); tmp=Wierzcholek->Nastepny;
Przygotowanie danych do usunięcia. Zmienna dynamiczna “Element 2” zostanie usunięta, jednak ustawienie pola
“Nastepny” na wartość NULL ułatwia odszukiwanie błędów. UWAGA: PRZED wykonaniem tego kroku (a więc przed
“odcięciem” zmiennej dynamicznej, na którą wskazuje wskaźnik “Wierzcholek” KONIECZNE jest zapewnienie, że na resztę struktury wskazuje jakiś inny wskaźnik – tutaj Tmp. Jeśli w dowolnej chwili to nie będzie spełnione, wtedy NIE MA MOŻLIWOŚCI NAPRAWY TEGO BŁĘDU - STRUKTURA ZOSTANIE NIEODWRACALNIE ZNISZCZONA!!!).
Wierzcholek
NIL
DÓL TMP
Element 2
NIL
Element 3
Wierzchołek->Następny=NULL;
Teraz można już usunąć element na wierzchołku stosu:
Te strzałki reprezentują pole
„następny” swoich rekordów
Ta strzałka to
Wierzchołek->NastępnyWierzcholek
NIL
DÓL TMP
Element 2
Element 3 SMIECI
delete Wierzcholek; /*Usunięcie zmiennej dynamicznej, na którą wskazuje wskaźnik Wierzcholek. Po wykonaniu tej linii, wskaźnik Wierzcholek NIE wskazuje na żaden użyteczny obszar pamięci (napisanie więc (*Wierzcholek) lub Wierzcholek->cokolwiek jest BŁĘDNE). */
Ponieważ wskaźnik Wierzcholek powinien zawsze wskazywać na wierzchołek stosu, dlatego konieczne jest jego ponowne ustawienie:
Wierzcholek
NIL
DÓL
TMP Element 3
Wierzchołek:=Tmp; /*(Zmienna TMP nie jest już potrzebna i może zostać użyta do innych celów. Od teraz Wierzchołek znowu wskazuje na użyteczną zmienną dynamiczną – na początek stosu).*/
Usuwanie pozostałych elementów realizuje się analogicznie.