Programowanie i struktury danych 1 / 44
Lista dwukierunkowa Lista dwukierunkowa to liniowa struktura danych skªadaj ca si z ci gu elementów, z których ka»dy pami ta swojego nast pnika i poprzednika. Operacje na li±cie dwukierunkowej pozwalaj na wstawianie elementów z przodu, z tyªu i w ±rodku listy elementów. Najcz ±ciej elementy listy tworzymy u»ywaj c struktury struct elem { //dane przechowywane na li±cie elem* next; elem* prev; }; 2 / 44
Lista dwukierunkowa - ilustracja List dwukierunkow mo»na uto»samia z grup osób trzymaj cych si za r ce. Ka»da osoba trzyma swojego lewego i prawego s siada. W takiej strukturze mo»liwe jest dodawanie nowej osoby w dowolnym miejscu. Mo»liwe jest tak»e usuwanie osób z takiej listy. Nale»y wtedy pami ta,»eby po dodaniu/usuni ciu osoby skorygowa uchwyty dªoni. 3 / 44
Lista dwukierunkowa W li±cie wyró»niamy dwa w zªy head - gªowa - poczatek struct elem* head;... head->prev=null; tail - ogon - koniec struct elem* tail;... tail->next=null; 4 / 44
Stos Stos to liniowa struktura danych, do której dost p mo»liwy jest z jednego tylko ko«ca. Stos nazywany jest struktur LIFO - ostatni wchodzi, pierwszy wychodzi last in/rst out. 5 / 44
Operacje na stosie Wyró»niamy wierzchoªek stosu, czyli element, który umieszczony jest na szczycie - topstos Nowe elementy kªadzione s zawsze na szczyt stosu - push(element) W razie potrzeby pobieramy elementy ze szczytu stosu pop() 6 / 44
push(15) 7 / 44
push(15) 15 8 / 44
push(15) push(1) 15 9 / 44
push(15) push(1) 1 15 10 / 44
push(15) push(1) push(0) 1 15 11 / 44
push(15) push(1) push(0) 0 1 15 12 / 44
push(15) push(1) push(0) push(37) 0 1 15 13 / 44
push(15) push(1) push(0) push(37) 37 0 1 15 14 / 44
push(15) push(1) push(0) push(37) push(84) 37 0 1 15 15 / 44
push(15) push(1) push(0) push(37) push(84) 84 37 0 1 15 16 / 44
push(15) push(1) push(0) push(37) push(84) pop() 84 37 0 1 15 17 / 44
push(15) push(1) push(0) push(37) push(84) pop() 37 0 1 15 zdj to 84 18 / 44
push(15) push(1) push(0) push(37) push(84) pop() pop() 37 0 1 15 19 / 44
push(15) push(1) push(0) push(37) push(84) pop() pop() 0 1 15 zdj to 37 20 / 44
push(15) push(1) push(0) push(37) push(84) pop() pop() push(54) 0 1 15 21 / 44
push(15) push(1) push(0) push(37) push(84) pop() pop() push(54) 54 0 1 15 22 / 44
Stos Klasyczne implementacje stosu tablicowa listowa 23 / 44
Przykªad u»ycia stosu - sprawdzenie poprawno±ci u»ycia nawiasów 1: dopóki nie jet koniec wyra»enie, wczytaj znak ch 2: { 3: switch (ch) 4: { 5: case '{' : 6: case '[' : 7: case '(' : stos.push(ch) break 8: case '}' : 9: case ']' : 10: case ')' : 11: je»eli (! stos.isempty()) 12: { chx=stos.pop() 13: je»eli ((ch='}' ) i (chx!='{')) lub 14: ((ch=']' ) i (chx!='[')) lub 15: ((ch=')' ) i (chx!='(')) 16: bª d 17: }else 18: bª d 19: break 20: } 21: je»eli (! stos.isempty()) 22: return bª d nawiasu zamykaj cego 24 / 44
Kolejka Kolejka to liniowa struktura danych. Nowe elementy sa dodawane na ko«cu, natomiast przetwarzane s elementy z pocz tku kolejki. Kolejka jest struktur typu FIFO - pierwszy wchodzi, pierwszy wychodzi. rst in, rst out. 25 / 44
Operacje na kolejce rstel() - zwraca pierwszy element kolejki nie usuwaj c go enqueue(el) - wstawanie elementu el na koniec kolejki dequeue() - pobranie pierwszego elementu 26 / 44
enqueue(15) 27 / 44
enqueue(15) 15 28 / 44
enqueue(15) enqueue(1) 15 29 / 44
enqueue(15) enqueue(1) 1 15 30 / 44
enqueue(15) enqueue(1) enqueue(0) 1 15 31 / 44
enqueue(15) enqueue(1) enqueue(0) 0 1 15 32 / 44
enqueue(15) enqueue(1) enqueue(0) enqueue(37) 0 1 15 33 / 44
enqueue(15) enqueue(1) enqueue(0) enqueue(37) 37 0 1 15 34 / 44
enqueue(15) enqueue(1) enqueue(0) enqueue(37) enqueue(84) 37 0 1 15 35 / 44
enqueue(15) enqueue(1) enqueue(0) enqueue(37) enqueue(84) 84 37 0 1 15 36 / 44
enqueue(15) enqueue(1) enqueue(0) enqueue(37) enqueue(84) dequeue() 84 37 0 1 15 37 / 44
enqueue(15) enqueue(1) enqueue(0) enqueue(37) enqueue(84) dequeue() 84 37 0 1 15 38 / 44
enqueue(15) enqueue(1) enqueue(0) enqueue(37) enqueue(84) dequeue() dequeue() 84 37 0 1 39 / 44
enqueue(15) enqueue(1) enqueue(0) enqueue(37) enqueue(84) dequeue() dequeue() 84 37 0 40 / 44
enqueue(15) enqueue(1) enqueue(0) enqueue(37) enqueue(84) dequeue() dequeue() enqueue(54) 84 37 0 41 / 44
enqueue(15) enqueue(1) enqueue(0) enqueue(37) enqueue(84) dequeue() dequeue() enqueue(54) 54 84 37 0 42 / 44
Zadania 1 Dla listy dwukierunkowej, przechowuj cej elementy okre±lonego typu (np. liczby caªkowite, zmiennoprzecinkowe itp.) wykonaj nast puj ce operacje: utwórz list n losowych elementów wybranego typu (gdzie n oraz zakres danych s parametrami), wy±wietl zawarto± listy od ko«ca, dodaj na pocz tek listy 2 dodatkowe elementy (ich warto±ci mo»na wprowadzi z klawiatury), wy±wietl ile elementów zawiera lista. 2 Dla stosu przechowuj cego elementy okre±lonego typu (np. liczby caªkowite, zmiennoprzecinkowe itp.) wykonaj nast puj ce operacje: umie± n losowych elementów na stosie (gdzie n oraz zakres danych s parametrami), wy±wietl element znajduj cy si na szczycie stosu, usu«element ze szczytu stosu (nale»y sprawdzi, czy na stosie znajduj si elementy), umie± element na szczycie stosu, ponownie wy±wietl element znajduj cy si na szczycie stosu, wy±wietl ilo± elementów znajduj cych si na stosie. 3 Dla kolejki przechowuj cej elementy okre±lonego typu (np. liczby caªkowite, zmiennoprzecinkowe itp.) wykonaj nast puj ce operacje: umie± n losowych elementów w kolejce (gdzie n oraz zakres danych s parametrami), wy±wietl element znajduj cy si na pocz tku kolejki, usu«pierwszy element z kolejki (nale»y sprawdzi, czy w kolejce znajduj si elementy), wy±wietl ilo± elementów znajduj cych si w kolejce oraz oblicz ich sum. 43 / 44
Dzi kuj za uwag!!! 44 / 44