• 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!
25
0
0

Pełen tekst

(1)

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>

(2)

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)

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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

(8)

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

(9)

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

(10)

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ł

(11)

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

(12)

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

(13)

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

(14)

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

(15)

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

(16)

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

(17)

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

(18)

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

(19)

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

(20)

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

(21)

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

(22)

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

(23)

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

(24)

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

(25)

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

Cytaty

Powiązane dokumenty

● 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

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