• Nie Znaleziono Wyników

Programowanie i struktury danych Programowanie i struktury danych

N/A
N/A
Protected

Academic year: 2021

Share "Programowanie i struktury danych Programowanie i struktury danych"

Copied!
35
0
0

Pełen tekst

(1)

Programowanie i struktury danych Programowanie i struktury danych

Wykład 6 Wykład 6

Dr Piotr Cybula <piotr.cybula@wmii.uni.lodz.pl>

Dr Piotr Cybula <piotr.cybula@wmii.uni.lodz.pl>

(2)

2/2/3535 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Metody krytyczne dla list Metody krytyczne dla list

ze względu na organizację nieciągłą w pamięci (obecność pól wskaźnikowych) następujące metody muszą być zaimplementowane dla listy łączonej:

destrukcja/czyszczenie listy (wielokrotne usuwanie pierwszego węzła aż do uzyskania listy pustej) – destruktor domyślny nie zwalnia pamięci

konstrukcja kopiująca (alokacja tylu nowych węzłów ile jest w liście źródłowej z kopiowaniem danych) – domyślny kontruktor kopiujący kopiuje jedynie adres węzła pierwszego (tzw. płytka kopia z

współdzieleniem węzłów między listami)

przypisanie list (dealokacja zbędnych węzłów/alokacja dodatkowych

węzłów z kopiowaniem danych z listy źródłowej) - domyślny operator

przypisania kopiuje jedynie adres węzła pierwszego gubiąc dostęp do

poprzedniej listy (płytka kopia, wyciek pamięci)

(3)

Operacje grupowe na listach Operacje grupowe na listach

operacje na elementach listy łączonej nie wymagają realokacji pamięci (modyfikacje pól wskaźnikowych zmieniające kolejność węzłów):

odwrócenie listy (zmiana relacji między węzłami poprzez zmianę adresu węzła pierwszego i adresów węzła następnego)

usuwanie fragmentu listy (ominięcie fragmentu poprzez zmianę adresu węzła następnego w węźle poprzedzającym fragment i zwolnienie

pamięci)

przenoszenie fragmentu wewnątrz listy lub między listami (ominięcie fragmentu poprzez zmianę adresu węzła następnego w węźle

poprzedzającym fragment i zmianę adresów węzła następnego w nowym

węźle poprzedzającym oraz w ostatnim węźle fragmentu)

(4)

4/4/3535 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Odwrócenie listy Odwrócenie listy

(1) powołujemy dwa pomocnicze wskaźniki ustawione na sąsiednich węzłach pred i succ (zakładamy, że wskaźniki next w węzłach poprzedzających wskazywany przez succ są już

odwrócone, succ jest niepusty, w przeciwnym razie przerywamy operację, pred może być pusty w pierwszym kroku, head wskazuje na węzeł poprzedzający succ)

A next

C head

B

next

(5)

Odwrócenie listy Odwrócenie listy

(1) powołujemy dwa pomocnicze wskaźniki ustawione na sąsiednich węzłach pred i succ (zakładamy, że wskaźniki next w węzłach poprzedzających wskazywany przez succ są już

odwrócone, succ jest niepusty, w przeciwnym razie przerywamy operację, pred może być pusty w pierwszym kroku, head wskazuje na węzeł poprzedzający succ)

pred succ

(6)

6/6/3535 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Odwrócenie listy Odwrócenie listy

(1) powołujemy dwa pomocnicze wskaźniki ustawione na sąsiednich węzłach pred i succ (zakładamy, że wskaźniki next w węzłach poprzedzających wskazywany przez succ są już

odwrócone, succ jest niepusty, w przeciwnym razie przerywamy operację, pred może być pusty w pierwszym kroku, head wskazuje na węzeł poprzedzający succ)

(2) ustawiamy wskaźnik pomocniczy after na węźle następującym za wskazywanym przez succ

A C

head

B next

pred succ

(7)

Odwrócenie listy Odwrócenie listy

(1) powołujemy dwa pomocnicze wskaźniki ustawione na sąsiednich węzłach pred i succ (zakładamy, że wskaźniki next w węzłach poprzedzających wskazywany przez succ są już

odwrócone, succ jest niepusty, w przeciwnym razie przerywamy operację, pred może być pusty w pierwszym kroku, head wskazuje na węzeł poprzedzający succ)

