Upload
lequynh
View
229
Download
2
Embed Size (px)
Citation preview
Algorytmy i Struktury Danych.Liniowe struktury danych - Lista
Bozena [email protected]
Jan Długosz University, Poland
Wykład 5
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 1 / 40
Lista
Lista - struktura danych, w których elementy sa ułozone w liniowymporzadku. Porzadek na liscie okreslaja wskazniki zwiazane z kazdymelementem listy.
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 2 / 40
Lista
Lista - struktura danych, w których elementy sa ułozone w liniowymporzadku. Porzadek na liscie okreslaja wskazniki zwiazane z kazdymelementem listy.
Lista jedno- i dwukierunkowa - notacja wspólna
head[L] - pierwszy element listy L. Jezeli head[x]=NIL to lista jestpusta.tail[L] - ostatni element listy L.key[x] - klucz znajdujacy sie w wezle x.next[x] - nastepnik elementu x. Jezeli next[x]=NIL to x nie manastepnika, jest wiec ostanim elementem listy (tzw. ogon).
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 2 / 40
Lista
Lista - struktura danych, w których elementy sa ułozone w liniowymporzadku. Porzadek na liscie okreslaja wskazniki zwiazane z kazdymelementem listy.
Lista jedno- i dwukierunkowa - notacja wspólna
head[L] - pierwszy element listy L. Jezeli head[x]=NIL to lista jestpusta.tail[L] - ostatni element listy L.key[x] - klucz znajdujacy sie w wezle x.next[x] - nastepnik elementu x. Jezeli next[x]=NIL to x nie manastepnika, jest wiec ostanim elementem listy (tzw. ogon).
Lista dwukierunkowa - notacja dodatkowa
prev[x] - poprzednik elementu x. Jezeli prev[x]=NIL to x nie mapoprzednika, jest wiec pierwszym elementem listy (tzw. głowa).
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 2 / 40
Lista jedno- i dwu kierunkowa - schemat
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 3 / 40
Podstawowe operacje na listach
Wyszukiwanie elementu na liscie
Dołaczanie elementu do listy
Usuwanie elementu z listy
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 4 / 40
Wyszukiwanie elementu na liscie
Algorytm wyszukiwania elementu w liscie jedno- idwukierunkowej
Cel: Wyszukanie elementu na liscie;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 5 / 40
Wyszukiwanie elementu na liscie
Algorytm wyszukiwania elementu w liscie jedno- idwukierunkowej
Cel: Wyszukanie elementu na liscie;Dane wej sciowe:
Połozenie pierwszego elementu listy (np. wskaznik na ten element);Kryterium poszukiwania, np. wartosc danej elementarnej;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 5 / 40
Wyszukiwanie elementu na liscie
Algorytm wyszukiwania elementu w liscie jedno- idwukierunkowej
Cel: Wyszukanie elementu na liscie;Dane wej sciowe:
Połozenie pierwszego elementu listy (np. wskaznik na ten element);Kryterium poszukiwania, np. wartosc danej elementarnej;
Algorytm:List-Search(L,k)
1: x := head[L];2: while (x!=NIL and key[x]!=k) do3: x := next[x];4: end while5: return x;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 5 / 40
Wyszukiwanie elementu na liscie
ZłozonoscProcedura List-Search(L, k) wyznacza pierwszy element o kluczu kna liscie L. Poniewaz niekiedy potrzebne jest przejscie całej listy L, abyznalezc element o kluczu k, to pesymistyczny czas działaniaprocedury List-Search na liscie o n elementach wynosi O(n).
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 6 / 40
Wyszukiwanie elementu na liscie jednokierunkowej -pewna implementacja
Definicja listy jednokierunkowejtypedef long T;
typedef struct NODE {T value;struct NODE * next;
} Node;
typedef struct {Node* first;Node* last;
} List;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 7 / 40
Wyszukiwanie elementu na liscie jednokierunkowej -pewna implementacja
Definicja funkcji Node* search(List const * L, T x);
// zwraca wskaznik do pierwszego wystapienia// elementu x na li scie LNode* search(List const * L, T x){
Node * p = L->first;while (p != NULL) {
if (p->value == x) {return p;
}p = p->next;
}return NULL;
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 8 / 40
Wyszukiwanie elementu na liscie dwukierunkowej -pewna implementacja
Definicja listy dwukierunkowejtypedef long T;
typedef struct NODE {T value;struct NODE * next;struct NODE * prev;
} Node;
typedef struct {Node* first;Node* last;
} List;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 9 / 40
Wyszukiwanie elementu na liscie dwukierunkowej -pewna implementacja
Definicja funkcji Node* search(List const * L, T x);
// zwraca wskaznik do pierwszego wystapienia// elementu x na li scie LNode* search(List const * L, T x){
Node * p = L->first;while (p != NULL) {
if (p->value == x) {return p;
}p = p->next;
}return NULL;
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 10 / 40
Dołaczanie elementu do listy jednokierunkowej
Algorytm wstawiania elementu do listy jednokierunkowej napoczatek
Cel: Dołaczanie elementu do listy jednokierunkowej na poczatek;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 11 / 40
Dołaczanie elementu do listy jednokierunkowej
Algorytm wstawiania elementu do listy jednokierunkowej napoczatek
Cel: Dołaczanie elementu do listy jednokierunkowej na poczatek;Dane wej sciowe:
Połozenie pierwszego elementu listy (np. wskaznik na ten element);Dołaczany element;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 11 / 40
Dołaczanie elementu do listy jednokierunkowej
Algorytm wstawiania elementu do listy jednokierunkowej napoczatek
Cel: Dołaczanie elementu do listy jednokierunkowej na poczatek;Dane wej sciowe:
Połozenie pierwszego elementu listy (np. wskaznik na ten element);Dołaczany element;
Algorytm:List-Insert-1-Begin(L,x)
1: next[x]:= head[L];2: head[L] := x;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 11 / 40
Dołaczanie elementu do listy jednokierunkowej napoczatek
ZłozonoscProcedura List-Insert-1-Begin(L, x) przyłacza element x (dla któregopole key zostało wczesniej zainicjowane) na poczatek listyjednokierunkowej. Procedura List-Insert-1-Begin na liscie o nelementach działa w czasie O(1).
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 12 / 40
Dołaczanie elementu do listy jednokierunkowej -przykład
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 13 / 40
Dołaczanie elementu do listy jednokierunkowej napoczatek - pewna implementacja
Definicja funkcji void push_front(List * L, T w);
void push_front(List * L, T w){
Node* p = malloc(sizeof(Node));p->value = w;p->next = NULL;
if (L->first == NULL) { // lista pustaL->first = L->last = p;
} else {p->next = L->first;L->first = p;
}}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 14 / 40
Dołaczanie elementu do listy dwukierunkowej
Algorytm wstawiania elementu do listy dwukierunkowej napoczatek
Cel: Dołaczanie elementu do listy dwukierunkowej na poczatek;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 15 / 40
Dołaczanie elementu do listy dwukierunkowej
Algorytm wstawiania elementu do listy dwukierunkowej napoczatek
Cel: Dołaczanie elementu do listy dwukierunkowej na poczatek;Dane wej sciowe:
Połozenie pierwszego elementu listy (np. wskaznik na ten element);Dołaczany element;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 15 / 40
Dołaczanie elementu do listy dwukierunkowej
Algorytm wstawiania elementu do listy dwukierunkowej napoczatek
Cel: Dołaczanie elementu do listy dwukierunkowej na poczatek;Dane wej sciowe:
Połozenie pierwszego elementu listy (np. wskaznik na ten element);Dołaczany element;
Algorytm:List-Insert-Begin(L,x)
1: next[x]:= head[L];2: if (head[L]!= NIL) then3: prev[head[L]] := x;4: end if5: head[L] := x;6: prev[x] := NIL;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 15 / 40
Dołaczanie elementu do listy dwukierunkowej napoczatek
ZłozonoscProcedura List-Insert-Begin(L, k) przyłacza element x (dla któregopole key zostało wczesniej zainicjowane) na poczatek listy. ProceduraList-Insert-Begin na liscie o n elementach działa w czasie O(1).
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 16 / 40
Dołaczanie elementu do listy dwukierunkowej -przykład
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 17 / 40
Dołaczanie elementu do listy dwukierunkowej napoczatek - pewna implementacja
Definicja funkcji void push_front(List * L, T w);
void push_front(List * L, T w){
// Zadanie na cwiczenia// Napisz definicje !!!
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 18 / 40
Dołaczanie elementu do listy jednokierunkowej
Algorytm wstawiania elementu do listy jednokierunkowej nakoniec
Cel: Dołaczanie elementu do listy jednokierunkowej na koniec;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 19 / 40
Dołaczanie elementu do listy jednokierunkowej
Algorytm wstawiania elementu do listy jednokierunkowej nakoniec
Cel: Dołaczanie elementu do listy jednokierunkowej na koniec;Dane wej sciowe:
Połozenie ostatniego elementu listy (np. wskaznik na ten element);Dołaczany element;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 19 / 40
Dołaczanie elementu do listy jednokierunkowej
Algorytm wstawiania elementu do listy jednokierunkowej nakoniec
Cel: Dołaczanie elementu do listy jednokierunkowej na koniec;Dane wej sciowe:
Połozenie ostatniego elementu listy (np. wskaznik na ten element);Dołaczany element;
Algorytm:List-Insert-1-End(L,x)
1: if (tail[L]!= NIL) then2: next[tail[L]] := x;3: end if4: tail[L] := x;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 19 / 40
Dołaczanie elementu do listy jednokierunkowej nakoniec
ZłozonoscProcedura List-Insert-1-End(L, k) przyłacza element x (dla któregopole key zostało wczesniej zainicjowane) na koniec listyjednokierunkowej. Procedura List-Insert-1-End na liscie o nelementach działa w czasie O(1).
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 20 / 40
Dołaczanie elementu do listy jednokierunkowej nakoniec - przykład
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 21 / 40
Dołaczanie elementu do listy jednokierunkowej nakoniec - pewna implementacja
Definicja funkcji void push_back(List * L, T w);
void push_back(List * L, T w){
Node* p = malloc(sizeof(Node));p->value = w;p->next = NULL;
if (L->first == NULL) { / * lista pusta * /L->first = L->last = p;
} else { / * cos jest w liscie * /L->last->next = p;L->last = p;
}}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 22 / 40
Dołaczanie elementu do listy dwukierunkowej
Algorytm wstawiania elementu do listy dwukierunkowej nakoniec
Cel: Dołaczanie elementu do listy dwukierunkowej na koniec;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 23 / 40
Dołaczanie elementu do listy dwukierunkowej
Algorytm wstawiania elementu do listy dwukierunkowej nakoniec
Cel: Dołaczanie elementu do listy dwukierunkowej na koniec;Dane wej sciowe:
Połozenie ostatniego elementu listy (np. wskaznik na ten element);Dołaczany element;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 23 / 40
Dołaczanie elementu do listy dwukierunkowej
Algorytm wstawiania elementu do listy dwukierunkowej nakoniec
Cel: Dołaczanie elementu do listy dwukierunkowej na koniec;Dane wej sciowe:
Połozenie ostatniego elementu listy (np. wskaznik na ten element);Dołaczany element;
Algorytm:List-Insert-End(L,x)
1: if (tail[L]!= NIL) then2: next[tail[L]] := x;3: end if4: prev[x] := tail[L];5: tail[L] := x;6: next[x] := NIL;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 23 / 40
Dołaczanie elementu do listy dwukierunkowej nakoniec
ZłozonoscProcedura List-Insert-End(L, k) przyłacza element x (dla którego polekey zostało wczesniej zainicjowane) na koniec listy. ProceduraList-Insert-End na liscie o n elementach działa w czasie O(1).
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 24 / 40
Dołaczanie elementu do listy dwukierunkowej -przykład
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 25 / 40
Dołaczanie elementu do listy dwukierunkowej nakoniec - pewna implementacja
Definicja funkcji void push_back(List * L, T w);
void push_back(List * L, T w){
// Zadanie na cwiczenia// Napisz definicje !!!
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 26 / 40
Usuwanie elementu z listy jednokierunkowej
Algorytm usuwania elementu z listy jednokierunkowejCel: Usuniecie wskazanego elementu z listy jednokierunkowej;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 27 / 40
Usuwanie elementu z listy jednokierunkowej
Algorytm usuwania elementu z listy jednokierunkowejCel: Usuniecie wskazanego elementu z listy jednokierunkowej;Dane wej sciowe:
Połozenie pierwszego elementu listy (np. wskaznik na ten element);Element do usuniecia;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 27 / 40
Usuwanie elementu z listy jednokierunkowej
Algorytm usuwania elementu z listy jednokierunkowejCel: Usuniecie wskazanego elementu z listy jednokierunkowej;Dane wej sciowe:
Połozenie pierwszego elementu listy (np. wskaznik na ten element);Element do usuniecia;
Algorytm:List-Delete-1(L,x)
1: if (x==head[L]) then2: head[L] := next[x];3: else4: y := head[L];5: while (next[y]!=x) do6: y := next[y];7: end while8: next[y]:= next[x];9: end if
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 27 / 40
Usuwanie elementu z listy jednokierunkowej
ZłozonoscProcedura List-Delete-1 usuwa element x z listy L. Poniewaz niekiedypotrzebne jest przejscie całej listy L, aby znalezc element x, topesymistyczny czas działania procedury List-Delete-1 na liscie o nelementach wynosi O(n).
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 28 / 40
Usuwanie elementu z listy jednokierunkowej
Definicja funkcji void pop_1(List * L, T w);
void pop_1(List * L, T w){
// Zadanie na cwiczenia// Napisz definicje !!!
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 29 / 40
Usuwanie elementu z listy dwukierunkowej
Algorytm usuwania elementu z listy dwukierunkowejCel: Usuniecie wskazanego elementu z listy dwukierunkowej;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 30 / 40
Usuwanie elementu z listy dwukierunkowej
Algorytm usuwania elementu z listy dwukierunkowejCel: Usuniecie wskazanego elementu z listy dwukierunkowej;Dane wej sciowe:
Połozenie pierwszego elementu listy (np. wskaznik na ten element);Element do usuniecia;
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 30 / 40
Usuwanie elementu z listy dwukierunkowej - Algorytm
List-Delete-2(L,x)1: if (x==head[L]) then2: head[L] := next[x];3: prev[next[x]] := NIL;4: else5: y := head[L];6: while (next[y]!=x) do7: y := next[y];8: end while9: next[y]:= next[x];
10: if (next[x] != NIL) then11: prev[next[x]] := y;12: end if13: end if
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 31 / 40
Usuwanie elementu z listy dwukierunkowej
ZłozonoscProcedura List-Delete-2 usuwa element x z listy L. Poniewaz niekiedypotrzebne jest przejscie całej listy L, aby znalezc element x, topesymistyczny czas działania procedury List-Delete-2 na liscie o nelementach wynosi O(n).
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 32 / 40
Usuwanie elementu z listy dwukierunkowej - przykład
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 33 / 40
Usuwanie elementu z listy dwukierunkowej
Definicja funkcji void pop_2(List * L, T w);
void pop_2(List * L, T w){
// Zadanie na cwiczenia// Napisz definicje !!!
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 34 / 40
Usuwanie pierwszego elementu z listyjednokierunkowej - pewna implementacja
Definicja funkcji void pop_front(List * L);
void pop_front(List * L){
// jeden element lub lista pustaif (L->first == L->last) {
free(L->first);L->first = L->last = NULL;
} else {Node* p = L->first;L->first = p->next;free(p);
}}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 35 / 40
Usuwanie pierwszego elementu z listyjednokierunkowej
ZłozonoscFunkcja pop_front usuwa pierwszy element listy jednokierunkowej.Funkcja pop_front na liscie o n elementach działa w czasie O(1).
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 36 / 40
Usuwanie pierwszego elementu z listydwukierunkowej - pewna implementacja
Definicja funkcji void pop_front2(List * L);
void pop_front2(List * L){
//Zadanie na cwiczenia// Napisz definicje !!!
}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 37 / 40
Usuwanie ostatniego elementu z listyjednokierunkowej - pewna implementacja
Definicja funkcji void pop_back(List * L);
void pop_back(List * L) {// jeden element lub lista pustaif (L->first == L->last) {
free(L->first);L->first = L->last = NULL;
} else {Node* p = L->first;// szukamy przedostatniego elementu listywhile ((p->next) != L->last) p=p->next;L->last = p;free(p->next); // i usuwamy gop->next = NULL;
}}
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 38 / 40
Usuwanie ostatniego elementu z listyjednokierunkowej
ZłozonoscFunkcja pop_back usuwa ostatni element z listy jednokierunkowej.Poniewaz potrzebne jest przejscie całej listy L, aby znalezcprzedostatni element listy L, to pesymistyczny czas działania funkcjipop_back na liscie o n elementach wynosi O(n).
Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 39 / 40