ĆWICZENIE 2
Podstawowe dynamiczne struktury danych - stos, kolejka FIFO, lista jednokierunkowa
Celem ćwiczenia jest zapoznanie studentów z podstawowymi dynamicznymi strukturami danych:
stosem, kolejką FIFO (First In, First Out - pierwszy wchodzi, pierwszy obsłużony) i listą jednokierunkową.
I. PRZEBIEG ĆWICZENIA
Tworzenie elementarnego rekordu:
Uwaga: Typy danych przechowywanych w dowolnego rodzaju dynamicznych strukturach danych są oczywiście całkowicie dowolne.
Każdy tworzony dynamicznie rekord należy utworzyć przy pomocy instrukcji new(Wskaznik) a następnie należy przypisać jego polom określone dane: Wskażnik jest najczęściej zwykłą zmienną statyczną (tworzoną przy pomocy var).
Wskaznik
var Wskaźnik : TWskażnikDoRekordu;
Wskaznik
????????????? SMIECI ??????????
SMIECI new(Wskaźnik);
Wskaznik
DANE
NIL
Wskaźnik^.DANE:=Dane;
Wskaźnik^.Nastepny:=nil;
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
new(Wierzcholek); Wierzcholek^.Data: = DOL; Wierzcholek^.Nastepny: = nil;
(To już jest stos, tyle, że nieco mało użyteczny.... Od teraz dodawanie każdego nowego elementu będzie przebiegało identycznie)
Wierzcholek
DÓL
Element 3 Tmp
NIL
NIL
new(Tmp); Tmp^.Dane: = Element_3; Tmp^.Nastepny: = nil;
TMP
Element 3
Wierzcholek
NIL
DÓL
Tmp^.Nastepny: =Wierzcholek;;
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)
Element 3 Wierzcholek
NIL
DÓL
Element 2 Tmp
NIL
new(Tmp); Tmp^.Dane: = Element_2; Tmp^.Nastepny: = nil;
Wierzcholek
NIL
DÓL Element 2 Tmp
Element 3
Wierzcholek: = Tmp;
Porównaj strzałkę
(wskaźnik tmp^następny)
Wierzcholek
NIL
DÓL Element 2 Tmp
Element 3
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:
Wierzcholek
NIL
DÓL Element 2
Element 3 TMP
tmp:=Wierzcholek^.Nastepny; ODCZYTAJ_DANE_Z_REKORDU(Element_2);
Wierzcholek
NIL
DÓL TMP
Element 2
NIL
Element 3
Wierzchołek^.Następny:=nil;
Te strzałki reprezentują pole
„następny” swoich rekordów
Ta strzałka to
Wierzchołek^.Następny
Wierzcholek
NIL
DÓL TMP
Element 2
Element 3 SMIECI
dispose(Wierzcholek);
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) Usuwanie pozostałych elementów realizuje się analogicznie.
Kolejka FIFO
Kolejka FIFO jest nieco bardziej skomplikowana. Zgodnie z nazwą jej budowa przypomina kolejkę do kasy - ten, kto najwcześniej stanął jest obsługiwany jako pierwszy; kto najpóźniej – jako ostatni.
11 22 33
Ostatni
NIL
Kolejka FIFO
Tworzenie kolejki FIFO:
Ostatni
NIL
var Ostatni:TwskaźnikDoRekordu; Ostatni:=nil;
Ostatni
???
SMIECI new(Ostatni);
Ostatni
11
NIL
Ostatni^.Dane:=11 Ostatni
11
NIL
???
TMP
SMIECI Var Tmp: TWskażnikDoRekordu;
new(Tmp);
Ostatni
11
NIL
22 TMP
NIL
Tmp^.Dane:=22; Tmp^.Następny:=nil;
Pojawia się problem - gdzie wstawić TMP?
Chcemy taką sytuację:
Ostatni
11 22
TMP
NIL
Otrzymamy powyższy, poprawny wynik, jeśli napiszemy:
Ostatni^.Następny:= TMP; (Zmienna TMP nie będzie już do tego celu potrzebna.) Ostatni
11 22
NIL
Gotowa kolejka FIFO. Gotowa do wstawienia nowego elementu:
Ostatni
11 22
???
NIL
TMP
SMIECI Var Tmp: TWskażnikDoRekordu;
new(Tmp);
Można uzyskać dostęp do całego tego rekordu za pomocą:
Ostatni^
Skoro tak, to
Ostatni^.Następny
to poszukiwane miejsce do
wstawienia nowego rekordu!
Ostatni
11 22
33
NIL
TMP
NIL
Tmp^.Następny:=nil; Tmp^.Dane:=33;
POJAWIA SIĘ TEN SAM PROBLEM, TYLE, ŻE TRUDNIEJSZY! GDZIE WSTAWIĆ TMP?
Chcemy taką sytuację:
Ostatni
11 22 33
TMP
NIL
SENSOWNE ROZWIĄZANIE PROBLEMU – PĘTLA PO WSZYSTKICH ELEMENTACH, KTÓRA ZAKOŃCZY SIĘ, GDY Element^.Następny=nil Wracając do poprzedniego rysunku:
Ostatni
11 22
33
NIL
TMP
NIL
Elem
var Elem:TwskaźnikDoRekordu;
Elem: = Ostatni;
Ostatni
11 22
33
NIL
TMP
NIL
Elem Czy
Elem^.Nastepny=NIL?
Czy Elem^.następny = NIL?
Ostatni
11 22
33
NIL
TMP
NIL
Elem
W tym miejscu trzeba wstawić
TMP, zamiast NIL
NIE! Więc idziemy dalej, tak długo, aż znajdziemy taki element...
Elem:=Elem^.Następny;
Ostatni
11 22
33
NIL
TMP
NIL
Elem Czy
Elem^.Nastepny=NIL?
Czy Elem^.następny = NIL?
TAK! Mamy miejsce do wstawienia TMP!!
Ostatni
11 22 33
TMP
NIL
Elem
Wstawiamy więc:
Elem^.Następny:=Tmp;
Ostatni
11 22 33
NIL
Zmienne Elem i Tmp nie będą już potrzebne do rozwiązania zadania. Tak wygląda gotowa kolejka FIFO.
Usuwanie elementu z kolejki FIFO:
Ponieważ jest to kolejka, usuwanie elementów dopuszczalne jest tylko na końcu kolejki (w miejscu wskazanym przez
„Ostatni”). Sprawa jest banalnie prosta:
Ostatni
11 22 33
NIL
TMP
var Tmp: TwskaznikDoRekordu;
Tmp:=Ostatni^.Następny;
Ostatni 11 22 33
NIL
TMP
SMIECI Ostatni^.Następny:=NIL;
Dispose(Ostatni);
Ostatni
22 33
NIL
TMP
Ostatni:=Tmp;
Ostatni
22 33
NIL
Zmienna Tmp nie jest już potrzebna do wykonania zadania.
Usuwanie pozostałych elementów przebiega analogicznie.
II. ZADANIA
1. Napisać procedury i/lub funkcje służące do wykonywania operacji wstawiania nowego elementu i usuwania elementu ze stosu:
ELEMENT NA WIERZCHOLKU
Element 2
Element 3
DÓL Wierzcholek
NIL
2. Napisać procedury i/lub funkcje służące do wykonywania operacji wstawiania nowego elementu i usuwania elementu z „Odwróconego” stosu. DODAWANIE I USUWANIE ELEMENTÓW ZACHODZI NA WIERZCHOŁKU, a więc w miejscu najbardziej odległym od wskaźnika „DÓŁ” i najbliższemu „NIL”. Zwrócić uwagę na
nieefektywność takiej struktury (jest to przykład czysto dydaktyczny; takie struktury z uwagi na nieefektywność nie są stosowane lub stosowane są nadzwyczaj rzadko).
ELEMENT NA WIERZCHOLKU
Element 2
Element 3
DÓL DÓL
NIL
3. Napisać procedury i/lub funkcje służące do wykonywania operacji wstawiania nowego elementu i usuwania elementu z kolejki FIFO:
Ostatni
22 33
NIL
4. Napisać procedury i/lub funkcje służące do wykonywania operacji wstawiania nowego elementu i usuwania elementu z innego rodzaju kolejki FIFO:
Pierwszy
11 22
NIL
Dodawanie nowych danych odbywa się w miejscu wskazanym przez wskaźnik Pierwszy, usuwanie zaś – przy elemencie najbliższym NIL (a więc najbardziej odległym od Pierwszy):
33 Pierwszy
11 22
NIL
Kolejka FIFO z dołączonym pierwszym elementem „33”.
Przy usuwaniu, zostanie usunięty element „22”.