(2) ustawiamy wskaźnik pomocniczy after na węźle następującym za wskazywanym przez succ

pred succ after

(8)

8/8/3535 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Odwrócenie listy Odwrócenie listy

(1) powołujemy dwa pomocnicze wskaźniki ustawione na sąsiednich węzłach pred i succ (zakładamy, że wskaźniki next w węzłach poprzedzających wskazywany przez succ są już

odwrócone, succ jest niepusty, w przeciwnym razie przerywamy operację, pred może być pusty w pierwszym kroku, head wskazuje na węzeł poprzedzający succ)

(2) ustawiamy wskaźnik pomocniczy after na węźle następującym za wskazywanym przez succ (3) zmieniamy wskaźnik next w węźle wskazywanym przez succ na adres pred

A C

head

B next

pred succ after

(9)

Odwrócenie listy Odwrócenie listy

(1) powołujemy dwa pomocnicze wskaźniki ustawione na sąsiednich węzłach pred i succ (zakładamy, że wskaźniki next w węzłach poprzedzających wskazywany przez succ są już

odwrócone, succ jest niepusty, w przeciwnym razie przerywamy operację, pred może być pusty w pierwszym kroku, head wskazuje na węzeł poprzedzający succ)

(2) ustawiamy wskaźnik pomocniczy after na węźle następującym za wskazywanym przez succ (3) zmieniamy wskaźnik next w węźle wskazywanym przez succ na adres pred

pred succ after

(10)

1010/35/35 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Odwrócenie listy Odwrócenie listy

(1) powołujemy dwa pomocnicze wskaźniki ustawione na sąsiednich węzłach pred i succ (zakładamy, że wskaźniki next w węzłach poprzedzających wskazywany przez succ są już

odwrócone, succ jest niepusty, w przeciwnym razie przerywamy operację, pred może być pusty w pierwszym kroku, head wskazuje na węzeł poprzedzający succ)

(2) ustawiamy wskaźnik pomocniczy after na węźle następującym za wskazywanym przez succ (3) zmieniamy wskaźnik next w węźle wskazywanym przez succ na adres pred

(4) przestawiamy wskaźniki head i pred na węzeł wskazywany przez succ

A C

head

B next

pred succ after

(11)

Odwrócenie listy Odwrócenie listy

(1) powołujemy dwa pomocnicze wskaźniki ustawione na sąsiednich węzłach pred i succ (zakładamy, że wskaźniki next w węzłach poprzedzających wskazywany przez succ są już

odwrócone, succ jest niepusty, w przeciwnym razie przerywamy operację, pred może być pusty w pierwszym kroku, head wskazuje na węzeł poprzedzający succ)

(2) ustawiamy wskaźnik pomocniczy after na węźle następującym za wskazywanym przez succ (3) zmieniamy wskaźnik next w węźle wskazywanym przez succ na adres pred

(4) przestawiamy wskaźniki head i pred na węzeł wskazywany przez succ

pred succ after

(12)

1212/35/35 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Odwrócenie listy Odwrócenie listy

(1) powołujemy dwa pomocnicze wskaźniki ustawione na sąsiednich węzłach pred i succ (zakładamy, że wskaźniki next w węzłach poprzedzających wskazywany przez succ są już

odwrócone, succ jest niepusty, w przeciwnym razie przerywamy operację, pred może być pusty w pierwszym kroku, head wskazuje na węzeł poprzedzający succ)

(2) ustawiamy wskaźnik pomocniczy after na węźle następującym za wskazywanym przez succ (3) zmieniamy wskaźnik next w węźle wskazywanym przez succ na adres pred

(4) przestawiamy wskaźniki head i pred na węzeł wskazywany przez succ (5) przestawiamy wskaźnik succ na węzeł wskazywany przez after

A C

head

B next

pred succ after

(13)

Odwrócenie listy Odwrócenie listy

(1) powołujemy dwa pomocnicze wskaźniki ustawione na sąsiednich węzłach pred i succ (zakładamy, że wskaźniki next w węzłach poprzedzających wskazywany przez succ są już

odwrócone, succ jest niepusty, w przeciwnym razie przerywamy operację, pred może być pusty w pierwszym kroku, head wskazuje na węzeł poprzedzający succ)

