Algorytmy i Struktury Danych. - Liniowe struktury danych

Transkrypt

Algorytmy i Struktury Danych. - Liniowe struktury danych
Algorytmy i Struktury Danych.
Liniowe struktury danych - Lista
Bożena Woźna-Szcześniak
[email protected]
Jan Długosz University, Poland
Wykład 5
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
1 / 40
Lista
Lista - struktura danych, w których elementy sa˛ ułożone w liniowym
porzadku.
˛
Porzadek
˛
na liście określaja˛ wskaźniki zwiazane
˛
z każdym
elementem listy.
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
2 / 40
Lista
Lista - struktura danych, w których elementy sa˛ ułożone w liniowym
porzadku.
˛
Porzadek
˛
na liście określaja˛ wskaźniki zwiazane
˛
z każdym
elementem listy.
Lista jedno- i dwukierunkowa - notacja wspólna
head[L] - pierwszy element listy L. Jeżeli head[x]=NIL to lista jest
pusta.
tail[L] - ostatni element listy L.
key[x] - klucz znajdujacy
˛ sie˛ w w˛eźle x.
next[x] - nastepnik
˛
elementu x. Jeżeli next[x]=NIL to x nie ma
nastepnika,
˛
jest wiec
˛ ostanim elementem listy (tzw. ogon).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
2 / 40
Lista
Lista - struktura danych, w których elementy sa˛ ułożone w liniowym
porzadku.
˛
Porzadek
˛
na liście określaja˛ wskaźniki zwiazane
˛
z każdym
elementem listy.
Lista jedno- i dwukierunkowa - notacja wspólna
head[L] - pierwszy element listy L. Jeżeli head[x]=NIL to lista jest
pusta.
tail[L] - ostatni element listy L.
key[x] - klucz znajdujacy
˛ sie˛ w w˛eźle x.
next[x] - nastepnik
˛
elementu x. Jeżeli next[x]=NIL to x nie ma
nastepnika,
˛
jest wiec
˛ ostanim elementem listy (tzw. ogon).
Lista dwukierunkowa - notacja dodatkowa
prev[x] - poprzednik elementu x. Jeżeli prev[x]=NIL to x nie ma
poprzednika, jest wiec
˛ pierwszym elementem listy (tzw. głowa).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
2 / 40
Lista jedno- i dwu kierunkowa - schemat
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
3 / 40
Podstawowe operacje na listach
Wyszukiwanie elementu na liście
Dołaczanie
˛
elementu do listy
Usuwanie elementu z listy
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
4 / 40
Wyszukiwanie elementu na liście
Algorytm wyszukiwania elementu w liście jedno- i
dwukierunkowej
Cel: Wyszukanie elementu na liście;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
5 / 40
Wyszukiwanie elementu na liście
Algorytm wyszukiwania elementu w liście jedno- i
dwukierunkowej
Cel: Wyszukanie elementu na liście;
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 5
5 / 40
Wyszukiwanie elementu na liście
Algorytm wyszukiwania elementu w liście jedno- i
dwukierunkowej
Cel: Wyszukanie elementu na liście;
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 := head[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 5
5 / 40
Wyszukiwanie elementu na liście
Złożoność
Procedura List-Search(L, k) wyznacza pierwszy element o kluczu k
na liście L. Ponieważ niekiedy potrzebne jest przejście całej listy L, aby
znaleźć element o kluczu k, to pesymistyczny czas działania
procedury List-Search na liście o n elementach wynosi O(n).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
6 / 40
Wyszukiwanie elementu na liście 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 5
7 / 40
Wyszukiwanie elementu na liście jednokierunkowej pewna implementacja
Definicja funkcji Node* search(List const* L, T x);
// zwraca wskaźnik do pierwszego wystapienia
˛
// elementu x na liście L
Node* search(List const* L, T x)
{
Node *p = L->first;
while (p != NULL) {
if (p->value == x) {
return p;
}
p = p->next;
}
return NULL;
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
8 / 40
Wyszukiwanie elementu na liście 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;
} List;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
9 / 40
Wyszukiwanie elementu na liście dwukierunkowej pewna implementacja
Definicja funkcji Node* search(List const* L, T x);
// zwraca wskaźnik do pierwszego wystapienia
˛
// elementu x na liście L
Node* search(List const* L, T x)
{
Node *p = L->first;
while (p != NULL) {
if (p->value == x) {
return p;
}
p = p->next;
}
return NULL;
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
10 / 40
Dołaczanie
˛
elementu do listy jednokierunkowej
Algorytm wstawiania elementu do listy jednokierunkowej na
poczatek
˛
Cel: Dołaczanie
˛
elementu do listy jednokierunkowej na poczatek;
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
11 / 40
Dołaczanie
˛
elementu do listy jednokierunkowej
Algorytm wstawiania elementu do listy jednokierunkowej na
poczatek
˛
Cel: Dołaczanie
˛
elementu do listy jednokierunkowej na poczatek;
˛
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 5
11 / 40
Dołaczanie
˛
elementu do listy jednokierunkowej
Algorytm wstawiania elementu do listy jednokierunkowej na
poczatek
˛
Cel: Dołaczanie
˛
elementu do listy jednokierunkowej na poczatek;
˛
Dane wejściowe:
Położenie pierwszego elementu listy (np. wskaźnik na ten element);
Dołaczany
˛
element;
Algorytm:
List-Insert-1-Begin(L,x)
1: next[x]:= head[L];
2: head[L] := x;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
11 / 40
Dołaczanie
˛
elementu do listy jednokierunkowej na
poczatek
˛
Złożoność
Procedura List-Insert-1-Begin(L, x) przyłacza
˛
element x (dla którego
pole key zostało wcześniej zainicjowane) na poczatek
˛
listy
jednokierunkowej. Procedura List-Insert-1-Begin na liście o n
elementach działa w czasie O(1).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
12 / 40
Dołaczanie
˛
elementu do listy jednokierunkowej przykład
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
13 / 40
Dołaczanie
˛
elementu do listy jednokierunkowej na
poczatek
˛
- 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) {
L->first = L->last = p;
} else {
p->next = L->first;
L->first = p;
}
// lista pusta
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
14 / 40
Dołaczanie
˛
elementu do listy dwukierunkowej
Algorytm wstawiania elementu do listy dwukierunkowej na
poczatek
˛
Cel: Dołaczanie
˛
elementu do listy dwukierunkowej na poczatek;
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
15 / 40
Dołaczanie
˛
elementu do listy dwukierunkowej
Algorytm wstawiania elementu do listy dwukierunkowej na
poczatek
˛
Cel: Dołaczanie
˛
elementu do listy dwukierunkowej na poczatek;
˛
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 5
15 / 40
Dołaczanie
˛
elementu do listy dwukierunkowej
Algorytm wstawiania elementu do listy dwukierunkowej na
poczatek
˛
Cel: Dołaczanie
˛
elementu do listy dwukierunkowej na poczatek;
˛
Dane wejściowe:
Położenie pierwszego elementu listy (np. wskaźnik na ten element);
Dołaczany
˛
element;
Algorytm:
List-Insert-Begin(L,x)
1: next[x]:= head[L];
2: if (head[L]!= NIL) then
3:
prev[head[L]] := x;
4: end if
5: head[L] := x;
6: prev[x] := NIL;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
15 / 40
Dołaczanie
˛
elementu do listy dwukierunkowej na
poczatek
˛
Złożoność
Procedura List-Insert-Begin(L, k) przyłacza
˛
element x (dla którego
pole key zostało wcześniej zainicjowane) na poczatek
˛
listy. Procedura
List-Insert-Begin na liście o n elementach działa w czasie O(1).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
16 / 40
Dołaczanie
˛
elementu do listy dwukierunkowej przykład
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
17 / 40
Dołaczanie
˛
elementu do listy dwukierunkowej na
poczatek
˛
- pewna implementacja
Definicja funkcji void push_front(List* L, T w);
void push_front(List* L, T w)
{
// Zadanie na ćwiczenia
// Napisz definicje !!!
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
18 / 40
Dołaczanie
˛
elementu do listy jednokierunkowej
Algorytm wstawiania elementu do listy jednokierunkowej na
koniec
Cel: Dołaczanie
˛
elementu do listy jednokierunkowej na koniec;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
19 / 40
Dołaczanie
˛
elementu do listy jednokierunkowej
Algorytm wstawiania elementu do listy jednokierunkowej na
koniec
Cel: Dołaczanie
˛
elementu do listy jednokierunkowej na koniec;
Dane wejściowe:
Położenie ostatniego elementu listy (np. wskaźnik na ten element);
Dołaczany
˛
element;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
19 / 40
Dołaczanie
˛
elementu do listy jednokierunkowej
Algorytm wstawiania elementu do listy jednokierunkowej na
koniec
Cel: Dołaczanie
˛
elementu do listy jednokierunkowej na koniec;
Dane wejściowe:
Położenie ostatniego elementu listy (np. wskaźnik na ten element);
Dołaczany
˛
element;
Algorytm:
List-Insert-1-End(L,x)
1: if (tail[L]!= NIL) then
2:
next[tail[L]] := x;
3: end if
4: tail[L] := x;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
19 / 40
Dołaczanie
˛
elementu do listy jednokierunkowej na
koniec
Złożoność
Procedura List-Insert-1-End(L, k) przyłacza
˛
element x (dla którego
pole key zostało wcześniej zainicjowane) na koniec listy
jednokierunkowej. Procedura List-Insert-1-End na liście o n
elementach działa w czasie O(1).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
20 / 40
Dołaczanie
˛
elementu do listy jednokierunkowej na
koniec - przykład
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
21 / 40
Dołaczanie
˛
elementu do listy jednokierunkowej na
koniec - 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;
}
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
22 / 40
Dołaczanie
˛
elementu do listy dwukierunkowej
Algorytm wstawiania elementu do listy dwukierunkowej na
koniec
Cel: Dołaczanie
˛
elementu do listy dwukierunkowej na koniec;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
23 / 40
Dołaczanie
˛
elementu do listy dwukierunkowej
Algorytm wstawiania elementu do listy dwukierunkowej na
koniec
Cel: Dołaczanie
˛
elementu do listy dwukierunkowej na koniec;
Dane wejściowe:
Położenie ostatniego elementu listy (np. wskaźnik na ten element);
Dołaczany
˛
element;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
23 / 40
Dołaczanie
˛
elementu do listy dwukierunkowej
Algorytm wstawiania elementu do listy dwukierunkowej na
koniec
Cel: Dołaczanie
˛
elementu do listy dwukierunkowej na koniec;
Dane wejściowe:
Położenie ostatniego elementu listy (np. wskaźnik na ten element);
Dołaczany
˛
element;
Algorytm:
List-Insert-End(L,x)
1: if (tail[L]!= NIL) then
2:
next[tail[L]] := x;
3: end if
4: prev[x] := tail[L];
5: tail[L] := x;
6: next[x] := NIL;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
23 / 40
Dołaczanie
˛
elementu do listy dwukierunkowej na
koniec
Złożoność
Procedura List-Insert-End(L, k) przyłacza
˛
element x (dla którego pole
key zostało wcześniej zainicjowane) na koniec listy. Procedura
List-Insert-End na liście o n elementach działa w czasie O(1).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
24 / 40
Dołaczanie
˛
elementu do listy dwukierunkowej przykład
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
25 / 40
Dołaczanie
˛
elementu do listy dwukierunkowej na
koniec - pewna implementacja
Definicja funkcji void push_back(List* L, T w);
void push_back(List* L, T w)
{
// Zadanie na ćwiczenia
// Napisz definicje !!!
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
26 / 40
Usuwanie elementu z listy jednokierunkowej
Algorytm usuwania elementu z listy jednokierunkowej
Cel: Usuniecie
˛
wskazanego elementu z listy jednokierunkowej;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
27 / 40
Usuwanie elementu z listy jednokierunkowej
Algorytm usuwania elementu z listy jednokierunkowej
Cel: Usuniecie
˛
wskazanego elementu z listy jednokierunkowej;
Dane wejściowe:
Położenie pierwszego elementu listy (np. wskaźnik na ten element);
Element do usuniecia;
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
27 / 40
Usuwanie elementu z listy jednokierunkowej
Algorytm usuwania elementu z listy jednokierunkowej
Cel: Usuniecie
˛
wskazanego elementu z listy jednokierunkowej;
Dane wejściowe:
Położenie pierwszego elementu listy (np. wskaźnik na ten element);
Element do usuniecia;
˛
Algorytm:
List-Delete-1(L,x)
1: if (x==head[L]) then
2:
head[L] := next[x];
3: else
4:
y := head[L];
5:
while (next[y]!=x) do
6:
y := next[y];
7:
end while
8:
next[y]:= next[x];
9: end if
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
27 / 40
Usuwanie elementu z listy jednokierunkowej
Złożoność
Procedura List-Delete-1 usuwa element x z listy L. Ponieważ niekiedy
potrzebne jest przejście całej listy L, aby znaleźć element x, to
pesymistyczny czas działania procedury List-Delete-1 na liście o n
elementach wynosi O(n).
Bożena Woźna-Szcześniak (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 ćwiczenia
// Napisz definicje !!!
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
29 / 40
Usuwanie elementu z listy dwukierunkowej
Algorytm usuwania elementu z listy dwukierunkowej
Cel: Usuniecie
˛
wskazanego elementu z listy dwukierunkowej;
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
30 / 40
Usuwanie elementu z listy dwukierunkowej
Algorytm usuwania elementu z listy dwukierunkowej
Cel: Usuniecie
˛
wskazanego elementu z listy dwukierunkowej;
Dane wejściowe:
Położenie pierwszego elementu listy (np. wskaźnik na ten element);
Element do usuniecia;
˛
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
30 / 40
Usuwanie elementu z listy dwukierunkowej - Algorytm
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
List-Delete-2(L,x)
if (x==head[L]) then
head[L] := next[x];
prev[next[x]] := NIL;
else
y := head[L];
while (next[y]!=x) do
y := next[y];
end while
next[y]:= next[x];
if (next[x] != NIL) then
prev[next[x]] := y;
end if
end if
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
31 / 40
Usuwanie elementu z listy dwukierunkowej
Złożoność
Procedura List-Delete-2 usuwa element x z listy L. Ponieważ niekiedy
potrzebne jest przejście całej listy L, aby znaleźć element x, to
pesymistyczny czas działania procedury List-Delete-2 na liście o n
elementach wynosi O(n).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
32 / 40
Usuwanie elementu z listy dwukierunkowej - przykład
Bożena Woźna-Szcześniak (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 ćwiczenia
// Napisz definicje !!!
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
34 / 40
Usuwanie pierwszego elementu z listy
jednokierunkowej - pewna implementacja
Definicja funkcji void pop_front(List* L);
void pop_front(List* L)
{
// jeden element lub lista pusta
if (L->first == L->last) {
free(L->first);
L->first = L->last = NULL;
} else {
Node* p = L->first;
L->first = p->next;
free(p);
}
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
35 / 40
Usuwanie pierwszego elementu z listy
jednokierunkowej
Złożoność
Funkcja pop_front usuwa pierwszy element listy jednokierunkowej.
Funkcja pop_front na liście o n elementach działa w czasie O(1).
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
36 / 40
Usuwanie pierwszego elementu z listy
dwukierunkowej - pewna implementacja
Definicja funkcji void pop_front2(List* L);
void pop_front2(List* L)
{
//Zadanie na ćwiczenia
// Napisz definicje !!!
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
37 / 40
Usuwanie ostatniego elementu z listy
jednokierunkowej - pewna implementacja
Definicja funkcji void pop_back(List* L);
void pop_back(List* L) {
// jeden element lub lista pusta
if (L->first == L->last) {
free(L->first);
L->first = L->last = NULL;
} else {
Node* p = L->first;
// szukamy przedostatniego elementu listy
while ((p->next) != L->last) p=p->next;
L->last = p;
free(p->next); // i usuwamy go
p->next = NULL;
}
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
38 / 40
Usuwanie ostatniego elementu z listy
jednokierunkowej
Złożoność
Funkcja pop_back usuwa ostatni element z listy jednokierunkowej.
Ponieważ potrzebne jest przejście całej listy L, aby znaleźć
przedostatni element listy L, to pesymistyczny czas działania funkcji
pop_back na liście o n elementach wynosi O(n).
Bożena Woźna-Szcześniak (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 ćwiczenia
// Napisz definicje !!!
}
Bożena Woźna-Szcześniak (AJD)
Algorytmy i Struktury Danych.
Wykład 5
40 / 40

Podobne dokumenty