Programowanie i struktury danych Programowanie i struktury danych
Wykład 5 Wykład 5
Dr Piotr Cybula <piotr.cybula@wmii.uni.lodz.pl>
Dr Piotr Cybula <piotr.cybula@wmii.uni.lodz.pl>
Wstawianie w rodek ś Wstawianie w rodek ś
A next
B next head C
(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head)
Wstawianie w rodek ś Wstawianie w rodek ś
A next
B next head C
(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head)
pred succ
Wstawianie w rodek ś Wstawianie w rodek ś
A next
B next head C
(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head)
(2) przechodzimy wskaźnikami pomocniczymi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle, za którym wstawiamy, a succ na węźle, przed którym wstawiamy
pred succ
Wstawianie w rodek ś Wstawianie w rodek ś
A next
B next head C
(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head)
(2) przechodzimy wskaźnikami pomocniczymi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle, za którym wstawiamy, a succ na węźle, przed którym wstawiamy
pred succ
Wstawianie w rodek ś Wstawianie w rodek ś
A next
B next head C
(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head)
(2) przechodzimy wskaźnikami pomocniczymi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle, za którym wstawiamy, a succ na węźle, przed którym wstawiamy
(3) tworzymy nowy węzeł (creator) z podaną wartością i wartością succ jako adresem następnego (next)
pred succ
Wstawianie w rodek ś Wstawianie w rodek ś
A next
B next head C
V next
(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head)
(2) przechodzimy wskaźnikami pomocniczymi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle, za którym wstawiamy, a succ na węźle, przed którym wstawiamy
(3) tworzymy nowy węzeł (creator) z podaną wartością i wartością succ jako adresem następnego (next)
creator
succ pred
Wstawianie w rodek ś Wstawianie w rodek ś
A next
B next head C
V next
(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head)
(2) przechodzimy wskaźnikami pomocniczymi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle, za którym wstawiamy, a succ na węźle, przed którym wstawiamy
(3) tworzymy nowy węzeł (creator) z podaną wartością i wartością succ jako adresem następnego (next)
(4) przestawiamy wskaźnik next w węźle wskazywanym przez pred (lub wskaźnik head gdy pred jest pusty) na nowy węzeł
creator
succ pred
Wstawianie w rodek ś Wstawianie w rodek ś
A next
B next head C
V next
(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head)
(2) przechodzimy wskaźnikami pomocniczymi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle, za którym wstawiamy, a succ na węźle, przed którym wstawiamy
(3) tworzymy nowy węzeł (creator) z podaną wartością i wartością succ jako adresem następnego (next)
(4) przestawiamy wskaźnik next w węźle wskazywanym przez pred (lub wskaźnik head gdy pred jest pusty) na nowy węzeł
creator
succ pred
Wstawianie w rodek ś Wstawianie w rodek ś
A next
B next head C
V next
(1) powołujemy dwa pomocnicze wskaźniki: pred ustawiamy na pusty adres, a succ na adres pierwszego węzła (head)
(2) przechodzimy wskaźnikami pomocniczymi w kierunku końca listy tak, aby wskaźnik pred zatrzymał się na węźle, za którym wstawiamy, a succ na węźle, przed którym wstawiamy
(3) tworzymy nowy węzeł (creator) z podaną wartością i wartością succ jako adresem następnego (next)
(4) przestawiamy wskaźnik next w węźle wskazywanym przez pred (lub wskaźnik head gdy pred jest pusty) na nowy węzeł
Usuwanie w rodku ś Usuwanie w rodku ś
(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 usuwany, a succ na węźle do usunięcia (jeżeli nie ma szukanego węzła zgłaszamy wyjątek lub przerywamy operację)
A next
B C
head
next
Usuwanie w rodku ś Usuwanie w rodku ś
(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 usuwany, a succ na węźle do usunięcia (jeżeli nie ma szukanego węzła zgłaszamy wyjątek lub przerywamy operację)
A next
B C
head
next
pred succ
Usuwanie w rodku ś Usuwanie w rodku ś
(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 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
A next
B C
head
next
pred succ
Usuwanie w rodku ś Usuwanie w rodku ś
(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 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
A next
B C
head
next
pred killer succ
Usuwanie w rodku ś Usuwanie w rodku ś
(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 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 (3) przestawiamy wskaźnik succ na węzeł następny
A next
B C
head
next
pred killer succ
Usuwanie w rodku ś Usuwanie w rodku ś
(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 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 (3) przestawiamy wskaźnik succ na węzeł następny
A next
B C
head
next
pred killer succ
Usuwanie w rodku ś Usuwanie w rodku ś
(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 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 (3) przestawiamy wskaźnik succ na węzeł następny
(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
pred killer succ
Usuwanie w rodku ś Usuwanie w rodku ś
(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 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 (3) przestawiamy wskaźnik succ na węzeł następny
(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
pred killer succ
Usuwanie w rodku ś Usuwanie w rodku ś
(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 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 (3) przestawiamy wskaźnik succ na węzeł następny
(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) zwalniamy węzeł wskazywany przez wskaźnik dedykowany (killer)
A next
B C
head
next
pred killer succ
Usuwanie w rodku ś Usuwanie w rodku ś
(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 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 (3) przestawiamy wskaźnik succ na węzeł następny
(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) zwalniamy węzeł wskazywany przez wskaźnik dedykowany (killer)
A next
C
head pred killer succ
Usuwanie w rodku ś Usuwanie w rodku ś
(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 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 (3) przestawiamy wskaźnik succ na węzeł następny
(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) zwalniamy węzeł wskazywany przez wskaźnik dedykowany (killer)
A next
C head
Lista sortowana Lista sortowana
● abstrakcyjny typ danych pozwalający na porządkowanie na bieżąco wstawianych elementów (implementuje sortowanie przez wstawianie)
● wymaga obecności operatora porównywania (operator< lub operator>) dla porządkowanych elementów
● implementacja tablicowa wymaga przesuwania elementów w tablicy (niska wydajność ze względu na konieczność częstego kopiowania danych lub realokacji tablicy)
● implementacja listowa eliminuje ten problem (nowy element wstawiany jest do listy w odpowiednie miejsce bez zmiany położenia w pamięci aktualnych)
A next
D head
B next
Lista sortowana - wstawianie Lista sortowana - wstawianie
● wędrując wskaźnikami pomocniczymi pred i succ od początku listy
zatrzymujemy wskaźnik succ na pierwszym węźle o wartości większej lub równej wstawianemu (w przypadku porządku rosnącego) albo mniejszej lub równej wstawianemu (porządek malejący)
● pusty wskaźnik pred oznacza wstawianie na początku
● pusty wskaźnik succ oznacza wstawianie na końcu
A next
C next
D head
B next
pred succ
Lista sortowana - usuwanie Lista sortowana - usuwanie
● wędrując wskaźnikami pomocniczymi pred i succ od początku listy
zatrzymujemy wskaźnik succ na pierwszym węźle o wartości większej lub równej usuwanemu omijając wartości mniejsze (w przypadku porządku rosnącego) albo większe (porządek malejący)
● jeżeli wskaźnik succ jest pusty lub wskazuje na węzeł zawierający inną wartość, oznacza to brak szukanej wartości w liście
A next
C next
D head
B next
pred succ
Lista sortowana - usuwanie Lista sortowana - usuwanie
● wędrując wskaźnikami pomocniczymi pred i succ od początku listy
zatrzymujemy wskaźnik succ na pierwszym węźle o wartości większej lub równej usuwanemu omijając wartości mniejsze (w przypadku porządku rosnącego) albo większe (porządek malejący)
● jeżeli wskaźnik succ jest pusty lub wskazuje na węzeł zawierający inną wartość, oznacza to brak szukanej wartości w liście
● po usunięciu elementu wskaźnik succ wskazuje na następny węzeł (lub jest pusty) i lista wygląda tak jakby elementu usuwanego nigdy w niej nie było (pozwala to na kontynuację usuwania w przypadku sekwencji identycznych wartości)
A next
D head
B next
pred succ