(2) ustawiamy wskaźnik pomocniczy after na węźle następującym za wskazywanym przez succ (3) zmieniamy wskaźnik next w węźle wskazywanym przez succ na adres pred

(4) przestawiamy wskaźniki head i pred na węzeł wskazywany przez succ (5) przestawiamy wskaźnik succ na węzeł wskazywany przez after

(6) jeżeli succ nie jest pusty wracamy do kroku (2)

pred succ

(14)

1414/35/35 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Odwrócenie listy Odwrócenie listy

(1) powołujemy dwa pomocnicze wskaźniki ustawione na sąsiednich węzłach pred i succ (zakładamy, że wskaźniki next w węzłach poprzedzających wskazywany przez succ są już

odwrócone, succ jest niepusty, w przeciwnym razie przerywamy operację, pred może być pusty w pierwszym kroku, head wskazuje na węzeł poprzedzający succ)

(2) ustawiamy wskaźnik pomocniczy after na węźle następującym za wskazywanym przez succ (3) zmieniamy wskaźnik next w węźle wskazywanym przez succ na adres pred

(4) przestawiamy wskaźniki head i pred na węzeł wskazywany przez succ (5) przestawiamy wskaźnik succ na węzeł wskazywany przez after

(6) jeżeli succ nie jest pusty wracamy do kroku (2)

A C

head

B next

pred succ

next

(15)

Odwrócenie listy Odwrócenie listy

(1) powołujemy dwa pomocnicze wskaźniki ustawione na sąsiednich węzłach pred i succ (zakładamy, że wskaźniki next w węzłach poprzedzających wskazywany przez succ są już

odwrócone, succ jest niepusty, w przeciwnym razie przerywamy operację, pred może być pusty w pierwszym kroku, head wskazuje na węzeł poprzedzający succ)

(2) ustawiamy wskaźnik pomocniczy after na węźle następującym za wskazywanym przez succ (3) zmieniamy wskaźnik next w węźle wskazywanym przez succ na adres pred

(4) przestawiamy wskaźniki head i pred na węzeł wskazywany przez succ (5) przestawiamy wskaźnik succ na węzeł wskazywany przez after

(6) jeżeli succ nie jest pusty wracamy do kroku (2)

(16)

1616/35/35 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Usuwanie grupy Usuwanie grupy

(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head) i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle poprzedzającym grupę, a succ na pierwszym węźle w grupie (w przeciwnym razie przerywamy operację)

A next

B C

head

next

B next

...

(17)

Usuwanie grupy Usuwanie grupy

(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head) i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle poprzedzającym grupę, a succ na pierwszym węźle w grupie (w przeciwnym razie przerywamy operację)

pred succ

(18)

1818/35/35 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Usuwanie grupy Usuwanie grupy

(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head) i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle poprzedzającym grupę, a succ na pierwszym węźle w grupie (w przeciwnym razie przerywamy operację)

(2) powołujemy dwa pomocnicze wskaźniki: end ustawiamy na succ, a after na adres następnego węzła za succ i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik end zatrzymał się na ostatnim węźle grupy, a after na pierwszym węźle za grupą (może być pusty)

A next

B C

head

next

B next

...

pred succ

(19)

Usuwanie grupy Usuwanie grupy

(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head) i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle poprzedzającym grupę, a succ na pierwszym węźle w grupie (w przeciwnym razie przerywamy operację)

(2) powołujemy dwa pomocnicze wskaźniki: end ustawiamy na succ, a after na adres następnego węzła za succ i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik end zatrzymał się na ostatnim węźle grupy, a after na pierwszym węźle za grupą (może być pusty)

pred succ end after

(20)

2020/35/35 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Usuwanie grupy Usuwanie grupy

(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head) i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle poprzedzającym grupę, a succ na pierwszym węźle w grupie (w przeciwnym razie przerywamy operację)

(2) powołujemy dwa pomocnicze wskaźniki: end ustawiamy na succ, a after na adres następnego węzła za succ i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik end zatrzymał się na ostatnim węźle grupy, a after na pierwszym węźle za grupą (może być pusty)

(3) ustawiamy dedykowany wskaźnik (killer) na węzeł wskazywany przez succ, a succ przestawiamy na after

A next

B C

head

next

B next

...

pred succ end after

