Programowanie i struktury danych Programowanie i struktury danych
Wykład 10 Wykład 10
Dr Piotr Cybula <piotr.cybula@wmii.uni.lodz.pl>
Dr Piotr Cybula <piotr.cybula@wmii.uni.lodz.pl>
2/2/2020 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki
Struktury wielokrotnie czone łą Struktury wielokrotnie czone łą
●
lista łączona dwukierunkowa:
●
adres węzła pierwszego i ostatniego
●
każdy węzeł posiada adres węzła następnego (pusty dla ostatniego) i poprzedniego (pusty dla pierwszego)
●
drzewo binarne:
●
adres węzła głównego (korzenia)
●
każdy węzeł posiada adresy węzłów głównych lewej i prawej gałęzi (puste w węzłach ostatniego poziomu, tzw. liściach) oraz węzła nadrzędnego
●
drzewo zbalansowane:
●
adres węzła głównego (korzenia)
●
każdy węzeł posiada przynajmniej dwa adresy węzłów głównych gałęzi
●
długości wszystkich gałęzi (liczby węzłów w gałęziach) są zbliżone
Lista czona dwukierunkowa łą Lista czona dwukierunkowa łą
●
zalety:
●
usuwanie ostatniego elementu bez iteracji po całej liście
●
brak konieczności implementacji metody odwracającej listę
●
wady:
●
dodatkowe zużycie pamięci na adresy węzłów poprzedzających
●
konieczność aktualizacji pary wskaźników przy dodawaniu/usuwaniu
head tail
4/4/2020 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki
Wstawianie Wstawianie
A next
B next
C
head tail
prev prev
pred succ
(1) ustawiamy wskaźnik pred na węźle, za którym wstawiamy, a succ na węźle, przed którym wstawiamy
Wstawianie Wstawianie
head tail
pred succ
(1) ustawiamy wskaźnik pred na węźle, za którym wstawiamy, a succ na węźle, przed którym wstawiamy
(2) tworzymy nowy węzeł (creator) z podaną wartością i wartością succ jako adresem następnego (next) oraz pred jako adresem poprzedniego (prev)
6/6/2020 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki
Wstawianie Wstawianie
A next
B next
C
head tail
prev prev
pred succ
(1) ustawiamy wskaźnik pred na węźle, za którym wstawiamy, a succ na węźle, przed którym wstawiamy
(2) tworzymy nowy węzeł (creator) z podaną wartością i wartością succ jako adresem następnego (next) oraz pred jako adresem poprzedniego (prev)
creator
X next
prev
Wstawianie Wstawianie
head tail
pred succ
(1) ustawiamy wskaźnik pred na węźle, za którym wstawiamy, a succ na węźle, przed którym wstawiamy
(2) tworzymy nowy węzeł (creator) z podaną wartością i wartością succ jako adresem następnego (next) oraz pred jako adresem poprzedniego (prev)
(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 succ jest pusty) na nowy węzeł
creator
X next
prev
8/8/2020 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki
Wstawianie Wstawianie
A next
B next
C
head tail
prev prev
pred succ
(1) ustawiamy wskaźnik pred na węźle, za którym wstawiamy, a succ na węźle, przed którym wstawiamy
(2) tworzymy nowy węzeł (creator) z podaną wartością i wartością succ jako adresem następnego (next) oraz pred jako adresem poprzedniego (prev)
(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 succ jest pusty) na nowy węzeł
creator
X next
prev
Wstawianie Wstawianie
head tail
(1) ustawiamy wskaźnik pred na węźle, za którym wstawiamy, a succ na węźle, przed którym wstawiamy
(2) tworzymy nowy węzeł (creator) z podaną wartością i wartością succ jako adresem następnego (next) oraz pred jako adresem poprzedniego (prev)
(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 succ jest pusty) na nowy węzeł
X next
prev
1010/20/20 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki
Wstawianie Wstawianie
A next
B next
C
head tail
prev prev
(1) ustawiamy wskaźnik pred na węźle, za którym wstawiamy, a succ na węźle, przed którym wstawiamy
(2) tworzymy nowy węzeł (creator) z podaną wartością i wartością succ jako adresem następnego (next) oraz pred jako adresem poprzedniego (prev)
(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 succ jest pusty) na nowy węzeł
X next
prev
Wstawianie Wstawianie
head tail
(1) ustawiamy wskaźnik pred na węźle, za którym wstawiamy, a succ na węźle, przed którym wstawiamy
(2) tworzymy nowy węzeł (creator) z podaną wartością i wartością succ jako adresem następnego (next) oraz pred jako adresem poprzedniego (prev)
(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 succ jest pusty) na nowy węzeł
1212/20/20 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki
Usuwanie Usuwanie
A next
B next
C
head tail
prev prev
pred succ
(1) ustawiamy wskaźnik pred na węźle poprzedzającym usuwany, a succ na węźle do usunięcia (jeżeli nie ma szukanego węzła zgłaszamy wyjątek lub przerywamy operację)
Usuwanie Usuwanie
head tail
pred succ
(1) ustawiamy wskaźnik pred na węźle poprzedzającym usuwany, a succ na węźle do usunięcia (jeżeli nie ma szukanego węzła zgłaszamy wyjątek lub przerywamy operację)
(2) ustawiamy dedykowany wskaźnik (killer) na węzeł wskazywany przez succ i przestawiamy wskaźnik succ na węzeł następny
1414/20/20 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki
Usuwanie Usuwanie
A next
B next
C
head tail
prev prev
pred succ
(1) ustawiamy wskaźnik pred na węźle poprzedzającym usuwany, a succ na węźle do usunięcia (jeżeli nie ma szukanego węzła zgłaszamy wyjątek lub przerywamy operację)
(2) ustawiamy dedykowany wskaźnik (killer) na węzeł wskazywany przez succ i przestawiamy wskaźnik succ na węzeł następny
killer
Usuwanie Usuwanie
head tail
pred succ
(1) ustawiamy wskaźnik pred na węźle poprzedzającym usuwany, a succ na węźle do usunięcia (jeżeli nie ma szukanego węzła zgłaszamy wyjątek lub przerywamy operację)
(2) ustawiamy dedykowany wskaźnik (killer) na węzeł wskazywany przez succ i przestawiamy wskaźnik succ na węzeł następny
(3) ustawiamy wskaźnik next węzła wskazywanego przez pred (lub wskaźnik head gdy pred jest pusty) na adres zapisany w succ, a wskaźnik prev węzła wskazywanego przez succ (lub wskaźnik tail gdy succ jest pusty) na adres zapisany w pred
killer
1616/20/20 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki
Usuwanie Usuwanie
A next
B next
C
head tail
prev prev
pred succ
(1) ustawiamy wskaźnik pred na węźle poprzedzającym usuwany, a succ na węźle do usunięcia (jeżeli nie ma szukanego węzła zgłaszamy wyjątek lub przerywamy operację)
(2) ustawiamy dedykowany wskaźnik (killer) na węzeł wskazywany przez succ i przestawiamy wskaźnik succ na węzeł następny
(3) ustawiamy wskaźnik next węzła wskazywanego przez pred (lub wskaźnik head gdy pred jest pusty) na adres zapisany w succ, a wskaźnik prev węzła wskazywanego przez succ (lub wskaźnik tail gdy succ jest pusty) na adres zapisany w pred
killer
Usuwanie Usuwanie
head tail
pred succ
(1) ustawiamy wskaźnik pred na węźle poprzedzającym usuwany, a succ na węźle do usunięcia (jeżeli nie ma szukanego węzła zgłaszamy wyjątek lub przerywamy operację)
(2) ustawiamy dedykowany wskaźnik (killer) na węzeł wskazywany przez succ i przestawiamy wskaźnik succ na węzeł następny
(3) ustawiamy wskaźnik next węzła wskazywanego przez pred (lub wskaźnik head gdy pred jest pusty) na adres zapisany w succ, a wskaźnik prev węzła wskazywanego przez succ (lub wskaźnik tail gdy succ jest pusty) na adres zapisany w pred
(4) zwalniamy węzeł wskazywany przez wskaźnik dedykowany (killer)
killer
1818/20/20 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki
Usuwanie Usuwanie
A next
C
head tail
prev
pred succ
(1) ustawiamy wskaźnik pred na węźle poprzedzającym usuwany, a succ na węźle do usunięcia (jeżeli nie ma szukanego węzła zgłaszamy wyjątek lub przerywamy operację)
(2) ustawiamy dedykowany wskaźnik (killer) na węzeł wskazywany przez succ i przestawiamy wskaźnik succ na węzeł następny
(3) ustawiamy wskaźnik next węzła wskazywanego przez pred (lub wskaźnik head gdy pred jest pusty) na adres zapisany w succ, a wskaźnik prev węzła wskazywanego przez succ (lub wskaźnik tail gdy succ jest pusty) na adres zapisany w pred
(4) zwalniamy węzeł wskazywany przez wskaźnik dedykowany (killer)
killer
Usuwanie Usuwanie
head tail
(1) ustawiamy wskaźnik pred na węźle poprzedzającym usuwany, a succ na węźle do usunięcia (jeżeli nie ma szukanego węzła zgłaszamy wyjątek lub przerywamy operację)
(2) ustawiamy dedykowany wskaźnik (killer) na węzeł wskazywany przez succ i przestawiamy wskaźnik succ na węzeł następny
(3) ustawiamy wskaźnik next węzła wskazywanego przez pred (lub wskaźnik head gdy pred jest pusty) na adres zapisany w succ, a wskaźnik prev węzła wskazywanego przez succ (lub wskaźnik tail gdy succ jest pusty) na adres zapisany w pred
(4) zwalniamy węzeł wskazywany przez wskaźnik dedykowany (killer)
2020/20/20 Programowanie I struktury danych, dr Piotr Cybula, Uniwersytet ŁódzkiProgramowanie I struktury danych, dr Piotr Cybula, Uniwersytet Łódzki
Usuwanie Usuwanie
A next
C
head tail
prev
(1) ustawiamy wskaźnik pred na węźle poprzedzającym usuwany, a succ na węźle do usunięcia (jeżeli nie ma szukanego węzła zgłaszamy wyjątek lub przerywamy operację)
(2) ustawiamy dedykowany wskaźnik (killer) na węzeł wskazywany przez succ i przestawiamy wskaźnik succ na węzeł następny
(3) ustawiamy wskaźnik next węzła wskazywanego przez pred (lub wskaźnik head gdy pred jest pusty) na adres zapisany w succ, a wskaźnik prev węzła wskazywanego przez succ (lub wskaźnik tail gdy succ jest pusty) na adres zapisany w pred
(4) zwalniamy węzeł wskazywany przez wskaźnik dedykowany (killer)