Programowanie i struktury danych

Podobne dokumenty
Zmienne i struktury dynamiczne

Dynamiczne struktury danych

Materiał uzupełniający do ćwiczen z przedmiotu: Programowanie w C ++ - ćwiczenia na wskaźnikach

ZASADY PROGRAMOWANIA KOMPUTERÓW

DYNAMICZNE PRZYDZIELANIE PAMIECI

Programowanie i struktury danych

Paradygmaty programowania. Paradygmaty programowania

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Dynamiczne struktury danych

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Algorytmy i język C++

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Programowanie Obiektowe i C++

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

PARADYGMATY PROGRAMOWANIA Wykład 4

Podstawy Programowania

Języki programowania obiektowego Nieobiektowe elementy języka C++

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Listy powiązane zorientowane obiektowo

PARADYGMATY PROGRAMOWANIA Wykład 2

Program 22. #include <iostream> using namespace std; struct Osoba { string Imie; string Nazwisko; char Plec; int RokUr; };

Podstawy programowania w języku C++

Algorytmy i Struktury Danych.

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

TEMAT : KLASY POLIMORFIZM

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Podstawy programowania

Jak napisać listę jednokierunkową?

Referencje do zmiennych i obiektów

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie komputerowe. Zajęcia 4

Deklaracja struktury w C++

PARADYGMATY PROGRAMOWANIA Wykład 3

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Programowanie obiektowe i C++ dla matematyków

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

STL: Lekcja 1&2. Filozofia STL

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

Wykład 8: klasy cz. 4

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Wymiar musi być wyrażeniem stałym typu całkowitego, tzn. takim, które może obliczyć kompilator. Przykłady:

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Platformy Programistyczne Podstawy języka Java

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Struktury. Przykład W8_1

Wstęp do programowania

Programowanie w języku C++

Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:

Programowanie - wykład 4

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

TEMAT : KLASY DZIEDZICZENIE

Programowanie Procedurale

Konstruktor kopiujacy

Podstawy programowania w języku C++

Plik klasy. h deklaracje klas

Języki i techniki programowania Ćwiczenia 2

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Techniki Programowania wskaźniki

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Tablice, funkcje - wprowadzenie

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Podstawy programowania w języku C++

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Szablon klasy std::list

Podstawy programowania skrót z wykładów:

Klasy i obiekty cz II

C-struktury wykład. Dorota Pylak

Wprowadzenie do szablonów szablony funkcji

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Programowanie obiektowe i C++ dla matematyków

Programowanie komputerowe. Zajęcia 3

ALGORYTMY I STRUKTURY DANYCH

Wprowadzenie do szablonów szablony funkcji

Transkrypt:

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 zmieniać w czasie działania programu. Struktury danych umożliwiają dostęp do danych w nich zapisanych. Przykłady liniowych struktur to m.in. listy, stosy, kolejki. Nieliniowe struktury to m.im grafy. Stosowanie struktur danych jest niezbędne w wielu algorytmach. 2 / 19

Lista jednokierunkowa Lista jednokierunkowa składa się z elementów, z których każdy element przechowuje wskaźnik do następnego elementu. Ostatni element ma wskaźnik do następnego ustawiony na NULL (adres pusty). [A=head, D=tail] Najczęściej elementy listy tworzymy używając struktury struct wezel // tu dowolne dane wezel * next ; Pole next jest miejscem, do którego można zapisać adres kolejnej struktury. 3 / 19

Listy jednokierunkowe W przeciwieństwie do tablicy, przechowywane dane listy nie muszą być położone w sąsiednich obszarach. Zalety listy jednokierunkowej: ciąg danych można zapisać w postaci łańcucha identyfikowanego przez pojedynczą zmienną (nie jest potrzebny iterator). 4 / 19

Przykłady listy jednokierunkowej struct osoba string imie ; string nazwisko ; int wiek ; float pensja ; osoba * nastepna ; struct wezel int dana ; wezel * next ; 5 / 19

