[tutorial]
Dynamiczne zarządzanie danymi w programach
Jeśli chcesz dynamicznie zarządzać danymi, warto zapoznać się z takimi strukturami jak:
[li]stos[/li]
[li]lista jednokierunkowa[/li]
[li]lista dwukierunkowa[/li]
[li]drzewo binarne[/li]
Jeśli chcesz dobrze zrozumieć programowanie dynamiczne, powinieneś poczytać o tych strukturach danych i zaimplementować każdą z nich.
Jak zaimplementować listę jednokierunkową
Tworzymy strukturę do przechowywania danych
Aby utworzyć listę jednokierunkową, musimy utworzyć strukturę przechowującą jedną paczkę danych, która ma być powielana
n razy.
struct OsobaST
{
string imie;
string nazwisko;
string telefon;
};
Załóżmy, że to jest nasza struktura bazowa. Aby utworzyć z tego listę jednokierunkową, musimy dodać do niej pole, które będzie wskazywało na jego następnika. Tak więc struktura dla listy jednokierunkowej może wyglądać np. tak:
struct OsobaST
{
string imie;
string nazwisko;
string telefon;
OsobaST * nastepna;
};
Dodane pole to wskaźnik na następną osobę. Jeśli osoba istnieje wskaźnik zmiennej
nastepna musi być różny od NULL (
NULL to stała równa 0).
Tworzymy początek listy jednokierunkowej
Obecnie mamy utworzoną strukturę do przechowywania danych, jednak nie mamy jeszcze miejsca wskazującego na początek listy jednokierunkowej.
Utworzenie początku listy jednokierunkowej jest bardzo proste - wystarczy w programie napisać coś takiego:
OsobaST * poczatek = NULL;
Pamiętaj, że wskaźnik utworzony ma
zawsze losową wartość i należy go zawsze ustawić, najlepiej w miejscu deklaracji wskaźnika.
Dodawanie elementu do listy jednokierunkowej
Jeśli chcesz dodać teraz element do listy jednokierunkowej, musisz dynamicznie zarezerwować pamięć, i dodać go do kolejki. Jeśli
poczatek jest równy
NULL, to nowo zarezerwowany obszar pamięci przypisujesz do zmiennej
poczatek. W przeciwnym wypadku przechodzisz element po elemencie pętlą while (lub inną) i szukasz ostatniego elementu kolejki. Ostatni element kolejki to ten, którego wskaźnik
nastepna jest równy
NULL. Następnie przypisujesz nową osobę do ostatniej znalezionej.
OsobaST * nowa = new OsobaST;
nowa->nastepna = NULL;
if( poczatek == NULL )
{
poczatek = nowa;
} else
{
OsobaST * szukajOstatniej = poczatek;
while( szukajOstatniej->nastepna != NULL )
{
szukajOstatniej = szukajOstatniej->nastepna;
}
szukajOstatniej->nastepna = nowa;
}
Usuwanie elementów i inne operacje na liście jednokierunkowej
Pozostałe operacje są równie proste jak wstawianie nowych elementów do kolejki. Polecam nie szukać gotowego rozwiązania tylko powalczyć kilka dni nad samodzielnym utworzeniem systemu do usuwania elementów i innych operacji - to pomoże Ci lepiej zrozumieć wskaźniki i ich wykorzystywanie.
[/tutorial]