Sld 6.Tabl.Listy.Dec.2012.ppt
- Количество слайдов: 28
Sld 6. 1. Podstawowe struktury danych Od wyboru właściwej struktury danych może zależeć szybkość działania programu, możność jego łatwej modyfikacji, czytelność zapisu algorytmów. Typy struktur danych • • Tablice Listy Stosy Kolejki Sterty Drzewa Sieci
Sld 6. 2. Tablica • Tablica - to kontener danych dostępnych, w którym poszczególne komórki dostępne są za pomocą kluczy, które najczęściej przyjmują wartości numeryczne. • Rozmiar tablicy jest albo ustalony z góry – tablice statyczne, albo może się zmieniać w trakcie wykonywania programu- tablice dynamiczne. • Praktycznie wszystkie języki programowania obsługują tablice – jedynie w niektórych językach funkcyjnych zamiast tablic używane są listy. • W matematyce odpowiednikiem tablicy jednowymiarowej jest ciąg, a tablicy dwuwymiarowej - macierz.
Sld 6. 3. Tablice • Tablice są strukturami o bezpośrednim dostępie. • Tablice są najprostszymi strukturami danych. Grupują dane skalarne lub struktury danych tego samego typu. • Tablice są strukturami statycznymi, ich wielkość jest określana w programie za pomocą stałych i nie może być zmieniana w czasie jego wykonania. • Tablice są regularnymi strukturami o pewnej skończonej liczbie wymiarów. Położenie elementów w tablicy jest określane indeksami, których wartości mieszczą się w zakresie danego wymiaru. • Najprostszą tablicą jest tablica jednowymiarowa, nazywana też wektorem, o elementach indeksowanych liczbami całkowitymi z przedziału [l, r]. • Elementy tablicy dwuwymiarowej są określane parą indeksów całkowitych z przedziałów [lw, rw] x [lk, rk]. w – to liczba wierszy, k – to liczba kolumn. • Elementy tablicy trójwymiarowej są indeksowane trójkami indeksów całkowitych itd. • Najmniejsze wartości indeksów są zwykle równe 0 lub 1. W pierwszym przypadku liczba wszystkich wartości indeksów dla danego wymiaru jest o jeden większa niż górna wartość indeksu, w drugim przypadku jest równa górnej wartości indeksu.
Sld 6. 4. Adres elementu tablicy w pamięci • Tablice są strukturami o bezpośrednim dostępie. • Dla danych wartości indeksu można w prosty sposób wyznaczyć adres elementu tablicy w pamięci. • W przypadku tablicy dwuwymiarowej, adres elementu nie zależy od liczby wierszy. • Jeśli tablica ma k kolumn, to formuła przyjmie postać p. Tab[i, j] = p. Tab + (i. k + j), p. Tab - to adres początku obszaru pamięci, w którym jest zapisana tablica, - rozmiar elementu tablicy.
Sld 6. 5. Tablice w C/C++ deklarowane są w następujący sposób: • int tablica[6]; //tablica jednowymiarowa // "int" oznacza typ (int to liczba całkowita), "tablica" nazwę tablicy a "6" wielkość tablicy (ilość elementów) • int tablica 2[6][6]; //tablica dwuwymiarowa • int tablica 3[7][7][7]; //tablica trójwymiarowa i tak dalej Przy deklaracji wielkości tablicy użyte mogą zostać tylko liczby naturalne (bez zera) • const int wielkosc= 6; • int tablica 3[2. 5]; //nieprawidłowe, została podana liczba niecałkowita jako wielkość
Sld 6. 6. Tablice w C/C++ Odnoszenie się do elementów tablicy wymaga podania indeksu, z uwzględnieniem indeksowania od zera: • • int tablica[3]; tablica[0]=1; //pierwszy element tablica[1]=2; //drugi element tablica[2]=3; //trzeci i ostatni element Pobieranie wartości działa tak samo • int pierwszy_element= tablica[0]; • int drugi_element= tablica[1]; • //i tak dalej Maksymalny element do którego mamy dostęp - to wielkość tablicy. Próba pobrania/ustawienia wartości elementu poza tym zakresem spowoduje błąd.
Sld 6. 7. Listy • • Listy są strukturami danych grupującymi dane tego samego typu. W odróżnieniu od tablic, listy są strukturami dynamicznymi zarządzanymi w trakcie wykonania programu.
Sld 6. 8. Typy list • • • Listy jednokierunkowe Listy cykliczne Listy dwukierunkowe
Sld 6. 9. Lista jednokierunkowa jest oszczędną pamięciowo strukturą danych, pozwalającą grupować dowolną - ograniczoną tylko ilością dostępnej pamięci - liczbę elementów: liczb, znaków, rekordów. Struktura elementu listy ma dwa główne pola: pole z danymi oraz pole wskaźnika do takiej samej struktury. Lista jest ciągiem elementów, w których wskaźnik wskazuje na następny element listy. Do budowy listy jednokierunkowej używane są dwa typy „komórek" pamięci. Pierwszy jest rekordem, zawierającym dwa wskaźniki: do początku i do końca listy. Drugi typ komórek zawiera pole wartości i wskaźnik na następny element listy. W IBM PC zmienna wskaźnikowa zajmuje 4 lub 8 bajtów w zależności od użytego modelu pamięci. Pola: głowa, ogon i następny są wskaźnikami, natomiast wartość może być czymkolwiek - liczbą, znakiem, rekordem etc. Typy rekordów używanych podczas programowania list INFO głowa ogon ELEMENT wartość następny
Sld 6. 10. Przykład listy jednokierunkowej INFO głowa ogon ELEMENT 1 wartość1 następny ELEMENT 2 wartość2 następny ELEMENT 3 wartość3 NULL Pole głowa struktury informacyjnej zawiera adres, pod którym w pamięci komputera jest zapamiętany pierwszy rekord (ELEMENT 1). Pole ogon struktury informacyjnej zawiera adres, pod którym w pamięci komputera jest zapamiętany ostatni rekord (ELEMENT 3). Pola te służą do przeglądania elementów listy i do dołączania nowych. Miejsce zakończenia listy zaznaczamy poprzez wartość specjalną NULL. Wartość NULL jest czasem zaznaczana jako 0000 h - adres pamięci równy zero. W ogólnym przypadku NULL nie jest równa zeru -jest to pewien adres, na który na pewno żadna zmienna nie wskazuje (taka jest ogólna idea wskaźnika NULL).
Sld 6. 11. Przykład procedury przeglądania elementy listy w poszukiwaniu wartości JACEK (komórka informacyjna nazywa się info): adres_tmp=info. głowa dopóki (adres_tmp!=NULL) wykonuj { jeśli (adres tmp. wartość== JACEK ) to { Wypisz , , Znalazłem poszukiwany element" opuść procedurę } w przeciwnym przypadku adres tmp=adres__tmp. następny } Wypisz „Nie znalazłem poszukiwanego elementu"
Sld 6. 12. Tworzenie listy jednokierunkowej 1. Dołączania elementów do listy. 2. Dołączanie elementu listy z sortowaniem. 3. Usunięcie elementu listy. 4. Fuzja dwóch list.
Sld 6. 13. Analiza przypadków wstawiania nowego elementu do listy Nowy element może zostać wstawiony na początek (a), koniec (b) listy, jak i również gdzieś w jej środku (c). W każdym z tych przypadków w istniejącej liście trzeba znaleźć miejsce wstawienia, tzn. zapamiętać dwa wskaźniki: element, przed który mamy wstawić nową komórkę i element, za którym mamy to zrobić.
Sld 6. 14. Dołączanie elementu listy z sortowaniem 1. Poszukiwanie miejsca wstawienia 2. Dołączenie elementu głowa ogon wartość następny wartość NULL
Sld 6. 15. Usunięcie elementu listy głowa ogon wartość następny wartość NULL Jeśli na liście jest tylko jeden element, to modyfikacji ulegnie zarówno pole głowa jak i pole ogon struktury informacyjnej. Oba te pola, po uprzednim usunięciu jedynego elementu listy, zostaną zainicjowane wartością NULL. Gdy lista zawiera więcej niż jeden element należy odszukać przedostatni jej element, aby móc zmodyfikować wskaźnik ogon struktury informacyjnej. Znajomość przedostatniego elementu listy umożliwi nam łatwe usunięcie ostatniego elementu listy.
Sld 6. 16. Fuzja dwóch list 1. Listy L 1 i L 2 są posortowane. L 1 = 1, 3, 9; L 2 = 2, 3, 14. 2. Wynik: lista L 3 posortowana: L 3 = 1, 2, 3, 3, 9, 14
Sld 6. 17. Wady i zalety listy jednokierunkowej Wady: 1. Nienaturalny dostęp do elementów 2. Niełatwe sortowanie Zalety : • Małe zużycie pamięci • Elastyczność
Sld 6. 18. Listy z kilkoma kryteriami sortowania Osobno formujemy 1. Nieposortowaną bazę danych 2. Tablice wskaźników. Zawierają rekordy informacyjne, których pola głowa i ogon umożliwiają dostęp do osobnych list wskaźników. 3. Osobne listy wskaźników. Każda z tych list jest posortowana wg innego kryterium sortowania.
Sld 6. 19. Rekordy o skomplikowanej strukturze 1. Obok listy danych dysponujemy kilkoma listami wskaźników do nich. List tych jest tyle, ile sobie zażyczymy kryteriów sortowania. 2. Podczas sortowania list wskaźników dane nie są w ogóle „ruszane" - przemieszczaniu w listach będą ulegały wyłącznie same wskaźniki! Przykład. struct { char imie; char nazwisko; int wiek; int kod_pracownika }
Sld 6. 20. Tablicowa implementacja list Przyjmujemy, że i-temu indeksowi tablicy odpowiada i-ty element listy. Trzeba się umówić, ile maksymalnie elementów zechcemy zapamiętać na liście. Konieczne jest wybranie jakiejś zmiennej do zapamiętywania aktualnej ilości elementów wstawionych wcześniej do listy. Przykład. Tablicowa implementacja listy 5 -elementowej złożonej z elementów 4, 6, 1, -5, 12.
Sld 6. 21. Metoda tablic równoległych Tablica rekordów składa się z pola 1. informacyjnego info i 2. pola typu całkowitego następny, które służy do odszukiwania elementu „następnego" na liście.
Sld 6. 22. Przykład tablic równoległych Komórki nr 0 i nr 1 są zarezerwowane odpowiednio na: wskaźnik początku listy i znacznik końca. Należy to rozumieć w ten sposób, że LI [0] zawierający liczbę 5 informuje nas, iż dane[5] są pierwszym rekordem na liście. Rekord następny jest Ll[5]=2 co oznacza, że drugim rekordem na liście danych jest dane[2]. Postępując tak dalej odtwarzamy całą listę: dane[5], dane[2], dane[3], dane[4] - jest to lista posortowana alfabetycznie wg nazwisk. Skąd jednak wiemy, że dane[3] jest ostatnim rekordem na liście? Otóż LI[4] zawiera 1, co stanowi wg naszej umowy znacznik końca listy. L 2 jest listą posortowana wg kodów 2 -cyfrowych, a L 3 - wg zarobków.
Sld 6. 23. Lista dwukierunkowa - komórka robocza zawiera wskaźniki do elementów: • poprzedniego i następnego: • pierwsza komórka w liście nie posiada swojego poprzednika; zaznaczamy to wpisując wartość NULL do pola poprzedni; • ostatnia komórka znajdująca się w liście nie posiada swojego następnika; zaznaczamy to wpisując wartość NULL do pola następny. Lista dwukierunkowa jest dość „kosztowna", jeśli chodzi o zajętość pamięci, tym niemniej czasami ważniejsza jest szybkość działania od ewentualnych strat pamięci.
Sld 6. 24. Usuwanie danych z listy dwukierunkowej Do prawidłowego wykonania operacji Usuwanie danych (elementu p z listy) niezbędna jest znajomość wskaźników przed i po, wskazujących odpowiednio na komórki poprzednią i następną. W przypadku listy dwukierunkowej w komórce wskazywanej przez p te dwie informacje już się znajdują i wystarczy tylko po nie sięgnąć.
Sld 6. 25. Lista cykliczna - jest zamknięta w pierścień: wskaźnik ostatniego elementu wskazuje „pierwszy" element. Pewien element określany jest jako „pierwszy" raczej umownie i służy wyłącznie do wejścia do wskaźników listy cyklicznej.
Sld 6. 26. Lista hierarchiczna o skomplikowanej strukturze (T, Ted, (T, Fred, (T, Adam, (F)), (T, Mary, (F), (T, Eva, (F)))))
Sld 6. 27. Lista (sieć) o skomplikowanej strukturze
Sld 6.Tabl.Listy.Dec.2012.ppt