(21)

Usuwanie grupy Usuwanie grupy

(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head) i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle poprzedzającym grupę, a succ na pierwszym węźle w grupie (w przeciwnym razie przerywamy operację)

(2) powołujemy dwa pomocnicze wskaźniki: end ustawiamy na succ, a after na adres następnego węzła za succ i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik end zatrzymał się na ostatnim węźle grupy, a after na pierwszym węźle za grupą (może być pusty)

(3) ustawiamy dedykowany wskaźnik (killer) na węzeł wskazywany przez succ, a succ przestawiamy na after

pred killer end succ

(22)

2222/35/35 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Usuwanie grupy Usuwanie grupy

(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head) i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle poprzedzającym grupę, a succ na pierwszym węźle w grupie (w przeciwnym razie przerywamy operację)

(2) powołujemy dwa pomocnicze wskaźniki: end ustawiamy na succ, a after na adres następnego węzła za succ i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik end zatrzymał się na ostatnim węźle grupy, a after na pierwszym węźle za grupą (może być pusty)

(3) ustawiamy dedykowany wskaźnik (killer) na węzeł wskazywany przez succ, a succ przestawiamy na after

(4) ustawiamy wskaźnik next węzła wskazywanego przez pred (lub wskaźnik head gdy pred jest pusty) na adres zapisany w succ

A next

B C

head

next

B next

...

pred killer end succ

(23)

Usuwanie grupy Usuwanie grupy

(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head) i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle poprzedzającym grupę, a succ na pierwszym węźle w grupie (w przeciwnym razie przerywamy operację)

(2) powołujemy dwa pomocnicze wskaźniki: end ustawiamy na succ, a after na adres następnego węzła za succ i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik end zatrzymał się na ostatnim węźle grupy, a after na pierwszym węźle za grupą (może być pusty)

(3) ustawiamy dedykowany wskaźnik (killer) na węzeł wskazywany przez succ, a succ przestawiamy na after

(4) ustawiamy wskaźnik next węzła wskazywanego przez pred (lub wskaźnik head gdy pred jest pusty) na adres zapisany w succ

pred killer end succ

(24)

2424/35/35 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Usuwanie grupy Usuwanie grupy

(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head) i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle poprzedzającym grupę, a succ na pierwszym węźle w grupie (w przeciwnym razie przerywamy operację)

(2) powołujemy dwa pomocnicze wskaźniki: end ustawiamy na succ, a after na adres następnego węzła za succ i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik end zatrzymał się na ostatnim węźle grupy, a after na pierwszym węźle za grupą (może być pusty)

(3) ustawiamy dedykowany wskaźnik (killer) na węzeł wskazywany przez succ, a succ przestawiamy na after

(4) ustawiamy wskaźnik next węzła wskazywanego przez pred (lub wskaźnik head gdy pred jest pusty) na adres zapisany w succ

(5) ustawiamy na pusty wskaźnik next w węźle wskazywanym przez end

A next

B C

head

next

B next

...

pred killer end succ

(25)

Usuwanie grupy Usuwanie grupy

(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head) i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle poprzedzającym grupę, a succ na pierwszym węźle w grupie (w przeciwnym razie przerywamy operację)

(2) powołujemy dwa pomocnicze wskaźniki: end ustawiamy na succ, a after na adres następnego węzła za succ i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik end zatrzymał się na ostatnim węźle grupy, a after na pierwszym węźle za grupą (może być pusty)

(3) ustawiamy dedykowany wskaźnik (killer) na węzeł wskazywany przez succ, a succ przestawiamy na after

(4) ustawiamy wskaźnik next węzła wskazywanego przez pred (lub wskaźnik head gdy pred jest pusty) na adres zapisany w succ

(5) ustawiamy na pusty wskaźnik next w węźle wskazywanym przez end

pred killer end succ

(26)

2626/35/35 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Usuwanie grupy Usuwanie grupy

(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head) i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle poprzedzającym grupę, a succ na pierwszym węźle w grupie (w przeciwnym razie przerywamy operację)

(2) powołujemy dwa pomocnicze wskaźniki: end ustawiamy na succ, a after na adres następnego węzła za succ i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik end zatrzymał się na ostatnim węźle grupy, a after na pierwszym węźle za grupą (może być pusty)