Tworzenie węzła (dopisywanie na końcu listy) 1 utworzenie zmiennej typu node 2 uzupełnienie danych 3 dopisanie w polu next wartości NULL 4 dołączenie nowego węzła poprzez przypisanie w polu next aktualnie ostatniego węzła wskaźnika na nowy węzeł. struct wezel int dana ; wezel * next ; 6 / 19

Tworzenie węzła (dopisywanie na końcu listy) 1 utworzenie zmiennej typu node 2 uzupełnienie danych 3 dopisanie w polu next wartości NULL 4 dołączenie nowego węzła poprzez przypisanie w polu next aktualnie ostatniego węzła wskaźnika na nowy węzeł. struct wezel int dana ; wezel * next ; 7 / 19

Tworzenie węzła (dopisywanie na końcu listy) 1 utworzenie zmiennej typu node 2 uzupełnienie danych 3 dopisanie w polu next wartości NULL 4 dołączenie nowego węzła poprzez przypisanie w polu next aktualnie ostatniego węzła wskaźnika na nowy węzeł. struct wezel int dana ; wezel * next ; 8 / 19

Tworzenie węzła (dopisywanie na końcu listy) 1 utworzenie zmiennej typu node 2 uzupełnienie danych 3 dopisanie w polu next wartości NULL 4 dołączenie nowego węzła poprzez przypisanie w polu next aktualnie ostatniego węzła wskaźnika na nowy węzeł. struct wezel int dana ; wezel * next ; 9 / 19

Tworzenie węzła (dopisywanie na końcu listy) 1 utworzenie zmiennej typu node 2 uzupełnienie danych 3 dopisanie w polu next wartości NULL 4 dołączenie nowego węzła poprzez przypisanie w polu next aktualnie ostatniego węzła wskaźnika na nowy węzeł. struct wezel int dana ; wezel * next ; 10 / 19

Tworzenie węzła (dopisywanie na końcu listy) 1 utworzenie zmiennej typu node 2 uzupełnienie danych 3 dopisanie w polu next wartości NULL 4 dołączenie nowego węzła poprzez przypisanie w polu next aktualnie ostatniego węzła wskaźnika na nowy węzeł. struct wezel int nr ; wezel * next ; int main () wezel * head ; // deklarujemy glowe head = new wezel ; // rezerwujemy pamiec dla glowy i przypisujemy // adres do zmiennej head head >nr = 0 ; // nadajemy wartosci skladowym wezla glowa head >next = NULL ; // glowa jest ogonem delete head ; return 0 ; 11 / 19

int main () wezel * head ; // deklarujemy glowe head = new wezel ; // rezerwujemy pamiec dla glowy i przypisujemy // adres do zmiennej head head >nr = 0 ; // nadajemy wartosci skladowym wezla glowa head >next = NULL ; // glowa jest ogonem delete head ; return 0 ; 12 / 19

int main () wezel * head ; // deklarujemy glowe head = new wezel ; // rezerwujemy pamiec dla glowy i przypisujemy // adres do zmiennej head head >nr = 0 ; // nadajemy wartosci skladowym wezla glowa head >next = NULL ; // glowa jest ogonem wezel *w1 ; // deklarujemy wezel w1 = new wezel ; // rezerwujemy dla niego pamiec i przypisujemy mu adres w1 >nr = 1 ; // nadajemy wartosci skladowym tego wezla w1 >next = NULL ; // wezel bedzie ogonem head >next = w1 ; // glowa poprzedza wezel ( wezel jest ogonem ) delete w1, head ; return 0 ; 13 / 19

