Algorytmy i Struktury Danych. - wozna.org · znalez´c element o kluczu´ k, to pesymistyczny czas...

55
Algorytmy i Struktury Danych. Liniowe struktury danych - Lista Bo˙ zena Wo´ zna-Szcze´ sniak [email protected] Jan Dlugosz University, Poland Wyklad 5 Bo˙ zena Wo´ zna-Szcze´ sniak (AJD) Algorytmy i Struktury Danych. Wyklad 5 1 / 40

Transcript of Algorytmy i Struktury Danych. - wozna.org · znalez´c element o kluczu´ k, to pesymistyczny czas...

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

Usuwanie ostatniego elementu z listy dwukierunkowej- pewna implementacja

Definicja funkcji void pop_back2(List * L);

void pop_back2(List * L){

//Zadanie na cwiczenia// Napisz definicje !!!

}

Bozena Wozna-Szczesniak (AJD) Algorytmy i Struktury Danych. Wykład 5 40 / 40