(3) ustawiamy dedykowany wskaźnik (killer) na węzeł wskazywany przez succ, a succ przestawiamy na after

(4) ustawiamy wskaźnik next węzła wskazywanego przez pred (lub wskaźnik head gdy pred jest pusty) na adres zapisany w succ

(5) ustawiamy na pusty wskaźnik next w węźle wskazywanym przez end

(6) zwalniamy wszystkie węzły począwszy od wskazywanego przez killer aż do end (tworzące niezależną listę)

A next

B C

head

next

... B

pred killer end succ

(27)

Usuwanie grupy Usuwanie grupy

(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head) i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle poprzedzającym grupę, a succ na pierwszym węźle w grupie (w przeciwnym razie przerywamy operację)

(2) powołujemy dwa pomocnicze wskaźniki: end ustawiamy na succ, a after na adres następnego węzła za succ i przechodzimy nimi w kierunku końca listy tak, aby wskaźnik end zatrzymał się na ostatnim węźle grupy, a after na pierwszym węźle za grupą (może być pusty)

(3) ustawiamy dedykowany wskaźnik (killer) na węzeł wskazywany przez succ, a succ przestawiamy na after

(4) ustawiamy wskaźnik next węzła wskazywanego przez pred (lub wskaźnik head gdy pred jest pusty) na adres zapisany w succ

(5) ustawiamy na pusty wskaźnik next w węźle wskazywanym przez end

(6) zwalniamy wszystkie węzły począwszy od wskazywanego przez killer aż do end (tworzące niezależną listę)

pred succ

(28)

2828/35/35 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Przenoszenie grupy Przenoszenie grupy

(1) wykonujemy pierwszych 5 kroków algorytmu usuwania powołując wskaźnik begin w miejsce wskaźnika killer (przestawiąjąc wskaźnik tail na adres zapisany w pred, gdy tail wskazuje na węzeł wskazywany przez end)

A next

B C

head

next

... B

pred begin end succ

tail

(29)

Przenoszenie grupy Przenoszenie grupy

(1) wykonujemy pierwszych 5 kroków algorytmu usuwania powołując wskaźnik begin w miejsce wskaźnika killer (przestawiąjąc wskaźnik tail na adres zapisany w pred, gdy tail wskazuje na węzeł wskazywany przez end)

(2) lista begin-end jest niezależna i może być bezpiecznie przeniesiona:

B next

... B pred

begin end

succ

(30)

3030/35/35 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Przenoszenie grupy Przenoszenie grupy

(1) wykonujemy pierwszych 5 kroków algorytmu usuwania powołując wskaźnik begin w miejsce wskaźnika killer (przestawiąjąc wskaźnik tail na adres zapisany w pred, gdy tail wskazuje na węzeł wskazywany przez end)

(2) lista begin-end jest niezależna i może być bezpiecznie przeniesiona:

(a) pomiędzy dowolną parę węzłów pred i succ (wskaźnik next z węzła pred przestawiamy na begin, a wskażnik next z węzła end przestawiamy na succ)

A next

B

C

head next

... B pred

begin end

succ tail

(31)

Przenoszenie grupy Przenoszenie grupy

(1) wykonujemy pierwszych 5 kroków algorytmu usuwania powołując wskaźnik begin w miejsce wskaźnika killer (przestawiąjąc wskaźnik tail na adres zapisany w pred, gdy tail wskazuje na węzeł wskazywany przez end)

(2) lista begin-end jest niezależna i może być bezpiecznie przeniesiona:

(a) pomiędzy dowolną parę węzłów pred i succ (wskaźnik next z węzła pred przestawiamy na begin, a wskażnik next z węzła end przestawiamy na succ)

B next

... B pred

begin end

next succ

(32)

3232/35/35 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Przenoszenie grupy Przenoszenie grupy

(1) wykonujemy pierwszych 5 kroków algorytmu usuwania powołując wskaźnik begin w miejsce wskaźnika killer (przestawiąjąc wskaźnik tail na adres zapisany w pred, gdy tail wskazuje na węzeł wskazywany przez end)

(2) lista begin-end jest niezależna i może być bezpiecznie przeniesiona:

(a) pomiędzy dowolną parę węzłów pred i succ (wskaźnik next z węzła pred przestawiamy na begin, a wskażnik next z węzła end przestawiamy na succ)

