. Podstawy Programowania 2. Dwukierunkowa lista liniowa. Arkadiusz Chrobot. 7 kwietnia 2019
|
|
- Stefan Przybylski
- 6 lat temu
- Przeglądów:
Transkrypt
1 .. Podstawy Programowania 2 Dwukierunkowa lista liniowa Arkadiusz Chrobot Zakład Informatyki 7 kwietnia / 55
2 Plan.1 Wstęp.2 Typ bazowy i wskaźnik listy Tworzenie listy Dodawanie elementu do listy Usuwanie elementu z listy Wypisywanie zawartości listy Usuwanie listy.3 Podsumowanie 2 / 55
3 Wstęp Wstęp Dwukierunkowa lista liniowa (ang. doubly linked list) jest kolejnym po liście jednokierunkowej przykładem listy liniowej. Te dwie struktury są do siebie dosyć zbliżone. Od strony użytkowej różnie je to, że dwukierunkowa lista liniowa posiada budowę, która umożliwia w prosty sposób przeglądanie jej, zgodnie z jej nazwą, w dwóch kierunkach. Na tym wykładzie zostanie przedstawiona implementacja tej listy w postaci dynamicznej struktury danych. 3 / 55
4 Podobnie jak w przypadku poprzednio opisywanej listy, dwukierunkowa lista liniowa zostanie przedstawiona na przykładzie programu, który korzysta z niej do przechowywania liczb naturalnych uszeregowanych nierosnąco. Będzie to zatem lista uporządkowana. Podobnie jak w przypadku jednokierunkowej listy liniowej najpierw zdefiniujemy typ bazowy listy i jej wskaźnik, a następnie pięć podstawowych operacji: tworzenia listy, dodawania nowego elementu do listy, usuwania elementu z listy, wyświetlania zawartości listy na ekran i usuwania listy. 4 / 55
5 Typ bazowy i wskaźnik listy Typ bazowy i wskaźnik listy 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 struct list_node 5 { 6 int data; 7 struct list_node *, *; 8 } *list_pointer; 5 / 55
6 Typ bazowy i wskaźnik listy Typ bazowy Zaprezentowany na poprzednim slajdzie typ bazowy dwukierunkowej listy liniowej różni się od typu bazowego innych poznanych przez nas dotychczas struktur danych posiadaniem dodatkowego pola wskaźnikowego. To pole, nazwane w przykładowym typie bazowym, służy do przechowywania adresu elementu listy, który poprzedza dany element. W dwukierunkowej liście liniowej może istnieć tylko jeden element, który będzie miał zapisaną wartość null w tym polu i jest to pierwszy element tej listy. Istnieje odmiana listy dwukierunkowej, której typ bazowy jest taki sam jak dla listy jednokierunkowej. Nie posiada ona nazwy w języku polskim, w języku angielskim nazywa się ją xor linked list. Dwa adresy są umieszczane w jednym polu wskaźnikowym poprzez wykonanie na nich operacji bitowej różnicy symetrycznej. Oszczędność pamięci jest w przypadku tej listy uzyskiwana kosztem bardziej skomplikowanych operacji. Taka implementacja nie będzie tutaj opisywana. Zaprezentowany przykładowy typ bazowy można dowolnie rozbudowywać i zmieniać, o ile zostaną zachowane oba pola wskaźnikowe niezbędne do budowy struktury dwukierunkowej listy. 6 / 55
7 Typ bazowy i wskaźnik listy Wskaźnik listy Wraz z definicją typu bazowego została wykonana deklaracja wskaźnika listy (zmienna list_pointer). W przeciwieństwie do listy jednokierunkowej nie musi on wskazywać początkowego elementu listy, wystarczy, aby wskazywał dowolny jej element. Niemniej jednak wygodniej będzie, jeśli każda operacja na liście po zakończeniu zostawi ten wskaźnik na pierwszym elemencie. Takie podejście zastosujemy w prezentowanym programie. Na listingu z definicją typu bazowego i deklaracją wskaźnika listy umieszczone są także instrukcje dołączające pliki nagłówkowe zawierające definicje funkcji używanych w programie. 7 / 55
8 Tworzenie listy Tworzenie listy Podobnie jak w przypadku jednokierunkowej listy liniowej operacja tworzenia listy, która równoważna jest utworzeniu jej pierwszego elementu i zapamiętaniu jego adresu we wskaźniku listy, będzie zrealizowana w osobnej funkcji o nazwie create_list(). Jej kod źródłowy jest zamieszczony na następnym slajdzie. 8 / 55
9 Tworzenie listy Tworzenie listy 1 struct list_node *create_list(int number) 2 { 3 struct list_node *first_node = (struct list_node *) 4 malloc(sizeof(struct list_node)); 5 if(first_node) { 6 first_node->data = number; 7 first_node-> = first_node-> = NULL; 8 } 9 return first_node; 10 } 9 / 55
10 Tworzenie listy Tworzenie listy Ponieważ definicja funkcji create_list() w wersji dla dwukierunkowej listy liniowej niewiele różni się od jej odpowiedniczki dla listy jednokierunkowej, to tutaj zostaną opisane jedynie najważniejsze różnice, które w całości zawierają się w wierszu nr 7. Otóż w nim wartość null jest przypisywana nie tylko do wskaźnika, ale również do wskaźnika pierwszego elementu. W przypadku tworzenia listy będzie on jej pierwszym i zarazem ostatnim elementem. Adres zwrócony przez tę funkcję w miejscu jej wywołania powinien zostać zapisany we wskaźniku listy. 10 / 55
11 Dodawanie elementu do listy Dodawanie elementu do listy Podobnie jak w przypadku jednokierunkowej listy liniowej będziemy wymagać, aby operacja dodania nowego elementu do dwukierunkowej listy liniowej była wykonywana na niepustej liście. Przyjmijmy także, że po wykonaniu tej operacji wskaźnik listy powinien wskazywać na jej pierwszy element, a w przypadku, kiedy nie uda się utworzyć nowego elementu, to stan listy powinien pozostać niezmieniony. 11 / 55
12 Dodawanie elementu do listy Dodawanie elementu do listy Istnieją trzy przypadki, które należy rozpatrzeć implementując operację dodawania nowego elementu do listy: 1. element jest dodawany na początku listy i zostanie jej pierwszym elementem, 2. element jest dodawany wewnątrz listy, 3. element jest dodawany na końcu listy i zostanie jej ostatnim elementem. Wszystkie te przy przypadki zostaną oprogramowane w osobnych funkcjach pomocniczych, które będą wywoływane z poziomu pojedynczej funkcji realizującej operację dodania elementu do dwukierunkowej listy liniowej. Najpierw jednak zostaną przedstawione kody źródłowe funkcji pomocniczych. 12 / 55
13 Dodawanie elementu do listy Dodawanie elementu do listy Dodanie na początek listy 1 struct list_node *add_at_front(struct list_node *list_pointer, 2 struct list_node *new_node) 3 { 4 new_node-> = list_pointer; 5 list_pointer-> = new_node; 6 return new_node; 7 } 13 / 55
14 Dodawanie elementu do listy Dodawanie elementu do listy Dodanie na początek listy W stosunku do swojej odpowiedniczki dla jednokierunkowej listy liniowej ta funkcja musi uwzględniać istnienie w każdym elemencie drugiego pola wskaźnikowego. Stąd w wierszu nr 5 w polu bieżącego pierwszego elementu listy zapisywany jest adres nowego elementu. Reszta wykonywanych instrukcji jest taka sama, jak dla jednokierunkowej listy liniowej. 14 / 55
15 Dodawanie elementu do listy Dodanie elementu do listy Wyszukanie miejsca Obsłużenie dwóch pozostałych przypadków będzie wymagało przeszukania listy. W wyniku przeprowadzenia tej operacji oczekujemy, że uzyskamy wskaźnik elementu, za którym dodamy nowy. Do jego lokalizacji możemy wykorzystać tę samą funkcję find_spot(), którą zdefiniowaliśmy dla jednokierunkowej listy liniowej. Jej kod źródłowy, celem przypomnienia, podany jest na następnym slajdzie. Dokonano w nim tylko jednej zmiany, zmieniono nazwę drugiego parametru. 15 / 55
16 Dodawanie elementu do listy Dodanie elementu do listy Wyszukanie miejsca 1 struct list_node *find_spot(struct list_node *list_pointer, 2 int number) 3 { 4 struct list_node * = NULL; 5 while(list_pointer&&list_pointer->data<number) { 6 = list_pointer; 7 list_pointer = list_pointer->; 8 } 9 return ; 10 } 16 / 55
17 Dodawanie elementu do listy Dodanie elementu do listy Dodanie wewnątrz listy 1 void add_in_middle(struct list_node *node, 2 struct list_node *new_node) 3 { 4 new_node-> = node; 5 new_node-> = node->; 6 node->-> = new_node; 7 node-> = new_node; 8 } 17 / 55
18 Dodawanie elementu do listy Dodanie elementu do listy Dodanie wewnątrz listy Dodanie elementu wewnątrz dwukierunkowej listy liniowej jest nieco bardziej skomplikowaną operacją niż dodanie elementu do listy jednokierunkowej, z uwagi na konieczność uwzględnienia dodatkowego pola wskaźnikowego. W wierszu nr 4 do pola nowego elementu jest zapisywany adres elementu, za którym ma on być wstawiony na liście (innymi słowy: ten element będzie go poprzedzał). W polu nowego elementu zapisywany jest z kolei adres elementu, przed którym będzie w liście umieszczony nowy (inaczej: element następujący po nim). Ta operacja wykonywana jest w wierszu nr 5. W wierszu nr 6 do pola tego elementu jest zapisywany adres nowego. Lewa strona tej instrukcji przypisania ma dosyć skompilowany zapis, ale oznacza on tylko tyle, że za pomocą wskaźnika elementu, który ma poprzedzać w liście nowy funkcja sięga do elementu, który ma się znaleźć za nowym i modyfikuje jego pole. Dzięki temu nowy element zostaje częściowo włączony do listy. 18 / 55
19 Dodawanie elementu do listy Dodanie elementu do listy Dodanie wewnątrz listy Pozostaje tylko w polu elementu poprzedzającego na liście nowy zapisać adres tego nowego elementu (wiersz 7). Proszę zwrócić uwagę, że wiersze 6 i 7 nie mogą być zamienione miejscami. Kolejne slajdy ilustrują działanie funkcji add_in_middle(). Kolorem żółtym zaznaczono pola, z których wartości będą kopiowane, a kolorem fioletowym pola, do których wartości będą kopiowane. 19 / 55
20 Dodawanie elementu do listy Dodanie elementu do listy Dodanie wewnątrz listy node new_node null null. Sytuacja przed wykonaniem wiersza nr 4 20 / 55
21 Dodawanie elementu do listy Dodanie elementu do listy Dodanie wewnątrz listy node new_node null. Sytuacja po wykonaniu wiersza nr 4 20 / 55
22 Dodawanie elementu do listy Dodanie elementu do listy Dodanie wewnątrz listy node new_node. Sytuacja po wykonaniu wiersza nr 5 20 / 55
23 Dodawanie elementu do listy Dodanie elementu do listy Dodanie wewnątrz listy node new_node. Sytuacja po wykonaniu wiersza nr 6 20 / 55
24 Dodawanie elementu do listy Dodanie elementu do listy Dodanie wewnątrz listy node new_node. Sytuacja po wykonaniu wiersza nr 7 20 / 55
25 Dodawanie elementu do listy Dodanie elementu do listy Dodanie na koniec listy 1 void add_at_back(struct list_node *last_node, 2 struct list_node *new_node) 3 { 4 last_node-> = new_node; 5 new_node-> = last_node; 6 } 21 / 55
26 Dodawanie elementu do listy Dodanie elementu do listy Dodanie na koniec listy Do funkcji add_at_back() przekazywane są dwa wskaźniki. Pierwszy z nich wskazuje na bieżący ostatni element listy, a drugi na nowy element listy, który ma być dodany na jej końcu. W wierszu nr 4 w polu aktualnego końcowego elementu listy zapisywany jest adres nowego elementu. Tym samym nowy element zostaje ostatnim elementem listy. Nie jest on jednak w pełni do niej podłączony, dlatego w wierszu nr 5 w polu tego elementu zapisywany jest adres elementu wskazywanego przez last_node. Po wykonaniu tej operacji nowy element staje się integralną częścią listy i jej ostatnim elementem. 22 / 55
27 Dodawanie elementu do listy Funkcja add_node() 1 struct list_node *add_node(struct list_node *list_pointer, int number) 2 { 3 if(list_pointer) { 4 struct list_node *new_node = (struct list_node *) 5 malloc(sizeof(struct list_node)); 6 if(new_node) { 7 new_node->data = number; 8 new_node-> = new_node-> = NULL; 9 if(list_pointer->data>=number) 10 return add_at_front(list_pointer,new_node); 11 else { 12 struct list_node *node = find_spot(list_pointer, number); 13 if(node->) 14 add_in_middle(node, new_node); 15 else 16 add_at_back(node, new_node); 17 } 18 } 19 } 20 return list_pointer; 21 } 23 / 55
28 Dodawanie elementu do listy Funkcja add_node() Kod funkcji add_node() jest nieco bardziej skomplikowany niż jej odpowiedniczki dla jednokierunkowej listy liniowej. Role parametrów, ani znaczenie wartości zwracanej nie uległy zmianie. Funkcja add_node() dla dwukierunkowej listy liniowej najpierw sprawdza, czy przekazana jej lista nie jest pusta (wiersz 3). Gdyby tak było, to jej działanie się zakończy wykonaniem wiersza nr 20 - lista pozostanie pusta. W przeciwnym przypadku funkcja przydzieli pamięć na nowy element (wiersze 4 i 5), a następnie sprawdzi, czy ten przydział się powiódł (wiersz nr 6). Jeśli tak będzie, to nastąpi inicjacja pól nowego elementu (wiersze 7 i 8) i rozpoznanie, który z przypadków operacji wstawiania trzeba wykonać. W przeciwnym przypadku działanie funkcji także kończy się wykonaniem wiersza nr 20 i także tym razem stan listy pozostaje niezmieniony. W wierszu nr 9 funkcja sprawdza, czy ma wstawić nowy element na początku listy. Jeśli tak, to wywołuje funkcję pomocniczą add_at_front() i po jej wykonaniu kończy swe działanie. W przeciwnym przypadku ustala element listy za którym ma się pojawić nowy przy pomocy wywołania funkcji find_spot(). 24 / 55
29 Dodawanie elementu do listy Funkcja add_node() W wierszu nr 13 sprawdza ona, czy znaleziony element nie jest ostatnim na liście. Jeśli tak, to wywołuje funkcję add_in_middle(), a w przeciwnym przypadku add_at_back() i kończy swe działanie. 25 / 55
30 Usuwanie elementu z listy Usuwanie elementu z listy Operacja usunięcia elementu z dwukierunkowej listy liniowej jest również wykonywana trochę odmiennie niż w przypadku listy jednokierunkowej. Mimo podobieństw różnice są na tyle duże, że jej implementacja jest bardziej skomplikowana. Podobnie jak dla poprzednio przedstawionej listy będziemy wymagać, aby lista po wykonaniu tej operacji przestała istnieć, jeśli była listą jednoelementową, została pomniejszona o jeden element, ale zachowała spójną budowę lub by jej stan nie uległ zmianie, jeśli nie zawiera ona elementu, który należałoby zwolnić. 26 / 55
31 Usuwanie elementu z listy Usuwanie elementu z listy Podobnie jak w przypadku listy jednokierunkowej wyróżniamy cztery przypadki, które należy uwzględnić implementując usuwanie elementu z listy: 1. usuwanie pierwszego elementu z listy, 2. usuwanie elementu z wnętrza listy, 3. usuwanie elementu z końca listy, 4. lista nie zawiera elementu, który należy usunąć. Trzy pierwsze przypadki są obsługiwane przez funkcje pomocnicze, które zostaną przedstawione i opisane na następnych slajdach. Są one wywoływane z poziomu funkcji delete_node(), która zostanie przedstawiona i udokumentowana po nich. Czwarty przypadek nie wymaga osobnego podprogramu. 27 / 55
32 Usuwanie elementu z listy Usuwanie z początku listy 1 struct list_node *delete_at_front(struct list_node *list_pointer) 2 { 3 struct list_node * = list_pointer->; 4 if() 5 -> = NULL; 6 free(list_pointer); 7 return ; 8 } 28 / 55
33 Usuwanie elementu z listy Usuwanie z początku listy Funkcja delete_at_front() w porównaniu do swojej odpowiedniczki dla jednokierunkowej listy liniowej musi uwzględniać istnienie pola w drugim elemencie listy, który znajdzie się na jej początku po usunięciu pierwszego elementu. Zatem w wierszu nr 4 sprawdza ona, czy istnieje kolejny element listy. Jeśli nie, to usuwany element jest ostatnim elementem listy i funkcja przechodzi bezpośrednio do wykonania wiersza nr 6. Jeśli tak, to w polu kolejnego elementu zapisywana jest wartość null (wiersz nr 5), bo stanie się on pierwszym elementem listy. Po wykonaniu tej czynności dopiero jest zwalniany dotychczasowy pierwszy element (ponownie wiersz nr 6). Funkcja kończy się zwracając wartość swojego lokalnego wskaźnika o nazwie. 29 / 55
34 Usuwanie elementu z listy Wyszukiwanie elementu 1 struct list_node *find_node(struct list_node *list_pointer, 2 int number) 3 { 4 while(list_pointer&&list_pointer->data!=number) 5 list_pointer = list_pointer->; 6 return list_pointer; 7 } 30 / 55
35 Usuwanie elementu z listy Wyszukiwanie elementu Funkcja find_node() zwraca adres elementu listy zawierającego w polu data liczbę przekazaną jej przez parametr number. Za pomocą pierwszego parametru do funkcji jest przekazywany wskaźnik na listę. W pętli while (wiersze 4 i 5) funkcja sprawdza każdy element listy, czy zawiera on taką samą liczbę jak parametr number. Pętla ta wykonuje się tak długo, aż zostanie znaleziony dany element lub lista się skończy. Wynik tego poszukiwania (adres elementu lub wartość null) po jej zakończeniu będzie zapisany we wskaźniku list_pointer i zawartość tego wskaźnika zostanie przez funkcję zwrócona. 31 / 55
36 Usuwanie elementu z listy Usuwanie z wnętrza listy 1 void delete_in_middle(struct list_node *node) 2 { 3 node->-> = node->; 4 node->-> = node->; 5 free(node); 6 } 32 / 55
37 Usuwanie elementu z listy Usuwanie z wnętrza listy Zaprezentowana na poprzednim slajdzie funkcja usuwa z wnętrza listy element, którego adres został jej przekazany przez parametr. W tym celu najpierw w wierszach 3 i 4 wyłącza go z listy, a następnie zwalnia pamięć na niego przeznaczoną w wierszu nr 5. W wierszu nr 3 funkcja za pomocą przekazanego jej wskaźnika na usuwany element sięga do elementu, który jest na liście następny w stosunku do niego i zapisuje w jego polu adres elementu poprzedzającego ten wskazywany przez node. W wierszu nr 4 wykonywana jest czynność dotycząca przeciwnych kierunków, tzn. za pomocą przekazanego wskaźnika funkcja sięga do elementu poprzedzającego element wskazywany przez node (lewa strona instrukcji przypisania) i zapisuje w jego polu adres elementu, który występuje jako następny po tym wskazywanym przez node (prawa strona instrukcji przypisania). Kolejne slajdy obrazują działanie tej funkcji. Znaczenie kolorów jest takie samo jak na poprzednio zaprezentowanych ilustracjach. 33 / 55
38 Usuwanie elementu z listy Usuwanie z wnętrza listy node. Przed wykonaniem wiersza nr 3 34 / 55
39 Usuwanie elementu z listy Usuwanie z wnętrza listy node. Po wykonaniu wiersza nr 3 34 / 55
40 Usuwanie elementu z listy Usuwanie z wnętrza listy node. Przed wykonaniem wiersza nr 4 34 / 55
41 Usuwanie elementu z listy Usuwanie z wnętrza listy node. Po wykonaniu wiersza nr 4 34 / 55
42 Usuwanie elementu z listy Usuwanie z wnętrza listy node. Po wykonaniu wiersza nr 5 34 / 55
43 Usuwanie elementu z listy Usuwanie z końca listy 1 void delete_at_back(struct list_node *last_node) 2 { 3 last_node->-> = NULL; 4 free(last_node); 5 } 35 / 55
44 Usuwanie elementu z listy Usuwanie z końca listy Funkcja delete_at_back() jest odpowiedzialna za usunięcie ostatniego elementu listy. Wskaźnik na ten element jest jej przekazywany przez parametr. Za jego pomocą w wierszu nr 3 ta funkcja sięga do elementu poprzedzającego element usuwany i w polu tego pierwszego zapisuje wartość null. Ten element stanie się ostatnim na liście. W wierszu nr 4 funkcja zwalnia pamięć na element wskazywany przez parametr last_node. 36 / 55
45 Usuwanie elementu z listy Usunięcie z listy 1 struct list_node *delete_node(struct list_node *list_pointer, 2 int number) 3 { 4 if(list_pointer) { 5 if(list_pointer->data==number) 6 return delete_at_front(list_pointer); 7 else { 8 struct list_node *node = find_node(list_pointer, 9 number); 10 if(node) { 11 if(node->) 12 delete_in_middle(node); 13 else 14 delete_at_back(node); 15 } 16 } 17 } 18 return list_pointer; 37 / 55
46 Usuwanie elementu z listy Usunięcie z listy Funkcja delete_node(), tak jak add_node() jest bardziej skomplikowana od swojej odpowiedniczki dla jednokierunkowej listy liniowej. Znaczenie jej parametrów i wartości zwracanej pozostało takie samo. Funkcja na wstępie (wiersz nr 4) sprawdza, czy lista na której ma być wykonana operacja istnieje. Jeśli nie to zwraca wartość wskaźnika list_pointer, czyli w tym wypadku null. Jeśli jednak lista istnieje, to funkcja najpierw sprawdza, czy ma zostać usunięty jej pierwszy element. Jeśli odpowiedź na to pytanie jest prawdziwa, to wywołuje delete_at_front(), zwraca jej wynik i kończy swe działanie. W przeciwnym przypadku ustala za pomocą wywołania funkcji find_node() adres elementu, który powinien zostać usunięty. Jeśli ta funkcja zwróci wartość null, co sprawdzane jest w wierszu nr 10, to będzie to oznaczało, że nie ma elementu do usunięcia na liście i delete_node() zakończy działanie wykonując wiersz nr / 55
47 Usuwanie elementu z listy Usunięcie z listy Jeśli adres zwrócony przez funkcję find_node() będzie różny od null, to funkcja w wierszu nr 11 sprawdzi, czy usuwany element jest wewnątrz listy. Jeśli tak, to wywoła celem jego usunięcia delete_in_middle(). Jeśli jednak okaże się, że usunięty powinien być ostatni element listy, to wywołana zostanie delete_at_back() (wiersz 14). Niezależnie od tego, która z nich zostanie wywołana funkcja delete_node() po ich wykonaniu kończy swe działanie zwracając wartość wskaźnika list_pointer. 39 / 55
48 Wypisywanie zawartości listy Wypisywanie zawartości listy Wypisywanie w obu kierunkach 1 void print_list_in_both_directions(struct list_node 2 *list_pointer) 3 { 4 struct list_node *backward_pointer = NULL; 5 while(list_pointer) { 6 backward_pointer = list_pointer; 7 printf("%d ",list_pointer->data); 8 list_pointer = list_pointer->; 9 } 10 puts(""); 11 while(backward_pointer) { 12 printf("%d ",backward_pointer->data); 13 backward_pointer = backward_pointer->; 14 } 15 puts(""); 16 } 40 / 55
49 Wypisywanie zawartości listy Wypisywanie zawartości listy Funkcja, której kod źródłowy został zaprezentowany na poprzednim slajdzie wypisuje zawartość elementów listy w obu możliwych kierunkach, tj. od początku do końca i od końca do początku. Pierwszy przypadek jest wykonywany w pierwszej pętli while (wiersze 5-9). W tej pętli używany jest także wskaźnik backward_pointer, który poza jej pierwszą i ostatnią iteracją wskazuje na element poprzedzający element listy wskazywany wskaźnikiem list_pointer. Po zakończeniu pierwszej pętli while wskaźnik backward_pointer wskazuje na ostatni element listy. W drugiej pętli while ten wskaźnik jest używany do iterowania w odwrotnym kierunku po liście. Jego wartość w każdej jej iteracji jest zastępowana wartością pola elementu, na który on wskazuje. 41 / 55
50 Usuwanie listy Usuwanie listy 1 void remove_list(struct list_node **list_pointer) 2 { 3 while(*list_pointer) { 4 struct list_node * = (*list_pointer)->; 5 free(*list_pointer); 6 *list_pointer = ; 7 } 8 } 42 / 55
51 Usuwanie listy Usuwanie listy Funkcja usuwająca listę z pamięci jest taka sama jak dla listy jednokierunkowej. 43 / 55
52 Usuwanie listy Funkcja main() Część pierwsza 1 int main(void) 2 { 3 list_pointer = create_list(1); 4 int i; 5 for(i=2; i<5; i++) 6 list_pointer = add_node(list_pointer,i); 7 for(i=6; i<10; i++) 8 list_pointer = add_node(list_pointer,i); 9 print_list_in_both_directions(list_pointer); 44 / 55
53 Usuwanie listy Funkcja main() Część pierwsza Podobnie jak w przypadku listy jednokierunkowej listę dwukierunkową tworzymy z najpierw jednym elementem o wartości 1, a następnie dodajemy do niej elementy o wartościach od 2 do 4 i od 6 do 9. Następnie zawartość listy jest dwukrotnie i dwukierunkowo wypisywana (wiersz nr 9). 45 / 55
54 Usuwanie listy Funkcja main() Część druga 1 list_pointer = add_node(list_pointer,0); 2 print_list_in_both_directions(list_pointer); 3 list_pointer = add_node(list_pointer,5); 4 print_list_in_both_directions(list_pointer); 5 list_pointer = add_node(list_pointer,7); 6 print_list_in_both_directions(list_pointer); 7 list_pointer = add_node(list_pointer,10); 8 print_list_in_both_directions(list_pointer); 46 / 55
55 Usuwanie listy Funkcja main() Część druga Aby przetestować działanie funkcji add_node() w funkcji main() programu do dwukierunkowej listy liniowej dodawane są nowe elementy o wartościach odpowiednio 0 (dodanie na początek listy), 5 (dodanie wewnątrz listy), 7 (dodanie wewnątrz listy przed elementem o takiej samej wartości) i 10 (dodanie na koniec listy). Po wykonaniu każdej z tych operacji zawartość listy jest wypisywana dwukierunkowo na ekranie. 47 / 55
56 Usuwanie listy Funkcja main() Część trzecia 1 list_pointer = delete_node(list_pointer,0); 2 print_list_in_both_directions(list_pointer); 3 list_pointer = delete_node(list_pointer,1); 4 print_list_in_both_directions(list_pointer); 5 list_pointer = delete_node(list_pointer,1); 6 print_list_in_both_directions(list_pointer); 7 list_pointer = delete_node(list_pointer,5); 8 print_list_in_both_directions(list_pointer); 9 list_pointer = delete_node(list_pointer,7); 10 print_list_in_both_directions(list_pointer); 11 list_pointer = delete_node(list_pointer,10); 12 print_list_in_both_directions(list_pointer); 13 remove_list(&list_pointer); 14 return 0; 15 } 48 / 55
57 Usuwanie listy Funkcja main() Część trzecia Podobnie jak w przypadku add_node(), aby przetestować działanie funkcji delete_node() z dwukierunkowej listy liniowej usuwane są elementy o wartościach 0 (początek listy), 1 (ponownie początek listy), 1 (nieistniejący element), 5 (wnętrze listy), 7 (pierwszy z dwóch elementów listy zawierających tę samą liczbę) oraz 10 (ostatni element listy). Po każdej takiej operacji zawartość listy jest wypisywana dwukierunkowo. Na zakończenie programu lista jest usuwana (wiersz nr 13) i kończy się działanie funkcji main(). 49 / 55
58 Podsumowanie Podsumowanie Przedstawiona implementacja dwukierunkowych list liniowych nie jest jedyną, jaką można zbudować. Dwukierunkowe listy liniowe mogą być zrealizowane również w oparciu o tablice jedno lub wielowymiarowe, podobnie jak listy jednokierunkowe. Istnieją również dwukierunkowe listy liniowe z wartownikami. Dynamiczne dwukierunkowe listy liniowe mogą posłużyć do budowy stosu lub kolejek. W pewnych zastosowaniach listy dwukierunkowe mają pewną przewagę nad listami jednokierunkowymi - podwójne powiązanie każdego z elementów. Ma to znaczenie np. w przypadku systemów plików, gdzie takie listy reprezentują plik. W takim przypadku są one tworzone nie w pamięci operacyjnej komputera lecz w pamięci masowej, np. na twardym dysku. 50 / 55
59 Podsumowanie Podsumowanie W zaprezentowanych funkcjach, takich jak delete_in_middle() lub delete_at_back() można zauważyć skomplikowane wyrażenia budowane przy użyciu wskaźników. Następne slajdy pokazują jeszcze bardziej skomplikowane przypadki takich wyrażeń. Odnoszą się one do przedstawionej w górnej części slajdów listy. Wskaźnik node, który występuje na początku każdego takiego wyrażenia również jest zamieszczony na podanej ilustracji. Proszę spróbować ustalić wartości tych wyrażeń. 51 / 55
60 Podsumowanie Podsumowanie node 5 null null. Wyrażenie nr 1. node->->->data 52 / 55
61 Podsumowanie Podsumowanie node 5 null null. Wyrażenie nr 1.. node->->->data. Odpowiedź nr / 55
62 Podsumowanie Podsumowanie node 5 null null. Wyrażenie nr 2.. node->->->->data 52 / 55
63 Podsumowanie Podsumowanie node 5 null null. Wyrażenie nr 2.. node->->->->data. Odpowiedź nr / 55
64 Podsumowanie Podsumowanie node 5 null null. Wyrażenie nr 3. ṇode->->->->->->->data 52 / 55
65 Podsumowanie Podsumowanie node 5 null null. Wyrażenie nr 3. ṇode->->->->->->->data. Odpowiedź nr / 55
66 Podsumowanie Podsumowanie Reguła odczytu tych wyrażeń jest dosyć prosta - należy podążać za wskaźnikami. Warto jednak zwrócić uwagę na ostanie wyrażenie, gdzie wymieszane jest użycie wskaźników i. Te wskaźniki wzajemnie znoszą się. Zatem to wyrażenie można zapisać w skróconej formie jako: node->->->data. Wniosek jaki nasuwa się po zapoznaniu się z tak rozbudowanymi wyrażeniami wskaźnikowymi jest następujący: Należy wiedzieć jak czytać takie wyrażenia i jak one działają, ale powinno unikać się stosowania ich w programach. 53 / 55
67 Zakończenie Pytania? 54 / 55
68 Zakończenie koniec Dziękuję Państwu za uwagę! 55 / 55
Podstawy Programowania 2 Dwukierunkowa lista liniowa. Plan. Wstęp. Implementacja. Notatki. Notatki. Notatki. Notatki.
Podstawy Programowania 2 Dwukierunkowa lista liniowa Arkadiusz Chrobot Zakład Informatyki 7 kwietnia 2019 1 / 55 Plan Wstęp Implementacja Typ bazowy i wskaźnik listy Tworzenie listy Dodawanie elementu
Podstawy Programowania 2 Jednokierunkowa lista liniowa. Plan. Jednokierunkowa lista liniowa. Jednokierunkowa lista liniowa. Notatki. Notatki.
Podstawy Programowania 2 Jednokierunkowa lista liniowa Arkadiusz Chrobot Zakład Informatyki 26 marca 2019 1 / 57 Plan Jednokierunkowa lista liniowa Implementacja Typ bazowy i wskaźnik listy Tworzenie listy
. Podstawy Programowania 2. Jednokierunkowa lista liniowa. Arkadiusz Chrobot. 28 marca 2017
.. Podstawy Programowania 2 Jednokierunkowa lista liniowa Arkadiusz Chrobot Zakład Informatyki 28 marca 2017 1 / 57 Plan.1 Jednokierunkowa lista liniowa.2 Implementacja Typ bazowy i wskaźnik listy Tworzenie
. Podstawy Programowania 2. Dwukierunkowa lista cykliczna. Arkadiusz Chrobot. 24 kwietnia 2016
.. Podstawy Programowania 2 Dwukierunkowa lista cykliczna Arkadiusz Chrobot Zakład Informatyki 24 kwietnia 2016 1 / 38 Plan.1 Wstęp.2 Implementacja Typ bazowy i wskaźnik listy Tworzenie listy Dodawanie
Podstawy Programowania 2 Jednokierunkowa lista liniowa i rekurencja. Plan. Wstęp. Założenia. Notatki. Notatki. Notatki. Notatki.
Podstawy Programowania 2 Jednokierunkowa lista liniowa i rekurencja Arkadiusz Chrobot Zakład Informatyki 2 kwietnia 2019 1 / 58 Plan Wstęp Realizacja Typ bazowy i wskaźnik listy Operacja usuwania elementu
Wyszukiwanie w BST Minimalny i maksymalny klucz. Wyszukiwanie w BST Minimalny klucz. Wyszukiwanie w BST - minimalny klucz Wersja rekurencyjna
Podstawy Programowania 2 Drzewa bst - część druga Arkadiusz Chrobot Zakład Informatyki 12 maja 2016 1 / 8 Plan Wstęp Wyszukiwanie w BST Minimalny i maksymalny klucz Wskazany klucz Zmiany w funkcji main()
. Podstawy Programowania 2. Drzewa bst - część druga. Arkadiusz Chrobot. 12 maja 2019
.. Podstawy Programowania 2 Drzewa bst - część druga Arkadiusz Chrobot Zakład Informatyki 12 maja 2019 1 / 39 Plan.1 Wstęp.2 Wyszukiwanie w BST Minimalny i maksymalny klucz Wskazany klucz.3.4 Zmiany w
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. 1. Rodzaje pamięci używanej w programach Pamięć komputera, dostępna dla programu,
Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe
Algorytmy i złożoności Wykład 3. Listy jednokierunkowe Wstęp. Lista jednokierunkowa jest strukturą pozwalającą na pamiętanie danych w postaci uporzadkowanej, a także na bardzo szybkie wstawianie i usuwanie
. Podstawy Programowania 2. Drzewa bst - część pierwsza. Arkadiusz Chrobot. 22 maja 2016
.. Podstawy Programowania 2 Drzewa bst - część pierwsza Arkadiusz Chrobot Zakład Informatyki 22 maja 2016 1 / 55 Plan.1 Wstęp.2 Definicje.3 Implementacja Typ bazowy i wskaźnik na korzeń Dodawanie elementu
Algorytm DFS Wprowadzenie teoretyczne. Algorytm DFS Wprowadzenie teoretyczne. Algorytm DFS Animacja. Algorytm DFS Animacja. Notatki. Notatki.
Podstawy Programowania Algorytmy dfs i bfs Arkadiusz Chrobot Zakład Informatyki czerwca 09 / 70 Plan Wstęp Podsumowanie / 70 Wstęp Istnieje wiele algorytmów związanych z grafami, które w skrócie nazywane
. Podstawy Programowania 2. Algorytmy dfs i bfs. Arkadiusz Chrobot. 2 czerwca 2019
Podstawy Programowania Algorytmy dfs i bfs Arkadiusz Chrobot Zakład Informatyki czerwca 09 / 70 Plan Wstęp Algorytm BFS Podsumowanie / 70 Wstęp Wstęp Istnieje wiele algorytmów związanych z grafami, które
Wstęp do programowania
Wieczorowe Studia Licencjackie Wrocław, 9.01.2007 Wstęp do programowania Wykład nr 13 Listy usuwanie elementów Poniżej prezentujemy funkcję, która usuwa element o podanej wartości pola wiek z nieuporządkowanej
. Podstawy Programowania 2. Kolejki i ich zastosowania. Arkadiusz Chrobot. 21 marca 2016
.. Podstawy Programowania 2 Kolejki i ich zastosowania Arkadiusz Chrobot Zakład Informatyki 21 marca 2016 1 / 60 Plan.1 Kolejki i ich klasyfikacja.2 Kolejka fifo Implementacja za pomocą tablicy.3 Testowanie
ZASADY PROGRAMOWANIA KOMPUTERÓW
POLITECHNIKA WARSZAWSKA Instytut Automatyki i i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW Język Język programowania: C/C++ Środowisko programistyczne: C++Builder 6 Wykład 9.. Wskaźniki i i zmienne dynamiczne.
Podstawy Programowania 2 Grafy i ich reprezentacje. Plan. Wstęp. Teoria grafów Graf skierowany. Notatki. Notatki. Notatki. Notatki.
Podstawy Programowania Grafy i ich reprezentacje Arkadiusz Chrobot Zakład Informatyki 7 maja 09 / 4 Plan Wstęp Zastosowania grafów / 4 Wstęp Grafy są w informatyce strukturami danych stosowanymi w wielu
. Podstawy Programowania 2. Grafy i ich reprezentacje. Arkadiusz Chrobot. 9 czerwca 2016
Podstawy Programowania 2 Grafy i ich reprezentacje Arkadiusz Chrobot Zakład Informatyki 9 czerwca 2016 1 42 Plan 1 Wstęp 2 Teoria grafów 3 Grafy jako struktury danych 4 Zastosowania grafów 2 42 Wstęp Wstęp
Podstawy Programowania 2 Kolejki i ich zastosowania. Plan. Kolejki i ich klasyfikacja. Kolejki i ich klasyfikacja Kolejki dwustronne. Notatki.
Podstawy Programowania 2 Kolejki i ich zastosowania Arkadiusz Chrobot Zakład Informatyki 18 marca 2019 1 / 60 Plan Kolejki i ich klasyfikacja Testowanie niektórych operacji dynamicznych struktur danych
. Podstawy Programowania 2. Algorytmy z nawrotami. Arkadiusz Chrobot. 9 czerwca 2019
Podstawy Programowania 2 y z nawrotami Arkadiusz Chrobot Zakład Informatyki 9 czerwca 2019 1 / 57 Plan 1 Wstęp 2 Problem dzbanów z wodą 3 Analiza problemu 4 Wersja z jednym rozwiązaniem Wersja z wieloma
Dynamiczne struktury danych
Dynamiczne struktury danych 391 Dynamiczne struktury danych Przez dynamiczne struktury danych rozumiemy proste i złożone struktury danych, którym pamięć jest przydzielana i zwalniana na żądanie w trakcie
Dynamiczne struktury danych
Listy Zbiór dynamiczny Zbiór dynamiczny to zbiór wartości pochodzących z pewnego określonego uniwersum, którego zawartość zmienia się w trakcie działania programu. Elementy zbioru dynamicznego musimy co
Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)
Rok akademicki 2012/2013, Wykład nr 2 2/25 Plan wykładu nr 2 Informatyka 2 Politechnika Białostocka - Wydział Elektryczny Elektrotechnika, semestr III, studia niestacjonarne I stopnia Rok akademicki 2012/2013
Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski
Laboratorium 6: Dynamiczny przydział pamięci dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski 15 maja 2015 1. Wprowadzenie Instrukcja poświęcona jest dynamicznemu przydziałowi i zwalnianiu pamięci w
Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania
Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania Celem ćwiczenia jest zapoznanie studentów z najprostszą dynamiczną strukturą
Programowanie i struktury danych
Programowanie i struktury danych 1 / 19 Dynamiczne struktury danych Dynamiczną strukturą danych nazywamy taka strukturę danych, której rozmiar, a więc liczba przechowywanych w niej danych, może się dowolnie
Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1 Tablice wielowymiarowe C umożliwia definiowanie tablic wielowymiarowych najczęściej stosowane
Programowanie obiektowe
Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04 Cel zajęć. Celem zajęć jest zapoznanie się ze sposobem działania popularnych. Wprowadzenie teoretyczne. Rozważana w ramach niniejszych zajęć
znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach
Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach 27 kwietnia 2012 Wiedząc, że deklarowanie typu rekordowego w języku C/ C++ wygląda następująco: struct element
Podstawy Programowania 2 Algorytmy z nawrotami. Plan. Wstęp
Podstawy Programowania y z nawrotami Arkadiusz Chrobot Zakład Informatyki 9 czerwca 09 / 5 Plan Wstęp Problem dzbanów z wodą Analiza problemu Wersja z jednym rozwiązaniem Wersja z wieloma rozwiązaniami
Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018
Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy
Zmienne i struktury dynamiczne
Zmienne i struktury dynamiczne Zmienne dynamiczne są to zmienne, które tworzymy w trakcie działania programu za pomocą operatora new. Usuwa się je operatorem delete. Czas ich występowania w programie jest
Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.
Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na
Lab 9 Podstawy Programowania
Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany
Zadanie 2: Arytmetyka symboli
1 Cel ćwiczenia Zadanie 2: Arytmetyka symboli Wykształcenie umiejętności abstrahowania operacji arytmetycznych. Zapoznanie się i przećwiczenie mechanizmu tworzenia przeciążeń funkcji operatorowych. Utrwalenie
. Podstawy Programowania 2. Stos i jego zastosowania. Arkadiusz Chrobot. 6 marca 2018
.. Podstawy Programowania 2 Stos i jego zastosowania Arkadiusz Chrobot Zakład Informatyki 6 marca 2018 1 / 73 Plan.1 Abstrakcyjne struktury danych.2 Stos - wprowadzenie.3 Stos - implementacja.4 Wycieki
> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017
> C++ wskaźniki Dane: Iwona Polak iwona.polak@us.edu.pl Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017 >??? Co to jest WSKAŹNIK? ++ wskaźniki 2 / 20 >??? Co to jest WSKAŹNIK? To po prostu ADRES
Zasady programowania Dokumentacja
Marcin Kędzierski gr. 14 Zasady programowania Dokumentacja Wstęp 1) Temat: Przeszukiwanie pliku za pomocą drzewa. 2) Założenia projektu: a) Program ma pobierać dane z pliku wskazanego przez użytkownika
Wskaźniki w C. Anna Gogolińska
Wskaźniki w C Anna Gogolińska Zmienne Zmienną w C można traktować jako obszar w pamięci etykietowany nazwą zmiennej i zawierający jej wartość. Przykład: kod graficznie int a; a a = 3; a 3 Wskaźniki Wskaźnik
Podstawy Programowania 2 Stos i jego zastosowania. Plan. Abstrakcyjne struktury danych. Stos - wprowadzenie. Notatki. Notatki. Notatki.
Podstawy Programowania Stos i jego zastosowania Arkadiusz Chrobot Zakład Informatyki marca 09 / 7 Plan Abstrakcyjne struktury danych Stos - wprowadzenie Wycieki pamięci Przykłady zastosowania stosu Podsumowanie
Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory
Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory Poniżej pozwoliłem sobie za cytować za wikipedią definicję zmiennej w informatyce.
Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04
Laboratorium z przedmiotu Programowanie obiektowe - zestaw 04 Cel zajęć. Celem zajęć jest zapoznanie się ze sposobem działania popularnych kolekcji. Wprowadzenie teoretyczne. Rozważana w ramach niniejszych
Podstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
Języki i techniki programowania Ćwiczenia 2
Języki i techniki programowania Ćwiczenia 2 Autor: Marcin Orchel Spis treści: Język C++... 5 Przekazywanie parametrów do funkcji... 5 Przekazywanie parametrów w Javie.... 5 Przekazywanie parametrów w c++...
E S - uniwersum struktury stosu
Temat: Struktura stosu i kolejki Struktura danych to system relacyjny r I r i i I U,, gdzie U to uniwersum systemu, a i i - zbiór relacji (operacji na strukturze danych). Uniwersum systemu to zbiór typów
Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski
Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski 7 kwietnia 2014 1. Wprowadzenie Pierwsza część instrukcji zawiera informacje
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Jak napisać listę jednokierunkową?
Lista jednokierunkowa jest strukturą o dynamicznie zmieniającej się wielkości. Listę można opisać jako uszeregowany zbiór elementów. Każdy element zawiera jakieś dane oraz wskazuje na swojego następcę.
Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki
Typy wyliczeniowe Konwersje napis liczba Struktury, unie Scanf / printf Wskaźniki Typy wyliczeniowe Służą do łatwiejszej kontroli nad stałymi Ustawianie parametrów o ściśle określonym zbiorze wartości
DYNAMICZNE PRZYDZIELANIE PAMIECI
DYNAMICZNE PRZYDZIELANIE PAMIECI Pamięć komputera, dostępna dla programu, dzieli się na cztery obszary: kod programu, dane statyczne ( np. stałe i zmienne globalne programu), dane automatyczne zmienne
lekcja 8a Gry komputerowe MasterMind
lekcja 8a Gry komputerowe MasterMind Posiadamy już elementarną wiedzę w zakresie programowania. Pora więc zabrać się za rozwiązywanie problemów bardziej złożonych, które wymagają zastosowania typowych
Laboratorium 3: Preprocesor i funkcje ze zmienną liczbą argumentów. mgr inż. Arkadiusz Chrobot
Laboratorium 3: Preprocesor i funkcje ze zmienną liczbą argumentów mgr inż. Arkadiusz Chrobot 10 listopada 2010 1 Preprocesor Preprocesor jest programem uruchamianym przed właściwym procesem kompilacji
Lista dwukierunkowa - przykład implementacji destruktorów
Lista dwukierunkowa - przykład implementacji destruktorów Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Copyright c 2006 2008 Bogdan Kreczmer Niniejszy dokument zawiera
Część 4 życie programu
1. Struktura programu c++ Ogólna struktura programu w C++ składa się z kilku części: część 1 część 2 część 3 część 4 #include int main(int argc, char *argv[]) /* instrukcje funkcji main */ Część
Pętle. Dodał Administrator niedziela, 14 marzec :27
Pętlami nazywamy konstrukcje języka, które pozwalają na wielokrotne wykonywanie powtarzających się instrukcji. Przykładowo, jeśli trzeba 10 razy wyświetlić na ekranie pewien napis, to można wykorzystać
Podstawy Programowania 1 Sortowanie tablic jednowymiarowych. Plan. Sortowanie. Sortowanie Rodzaje sortowania. Notatki. Notatki. Notatki.
Podstawy Programowania 1 Sortowanie tablic jednowymiarowych Arkadiusz Chrobot Zakład Informatyki 12 listopada 20 1 / 35 Plan Sortowanie Wartość minimalna i maksymalna w posortowanej tablicy Zakończenie
Wykład 4: Klasy i Metody
Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to
Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.
Część XIX C++ w Każda poznana do tej pory zmienna może przechowywać jedną liczbę. Jeśli zaczniemy pisać bardziej rozbudowane programy, okaże się to niewystarczające. Warto więc poznać zmienne, które mogą
Analiza konstrukcji zawierających wskaźniki. Piotr Błaszyński
Analiza konstrukcji zawierających wskaźniki Piotr Błaszyński Wskaźniki podejście naiwne: while(ptr!=null){ a[i] = *ptr; i++; ptr++; } po zmianie: N=length(ptr); alias_ptr = ptr; for(j=0 ; j
Liczby losowe i pętla while w języku Python
Liczby losowe i pętla while w języku Python Mateusz Miotk 17 stycznia 2017 Instytut Informatyki UG 1 Generowanie liczb losowych Na ogół programy są spójne i prowadzą do przewidywanych wyników. Czasem jednak
Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz
Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania Zofia Kruczkiewicz Zakres Podstawowe algorytmy przetwarzania tablic (wypełnianie, porównywanie elementów,
PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec
PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych
Wykład 8: klasy cz. 4
Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
Algorytmy i Struktury Danych.
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)
1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się
IX. Wskaźniki.(3 godz.)
Opracowała: dr inż. Anna Dubowicka Uczelniane Centrum Komputerowe PK IX. Wskaźniki.(3 godz.) Wskaźnik jest zmienną, która zawiera adres innej. 1. Definiowanie wskaźników. typ * nazwa ; gdzie: znak * informuje
1. Operacje logiczne A B A OR B
1. Operacje logiczne OR Operacje logiczne są operacjami działającymi na poszczególnych bitach, dzięki czemu można je całkowicie opisać przedstawiając jak oddziałują ze sobą dwa bity. Takie operacje logiczne
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona
Drzewa BST i AVL. Drzewa poszukiwań binarnych (BST)
Drzewa ST i VL Drzewa poszukiwań binarnych (ST) Drzewo ST to dynamiczna struktura danych (w formie drzewa binarnego), która ma tą właściwość, że dla każdego elementu wszystkie elementy w jego prawym poddrzewie
Drzewa poszukiwań binarnych
1 Cel ćwiczenia Algorytmy i struktury danych Instytut Sterowania i Systemów Informatycznych Wydział Elektrotechniki, Informatyki i Telekomunikacji Uniwersytet ielonogórski Drzewa poszukiwań binarnych Ćwiczenie
Podstawy Programowania 2 Wskaźniki i zmienne dynamiczne. Plan. Wskaźniki - krótka powtórka. Wskaźniki - krótka powtórka Wartości wskaźników.
Podstawy Programowania 2 Wskaźniki i zmienne dynamiczne Arkadiusz Chrobot Zakład Informatyki 25 lutego 2019 1 / 55 Plan Wskaźniki - co już wiemy? Jak czytać skomplikowane deklaracje? 2 / 55 Zmienne wskaźnikowe,
Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.
Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy Wykład 8 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Podział kodu programu Struktury definiowanie struktur
Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.
Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy Wykład 8 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Podział kodu programu Struktury definiowanie struktur
wagi cyfry 7 5 8 2 pozycje 3 2 1 0
Wartość liczby pozycyjnej System dziesiętny W rozdziale opiszemy pozycyjne systemy liczbowe. Wiedza ta znakomicie ułatwi nam zrozumienie sposobu przechowywania liczb w pamięci komputerów. Na pierwszy ogień
4. Funkcje. Przykłady
4. Funkcje Przykłady 4.1. Napisz funkcję kwadrat, która przyjmuje jeden argument: długość boku kwadratu i zwraca pole jego powierzchni. Używając tej funkcji napisz program, który obliczy pole powierzchni
Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.
Języki C i C++ to bardzo uniwersalne platformy programistyczne o ogromnych możliwościach. Wykorzystywane są do tworzenia systemów operacyjnych i oprogramowania użytkowego. Dzięki niskiemu poziomowi abstrakcji
Wskazówki dotyczące zmiennych, tablic i procedur 1
Wskazówki dotyczące zmiennych, tablic i procedur 1 Spis treści 1. Tworzenie zmiennych i tablic 1 2. Procedury i zmienne, przekazywanie zmiennych do procedur 5 3. Zakończenie działania procedury 9 1. Tworzenie
Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia
Podstawy informatyki Elektrotechnika I rok Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia Katedra Energoelektroniki i Automatyki Systemów Przetwarzania Energii AGH Kraków 2017 Tematyka
Struktury. Przykład W8_1
Struktury Struktury pozwalają na grupowanie zmiennych różnych typów pod wspólną nazwą. To istotnie ułatwia organizacje danych, które okazują się w jednym miejscu kodu programu. To jest bardzo ważne dla
C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU
Inicjalizacja agregatowa zmiennej tablicowej int a[5] = 1,2,3,4,5 INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU Struktury są również agregatami, dlatego: struct X double f; char c; X x1 = 1, 2.2, 'c' Ale
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? a) konstruktor b) referencje c) destruktor d) typy 2. Które z poniższych wyrażeń są poprawne dla klasy o nazwie
Programowanie obiektowe i C++ dla matematyków
Programowanie obiektowe i C++ dla matematyków Bartosz Szreder szreder (at) mimuw... 22 XI 2011 Uwaga! Ponieważ już sobie powiedzieliśmy np. o wskaźnikach i referencjach, przez które nie chcemy przegrzebywać
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Abstrakcja funkcyjna Struktury Klasy hermetyzacja
Programowanie i struktury danych
Programowanie i struktury danych 1 / 30 STL Standard Template Library, STL (ang. = Standardowa Biblioteka Wzorców) biblioteka C++ zawierająca szablony (wzorce), które umożliwiają wielokrotne użycie. Główne
Programowanie - wykład 4
Programowanie - wykład 4 Filip Sośnicki Wydział Fizyki Uniwersytet Warszawski 20.03.2019 Przypomnienie Prosty program liczący i wyświeltający wartość silni dla wprowadzonej z klawiatury liczby: 1 # include
Informatyka I: Instrukcja 4.2
Informatyka I: Instrukcja 4.2 1 Wskaźniki i referencje - bezboleśnie Nauczyliśmy się do tej pory, że funkcje w języku C mogą zwracać wartość. Co jednak, gdybyśmy chcieli napisać funkcję, która rozwiąże
Podstawy Programowania C++
Wykład 3 - podstawowe konstrukcje Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu, instrukcja przypisania, podstawowe typy danych, zapis i odczyt danych, wyrażenia:
Zapis algorytmów: schematy blokowe i pseudokod 1
Zapis algorytmów: schematy blokowe i pseudokod 1 Przed przystąpieniem do napisania kodu programu należy ten program najpierw zaprojektować. Projekt tworzącego go algorytmu może być zapisany w formie schematu
Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno
Instrukcja laboratoryjna 2 Podstawy programowania 2 Temat: Zmienne dynamiczne tablica wskaźników i stos dynamiczny Przygotował: mgr inż. Tomasz Michno 1 Wstęp teoretyczny 1.1 Tablice wskaźników Tablice
Expo Composer. www.doittechnology.pl 1. Garncarska 5 70-377 Szczecin tel.: +48 91 404 09 24 e-mail: info@doittechnology.pl. Dokumentacja użytkownika
Expo Composer Dokumentacja użytkownika Wersja 1.0 www.doittechnology.pl 1 SPIS TREŚCI 1. O PROGRAMIE... 3 Wstęp... 3 Wymagania systemowe... 3 Licencjonowanie... 3 2. PIERWSZE KROKI Z Expo Composer... 4
. Podstawy Programowania 2. Wskaźniki i zmienne dynamiczne. Arkadiusz Chrobot. 25 lutego 2019
.. Podstawy Programowania 2 Wskaźniki i zmienne dynamiczne Arkadiusz Chrobot Zakład Informatyki 25 lutego 2019 1 / 55 Plan.1 Wskaźniki - co już wiemy?.2 Wskaźniki na funkcje.3.4 Jak czytać skomplikowane
Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki
Konwersje napis liczba Struktury, unie Scanf / printf Wskaźniki Konwersje liczba napis Ćwiczenia 1. Napisz aplikację, która na wejściu dostaje napis postaci W Roku Pańskim 1345, władca Henryk 12,
Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.
Wykład 3 ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors. Waldi Ravens J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 75 / 146 deklaracje zmiennych instrukcja podstawienia
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH Temat 4: Realizacje dynamicznych struktur danych. Wykładowca: dr inż. Zbigniew TARAPATA e-mail: Zbigniew.Tarapata@isi.wat.edu.pl http://www.tarapata.strefa.pl/p_algorytmy_i_struktury_danych/
Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:
Program 6 Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje: Funkcja pobierz_osobe wczytuje dane osoby podanej jako argument. Funkcja wypisz_osobe
Tematy lekcji zajęć komputerowych klasa 5b grupa 1 i grupa 2
Tematy lekcji zajęć komputerowych klasa 5b grupa 1 i grupa 2 1 Program nauczania. Przedmiotowy system oceniania. Regulamin pracowni komputerowej. - 7 punktów regulaminu potrafi powiedzieć, czego się będzie
Wskaźniki. Programowanie Proceduralne 1
Wskaźniki Programowanie Proceduralne 1 Adresy zmiennych Sterta 1 #include 2 3 int a = 2 ; 4 5 int main ( ) 6 { 7 int b = 3 ; 8 9 printf ( " adres zmiennej a %p\n", &a ) ; 10 printf ( " adres