int main () wezel * head ; // deklarujemy glowe head = new wezel ; // rezerwujemy pamiec dla glowy i przypisujemy // adres do zmiennej head head >nr = 0 ; // nadajemy wartosci skladowym wezla glowa head >next = NULL ; // glowa jest ogonem wezel *w1 ; // deklarujemy wezel w1 = new wezel ; // rezerwujemy dla niego pamiec i przypisujemy mu adres w1 >nr = 1 ; // nadajemy wartosci skladowym tego wezla w1 >next = NULL ; // wezel bedzie ogonem head >next = w1 ; // glowa poprzedza wezel ( wezel jest ogonem ) wezel w2 ; // deklarujemy wezel statyczny w2. nr = 2 ; // nadajemy wartosci skladowym tego wezla w2. next = NULL ; // wezel bedzie ogonem w1 >next = & w2 ; // wezel jest ogonem (!) delete w2,w1, head ; return 0 ; 14 / 19

test30.cpp int main () wezel * head ; // deklarujemy glowe head = new wezel ; // rezerwujemy pamiec dla glowy i przypisujemy // adres do zmiennej head head >nr=0 ; // nadajemy wartosci skladowym wezla glowa head >next=null ; // glowa jest ogonem wezel *w1 ; // deklarujemy wezel w1 = new wezel ; // rezerwujemy dla niego pamiec i przypisujemy mu adres w1 >nr=1 ; // nadajemy wartosci skladowym tego wezla w1 >next=null ; // wezel bedzie ogonem head >next = w1 ; // glowa poprzedza wezel ( wezel jest ogonem ) wezel w2 ; // deklarujemy wezel statyczny w2. nr = 2 ; // nadajemy wartosci skladowym tego wezla w2. next = NULL ; // wezel bedzie ogonem w1 >next = & w2 ; // wezel jest ogonem (!) wezel w3 = 3, NULL // deklarujemy wezel ( statyczny!) + // nadajemy wartosci skladowym + wezel bedzie ogonem w2. next = & w3 ; // wezel jest ogonem delete w3,w2,w1, head ; return 0 ; 15 / 19

Lista jednokierunkowa - operacje na listach Bardzo wygodną własnością list jest fakt, że aby operować na liście, wystarczy adres jej pierwszego elementu; mając dostęp do pierwszego elementu, możemy w jego składowej next znaleźć adres następnego itd. 16 / 19

Lista jednokierunkowa - operacje na listach Dla przykładu zdefiniujemy funkcje wypisujące zawartość listy (jest to kontynuacja poprzedniego kodu). test31.cpp struct wezel int nr ; wezel * next ; void drukuj_liste ( const wezel * w) ; // prototyp funkcji int main ()... drukuj_liste (head ) ; delete head,w1,w2,w3 ; return 0 ; void drukuj_liste ( const wezel * w) for ( ; w ; w = w >next ) cout<<( int )w<<endl ; cout<<" ------------------\n" ; cout<<"nr = "<<setw (12)<<w >nr<<" "<<endl ; cout<<" ------------------\n" ; cout<<" next = "<<setw (10)<<( int ) w >next<<" "<<endl ; cout<<" ------------------\n" ; cout<<" \n" ; cout<<" V \n" ; cout<<"null \n" ; 17 / 19

Lista jednokierunkowa - operacje na listach test32.cpp int main ()... drukuj_liste (head ) ; cout<<"null \n" ; cout<<"\na TERAZ ODWROTNIE \n"<<endl ; cout<<"null \n" ; drukuj_liste_odwrotnie (head ) ; delete head,w1,w2,w3 ; return 0 ;... void drukuj_liste_odwrotnie ( const wezel * n) if (n == NULL ) // pusta lista cout<<"null \n" ; return ; if (n >next!= NULL ) ; drukuj_liste_odwrotnie (n >next ) ; cout<<" ^ \n" ; cout<<" \n" ; cout<<" ------------------\n" ; cout<<"nr = "<<setw (12)<<n >nr<<" "<<endl ; cout<<" ------------------\n" ; cout<<" next = "<<setw (10)<<( int ) n >next<<" "<<endl ; cout<<" ------------------\n" ; cout<<( int )n<<endl ; 18 / 19

Dziękuję za uwagę!!! 19 / 19