(b) na początek listy (wskaźnik next z węzła end przestawiamy na head, a następnie wskaźnik head na begin)

A next B

C head

next

... B

begin end

tail

(33)

Przenoszenie grupy Przenoszenie grupy

(1) wykonujemy pierwszych 5 kroków algorytmu usuwania powołując wskaźnik begin w miejsce wskaźnika killer (przestawiąjąc wskaźnik tail na adres zapisany w pred, gdy tail wskazuje na węzeł wskazywany przez end)

(2) lista begin-end jest niezależna i może być bezpiecznie przeniesiona:

(a) pomiędzy dowolną parę węzłów pred i succ (wskaźnik next z węzła pred przestawiamy na begin, a wskażnik next z węzła end przestawiamy na succ)

(b) na początek listy (wskaźnik next z węzła end przestawiamy na head, a następnie wskaźnik head na begin)

B next

... B

begin end

next

(34)

3434/35/35 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki

Przenoszenie grupy Przenoszenie grupy

(1) wykonujemy pierwszych 5 kroków algorytmu usuwania powołując wskaźnik begin w miejsce wskaźnika killer (przestawiąjąc wskaźnik tail na adres zapisany w pred, gdy tail wskazuje na węzeł wskazywany przez end)

(2) lista begin-end jest niezależna i może być bezpiecznie przeniesiona:

(a) pomiędzy dowolną parę węzłów pred i succ (wskaźnik next z węzła pred przestawiamy na begin, a wskażnik next z węzła end przestawiamy na succ)

(b) na początek listy (wskaźnik next z węzła end przestawiamy na head, a następnie wskaźnik head na begin)

(c) na koniec listy (wskaźnik next z węzła tail przestawiamy na begin, a następnie wskaźnik tail na end)

A next

B

C head

next

... B

begin end

tail

(35)

Przenoszenie grupy Przenoszenie grupy

(1) wykonujemy pierwszych 5 kroków algorytmu usuwania powołując wskaźnik begin w miejsce wskaźnika killer (przestawiąjąc wskaźnik tail na adres zapisany w pred, gdy tail wskazuje na węzeł wskazywany przez end)

(2) lista begin-end jest niezależna i może być bezpiecznie przeniesiona:

(a) pomiędzy dowolną parę węzłów pred i succ (wskaźnik next z węzła pred przestawiamy na begin, a wskażnik next z węzła end przestawiamy na succ)

(b) na początek listy (wskaźnik next z węzła end przestawiamy na head, a następnie wskaźnik head na begin)

(c) na koniec listy (wskaźnik next z węzła tail przestawiamy na begin, a następnie wskaźnik tail na end)

B next

... B

begin end

Cytaty

Powiązane dokumenty

Każda linia w tych plikach zawiera dane pojedynczego studenta rozdzielone pojedynczymi spacjami w następującej kolejności: nazwisko, imię (imiona), numer indeksu

• w przypadku gdy dane osoby są poprawne, a niepoprawny jest jej numer PESEL (czyli nieprawidłowość wystąpiła w pliku pesele.txt), osoba ta nie jest wpisywana do

● szablony pozwalają na wielokrotne wykorzystanie istniejącego kodu źródłowego struktury danych dla wielu wersji tej struktury z tym samym interfejsem, ale różnymi typami

● strumienie wejścia/wyjścia: iostream, fstream, sstream, iomanip. ●

(3) przestawiamy wskaźnik next w węźle wskazywanym przez pred (lub wskaźnik head gdy pred jest pusty) oraz wskaźnik prev w węźle wskazywanym przez succ (lub wskaźnik tail gdy

Powiemy, że algorytm Alg działający w strukturze danych S jest całkowicie poprawny ze względu na specyfikację &lt;wp,wk&gt; wttw dla wszystkich danych w strukturze S

Problem Dany jest ciąg rosnący e[1],..,e[n] oraz element x pewnej przestrzeni liniowo uporządkowanej &lt;E, &gt;. Następnie porównujemy x z kolejnymi elementami ciągu

(3) Jeżeli tak otrzymane drzewo nie jest częściowo uporządkowane, to przechodząc wzdłuż drogi od liścia x do korzenia, poprawić etykiety zamieniając etykietę ojca z