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/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)
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/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
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/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
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/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
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
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
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
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
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
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
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)
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
...
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)