Algorytmy i Struktury Danych. Liniowe struktury danych - Lista uporzadkowana. Wartownicy. Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 6 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 1 / 28
Dołaczanie elementu do uporzadkowanej listy jednokierunkowej Algorytm dołaczania elementu do uporzadkowanej listy jednokierunkowej Cel: Dodanie nowego elementu do listy uporzadkowanej; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 2 / 28
Dołaczanie elementu do uporzadkowanej listy jednokierunkowej Algorytm dołaczania elementu do uporzadkowanej listy jednokierunkowej Cel: Dodanie nowego elementu do listy uporzadkowanej; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Dołaczany element; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 2 / 28
Dołaczanie elementu do uporzadkowanej listy jednokierunkowej Algorytm dołaczania elementu do uporzadkowanej listy jednokierunkowej List-Insert(L,x) 1: if head[l] = NIL then 2: head[l] := x; next[x] := NIL; 3: else 4: y := head[l]; z := NIL; 5: while (y! = NIL) and (key[x] > key[y]) do 6: z := y; 7: y := next[y]; 8: end while 9: next[x] = y; 10: next[z] = x; 11: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 3 / 28
Dołaczanie elementu do uporzadkowanej listy jednokierunkowej Złożoność Procedura List-Insert(L, x) przyłacza element x (dla którego pole key zostało wcześniej zainicjowane) na wskazane porzadkiem miejsce listy jednokierunkowej. Ponieważ niekiedy potrzebne jest przejście całej listy L, aby znaleźć miejsce dla elementu x, to pesymistyczny czas działania procedury List-Insert na liście o n elementach wynosi O(n). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 4 / 28
Dołaczanie elementu do uporzadkowanej listy jednokierunkowej - pewna implementacja Definicja listy jednokierunkowej typedef long T; typedef struct NODE { T value; struct NODE* next; } Node; typedef struct { Node* first; Node* last; } List; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 5 / 28
Dołaczanie elementu do uporzadkowanej listy jednokierunkowej - pewna implementacja int insert (List *L, T nazwa); int insert (List *L, T value) { Node *new, *curr, *prev; new= (Node*)malloc(sizeof(Node)); /* Utwórz element Node*/ if(new == NULL){ /* weryfikacja przydzielonej pamieci*/ printf("nie udalo sie przydzielic pamieci"); return 1; } else{ /* Ustal dane elementarne w Node*/ new-> value = value; new-> next= NULL; } if( L->first == NULL) { L->first = new; } else{ /* Znajdz miejsce wstawienia */ curr = L->first; prev = NULL; while((curr!= NULL) && (value > curr->value)){ prev= curr; curr= curr-> next; } /*Wstaw element w miejsce miedzy prev a curr*/ new->next= curr; if (prev!= NULL) prev->next= new; else L->first = new; } return 0; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 6 / 28
Dołaczanie elementu do uporzadkowanej listy dwukierunkowej Algorytm dołaczania elementu do uporzadkowanej listy dwukierunkowej Cel: Dodanie nowego elementu do listy uporzadkowanej; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 7 / 28
Dołaczanie elementu do uporzadkowanej listy dwukierunkowej Algorytm dołaczania elementu do uporzadkowanej listy dwukierunkowej Cel: Dodanie nowego elementu do listy uporzadkowanej; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Dołaczany element; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 7 / 28
Dołaczanie elementu do uporzadkowanej listy dwukierunkowej Algorytm dołaczania elementu do uporzadkowanej listy dwukierunkowej List-Insert2(L,x) 1: if head[l] = NIL then 2: head[l] := x; next[x] := NIL; prev[x] := NIL 3: else 4: y := head[l]; 5: while (y! = NIL) and (key[x] > key[y]) do 6: y := next[y]; 7: end while 8: if y! = NIL then 9: next[x] := y; prev[x] := prev[y]; next[prev[y]] := x; prev[y] := x; 10: end if 11: else 12: next[x] := NIL; prev[x] = tail[l]; next[tail[l]] := x; tail[l] := x; 13: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 8 / 28
Dołaczanie elementu do uporzadkowanej listy dwukierunkowej Złożoność Procedura List-Insert2(L, x) przyłacza element x (dla którego pole key zostało wcześniej zainicjowane) na wskazane porzadkiem miejsce listy dwukierunkowej. Ponieważ niekiedy potrzebne jest przejście całej listy L, aby znaleźć miejsce dla elementu x, to pesymistyczny czas działania procedury List-Insert2 na liście o n elementach wynosi O(n). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 9 / 28
Dołaczanie elementu do uporzadkowanej listy dwukierunkowej - pewna implementacja Definicja listy dwukierunkowej typedef long T; typedef struct NODE { T value; struct NODE* next; struct NODE* prev; } Node; typedef struct { Node* first; Node* last; } List2; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 10 / 28
Dołaczanie elementu do uporzadkowanej listy dwukierunkowej - pewna implementacja int insert (List2 *L, T value); int insert (List2 *L, T value) { // Zadanie na ćwiczenia // Napisz definicje!!! } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 11 / 28
Usuwanie elementu z uporzadkowanej listy jednokierunkowej Algorytm usuwania elementu z uporzadkowanej listy jednokierunkowej Cel: Usunięcie danego elementu z uporzadkowanej listy jednokierunkowej; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 12 / 28
Usuwanie elementu z uporzadkowanej listy jednokierunkowej Algorytm usuwania elementu z uporzadkowanej listy jednokierunkowej Cel: Usunięcie danego elementu z uporzadkowanej listy jednokierunkowej; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Usuwany element; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 12 / 28
Usuwanie elementu z uporzadkowanej listy jednokierunkowej Algorytm usuwania elementu z uporzadkowanej listy jednokierunkowej Cel: Usunięcie danego elementu z uporzadkowanej listy jednokierunkowej; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Usuwany element; Algorytm - schemat Jeżeli dane sa zgodne z danymi pierwszego elementu listy, usuń pierwszy element listy; Znajdź element do usunięcia na liście; Jeżeli znaleziono, usuń znaleziony element z listy; Jeżeli nie znaleziono elementu, generuj komunikat; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 12 / 28
Usuwanie elementu z uporzadkowanej listy jednokierunkowej Algorytm usuwania elementu z uporzadkowanej listy jednokierunkowej List-Del(L,x) 1: if head[l]! = NIL then 2: if head[l] = x then 3: head[l] := next[x]; 4: else 5: y := head[l]; 6: while (next[y]! = x) do 7: y := next[y]; 8: end while 9: next[y] := next[x]; 10: end if 11: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 13 / 28
Usuwanie elementu z uporzadkowanej listy jednokierunkowej Złożoność Procedura List-Del(L, k) usuwa element o kluczu k z uporzadkowanej listy jednokierunkowej. Ponieważ niekiedy potrzebne jest przejście całej listy L, aby znaleźć element o kluczu k, to pesymistyczny czas działania procedury List-Del na liście o n elementach wynosi O(n). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 14 / 28
Usuwanie elementu z uporzadkowanej listy jednokierunkowej - pewna implementacja int delete(list *L, T value); int delete(list *L, T value){ Node *prev, *curr, *temp; if(l->first== NULL) return 1; /* Lista pusta */ else{ if(value == L->first->value){ temp = L->first; L->first = L->first->next; free(temp); }else{ /* znajdz w liscie element do usuniecia*/ prev = L->first; curr = L->first->next; while(curr!= NULL && curr->value!= value) { prev= curr; curr = curr->next; } if(curr == NULL) return 1; /* element nie zostalznaleziony */ else{ /* Usun znaleziony element */ temp = currptr; prev->next= curr->next; free(temp); } } } return 0; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 15 / 28
Usuwanie elementu z uporzadkowanej listy dwukierunkowej Algorytm usuwania elementu z uporzadkowanej listy dwukierunkowej Cel: Usunięcie danego elementu z uporzadkowanej listy dwukierunkowej; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 16 / 28
Usuwanie elementu z uporzadkowanej listy dwukierunkowej Algorytm usuwania elementu z uporzadkowanej listy dwukierunkowej Cel: Usunięcie danego elementu z uporzadkowanej listy dwukierunkowej; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Usuwany element; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 16 / 28
Usuwanie elementu z uporzadkowanej listy dwukierunkowej Algorytm usuwania elementu z uporzadkowanej listy dwukierunkowej Cel: Usunięcie danego elementu z uporzadkowanej listy dwukierunkowej; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Usuwany element; Algorytm - schemat Jeżeli dane sa zgodne z danymi pierwszego elementu listy, usuń pierwszy element listy; Znajdź element do usunięcia na liście; Jeżeli znaleziono, usuń znaleziony element z listy; Jeżeli nie znaleziono elementu, generuj komunikat; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 16 / 28
Usuwanie elementu z uporzadkowanej listy dwukierunkowej Algorytm usuwania elementu z uporzadkowanej listy dwukierunkowej List-Insert2(L,x) 1: if head[l]! = NIL then 2: if key[head[l]] = key[x]; then 3: head[l] := next[x]; prev[head[l]] := NIL 4: else 5: y := head[l]; z := NIL; 6: while (key[x]! = key[y]) do 7: z := y; y := next[y]; 8: end while 9: if y! = NIL then 10: next[z] := next[y]; prev[next[y]] := z; 11: end if 12: end if 13: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 17 / 28
Usuwanie elementu z uporzadkowanej listy dwukierunkowej Złożoność Procedura List-Del2(L, k) usuwa element o kluczu k z uporzadkowanej listy dwukierunkowej. Ponieważ niekiedy potrzebne jest przejście całej listy L, aby znaleźć element o kluczu k, to pesymistyczny czas działania procedury List-Del2 na liście o n elementach wynosi O(n). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 18 / 28
Usuwanie elementu z uporzadkowanej listy dwukierunkowej - pewna implementacja int delete (List2 *L, T value); int delete (List2 *L, T value) { // Zadanie na ćwiczenia // Napisz definicje!!! } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 19 / 28
Wartownicy Wartownik jest sztucznym elementem, który pozwala uprościć warunki brzegowe. Przyjmijmy dla przykładu, iż z dwukierunkowa lista L jest zwiazany element nil[l], który odgrywa role stałej NIL, ale jest rekordem o takich samych polach jak wszystkie zwykłe elementy listy. Każde wystapienie stałej NIL w naszych procedurach zamieniamy na wskaźnik do wartownika nil[l]. Sprawia to, że zwykła lista dwukierunkowa staje sie w istocie lista cykliczna, w której wartownik nil[l] znajduje się między głowa a ogonem. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 20 / 28
Wartownicy Pole next[nil[l]] wskazuje na głowe listy, a pole prev[nil[l]] wskazuje na ogon listy. Ponieważ pole next[nil[l]] wskazuje na głowę listy nie ma potrzeby pamiętania atrybutu head[l]. Wystarczy zastapić wszystkie odwołania do niego przez next[nil[l]]. Lista pusta składa się z samego wartownika i wtedy oba pola next[nil[l]] oraz prev[nil[l]] wskazuja na nil[l]. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 21 / 28
Wartownicy Wartownik zaznaczony został kolorem ciemnoszarym. Jest to cykliczna lista dwukierunkowa, w której wartownik znajduje się zawsze między głowa a ogonem. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 22 / 28
Wartownicy Wartownik zaznaczony został kolorem ciemnoszarym. Jest to cykliczna lista dwukierunkowa, w której wartownik znajduje się zawsze między głowa a ogonem. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 23 / 28
Wstawianie elementu do listy dwukierunkowej z wartownikiem Algorytm wstawienia elementu do listy dwukierunkowej z wartownikiem Cel: Wstawianie danego elementu do listy dwukierunkowej z wartownikiem; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 24 / 28
Wstawianie elementu do listy dwukierunkowej z wartownikiem Algorytm wstawienia elementu do listy dwukierunkowej z wartownikiem Cel: Wstawianie danego elementu do listy dwukierunkowej z wartownikiem; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Element do wstawienia; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 24 / 28
Wstawianie elementu do listy dwukierunkowej z wartownikiem Algorytm wstawienia elementu do listy dwukierunkowej z wartownikiem Cel: Wstawianie danego elementu do listy dwukierunkowej z wartownikiem; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Element do wstawienia; Ponieważ można pominać warunki brzegowe dotyczace głowy i ogona listy, treść procedury List-Insert-Begin(L, x) znacznie się uprościła: List-Insert-Begin(L,x) 1: prev[next[nil[l]]] := x; 2: next[nil[l]] := x; 3: prev[x] := nil[l]; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 24 / 28
Usuwanie elementu z listy dwukierunkowej z wartownikiem Algorytm usuwania elementu z listy dwukierunkowej z wartownikiem Cel: Usunięcie wskazanego elementu z listy dwukierunkowej z wartownikiem; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 25 / 28
Usuwanie elementu z listy dwukierunkowej z wartownikiem Algorytm usuwania elementu z listy dwukierunkowej z wartownikiem Cel: Usunięcie wskazanego elementu z listy dwukierunkowej z wartownikiem; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Element do usunięcia; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 25 / 28
Usuwanie elementu z listy dwukierunkowej z wartownikiem Algorytm usuwania elementu z listy dwukierunkowej z wartownikiem Cel: Usunięcie wskazanego elementu z listy dwukierunkowej z wartownikiem; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Element do usunięcia; Ponieważ można pominać warunki brzegowe dotyczace głowy i ogona listy, treść procedury LIST-DELETE-2 znacznie się uprościła: List-Delete-2(L,x) 1: next[prev[x]]:= next[x]; 2: prev[next[x]]:= prev[x]; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 25 / 28
Wartownicy Lista ze slajdu 23 po wykonaniu procedury List-Insert-Begin(L, x), gdzie element wstawiany key[x]=3. Nowy element został umieszczony w głowie listy. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 26 / 28
Wartownicy Lista po usunieciu elementu o kluczu 1. W ogonie znajduje sie teraz element o kluczu 4. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 27 / 28
Wyszukiwanie elementu na liście Algorytm wyszukiwania elementu w liście dwukierunkowej z wartownikiem Cel: Wyszukanie elementu na liście z wartownikiem; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 28 / 28
Wyszukiwanie elementu na liście Algorytm wyszukiwania elementu w liście dwukierunkowej z wartownikiem Cel: Wyszukanie elementu na liście z wartownikiem; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Kryterium poszukiwania, np. wartość danej elementarnej; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 28 / 28
Wyszukiwanie elementu na liście Algorytm wyszukiwania elementu w liście dwukierunkowej z wartownikiem Cel: Wyszukanie elementu na liście z wartownikiem; Dane wejściowe: Położenie pierwszego elementu listy (np. wskaźnik na ten element); Kryterium poszukiwania, np. wartość danej elementarnej; Algorytm: List-Search(L,k) 1: x := next[nil[l]]; 2: while (x!=nil and key[x]!=k) do 3: x := next[x]; 4: end while 5: return x; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 6 28 / 28