Lista dwukierunkowa - przykład implementacji destruktorów

Podobne dokumenty
Szablon klasy std::list

Konstruktor kopiujacy

Wartości domyślne, przeciażenia funkcji

Pola i metody statyczne

Wartości domyślne, przeciażenia funkcji

Referencje do zmiennych i obiektów

Szablon klasy std::vector

Operacje wejścia/wyjścia (odsłona druga) - pliki

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów szablony funkcji

Wyliczanie wyrażenia obiekty tymczasowe

Klasa, metody, rozwijanie w linii

Klasa, metody, rozwijanie w linii

Qt - dialogi. Bogdan Kreczmer. ZPCiR ICT PWR pokój 307 budynek C3

Geneza powstania języka C++

Geneza powstania języka C++

Operacje wejścia/wyjścia odsłona pierwsza

Podejście obiektowe - podstawowe pojęcia

Qt - edycja, obsługa zdarzeń, rozmieszczenie kontrolek

Wstęp do programowania

Obiekty i metody stałe

Qt sygnały i sloty. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydział Elektroniki Politechnika Wrocławska

Aplikacja po polsku. Bogdan Kreczmer. ZPCiR ICT PWr pokój 307 budynek C3.

Przesłanianie nazw, przestrzenie nazw

Podstawy programowania obiektowego

Qt sygnały i designer

Programowanie obiektowe i C++ dla matematyków

Dynamiczne struktury danych

Rzutowanie i konwersje

Schemat konstrukcja pliku Makefile

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

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

Praca z aplikacją designer

Programowanie obiektowe

Style programowania - krótki przeglad

Przykłady oprogramowania wykorzystujacego Qt

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

Szablony funkcji i szablony klas

Wstęp do Programowania 2

Klasy i obiekty cz II

Wprowadzenie do szablonów klas

Metody Metody, parametry, zwracanie wartości

Programowanie obiektowe

Programowanie obiektowe

Programowanie w języku C++

Wykład 4: Klasy i Metody

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

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

Programowanie obiektowe

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

Programowanie obiektowe i C++ dla matematyków

Programowanie obiektowe

0.1 Hierarchia klas Diagram Krótkie wyjaśnienie

PARADYGMATY PROGRAMOWANIA Wykład 3

Programowanie obiektowe

Qt - podstawowe cechy

Programowanie w Javie 1 Wykład i Ćwiczenia 2 Przegląd podstawowych klas w Javie (elementy programowania obiektowego) Płock, 16 października 2013 r.

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Programowanie i struktury danych

Jak napisać listę jednokierunkową?

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Podstawy Programowania 2 Dwukierunkowa lista liniowa. Plan. Wstęp. Implementacja. Notatki. Notatki. Notatki. Notatki.

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

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

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

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

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

Programowanie obiektowe

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

Systemy Rozproszone - Ćwiczenie 6

Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h

Listy powiązane zorientowane obiektowo

Paradygmaty programowania. Paradygmaty programowania

Programowanie 2. Język C++. Wykład 3.

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

11.6 Klasa do obsługi liczb wymiernych

Papyrus. Papyrus. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Algorytmy i Struktury Danych.

Dynamiczne struktury danych

Style programowania - krótki przeglad

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Języki i metody programowania Java INF302W Wykład 2 (część 1)

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. Metody stałe w klasie

Języki Programowania. Prowadząca: dr inż. Hanna Zbroszczyk. tel: Konsultacje: piątek:

Przykład implementacji przeciażeń operatorów problem kolizji

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Programowanie obiektowe i zdarzeniowe

Podstawy programowania w języku C++

Algorytmy i Struktury Danych. Anna Paszyńska

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

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

Programowanie, część I

Programowanie obiektowe i C++ dla matematyków

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Transkrypt:

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 materiały do wykładu na temat programowania obiektowego. Jest on udostępiony pod warunkiem wykorzystania wyłacznie do własnych prywatnych potrzeb i może on być kopiowany wyłacznie w całości, razem z niniejsza strona tytułowa.

Lista dwukierunkowa 1 class ElementListy // public : ElementListy Poprz; ElementListy Naste; ElementListy( ) Poprz = Naste = NULL; ElementListy( ); ; // void WstawPrzed(ElementListy ElemNast); Klasa ElementListy pozwala na stworzenie struktur danych w postaci listy dwukierunkowej.

Element listy 2 class ElementListy // public : ElementListy Poprz; ElementListy Naste; ElementListy( ) Poprz = Naste = NULL; ElementListy( ); ; // void WstawPrzed(ElementListy ElemNast); ElementListy:: ElementListy( ) if ( Poprz) Poprz > Naste = Naste; if ( Naste) Naste > Poprz = Poprz; Destruktor klasy ElementListy umożliwia zachowanie poprawnej struktury listy po usunięciu dowolnego jej elementu.

Destrukcja elementu 3 ElementListy:: ElementListy( ) if ( Poprz) Poprz > Naste = Naste; if ( Naste) Naste > Poprz = Poprz; Rozważmy przebieg destrukcji środkowego elementu listy.

Destrukcja elementu 4 ElementListy:: ElementListy( ) if ( Poprz) Poprz > Naste = Naste; if ( Naste) Naste > Poprz = Poprz; Sprawdzamy, czy istnieje element poprzedzajacy.

Destrukcja elementu 5 ElementListy:: ElementListy( ) if ( Poprz) Poprz > Naste = Naste; if ( Naste) Naste > Poprz = Poprz; Dostajemy się do pola Naste w elemencie poprzednim.

Destrukcja elementu 6 ElementListy:: ElementListy( ) if ( Poprz) Poprz > Naste = Naste; if ( Naste) Naste > Poprz = Poprz; Zmodyfikowana zostaje zawartość pola Naste w elemencie poprzedzajacym, tak aby pole to zawierało adres elementu znajdujacego się za elementem usuwanym.

Destrukcja elementu 7 ElementListy:: ElementListy( ) if ( Poprz) Poprz > Naste = Naste; if ( Naste) Naste > Poprz = Poprz; Sprawdzamy, czy istnieje element następny.

Destrukcja elementu 8 ElementListy:: ElementListy( ) if ( Poprz) Poprz > Naste = Naste; if ( Naste) Naste > Poprz = Poprz; Dostajemy się do pola Poprz w elemencie następnym.

Destrukcja elementu 9 ElementListy:: ElementListy( ) if ( Poprz) Poprz > Naste = Naste; if ( Naste) Naste > Poprz = Poprz; Zmodyfikowana zostaje zawartość pola Poprz w elemencie następnym, tak aby pole to zawierało adres elementu znajdujacego się przed elementem usuwanym.

Destrukcja elementu 10 ElementListy:: ElementListy( ) if ( Poprz) Poprz > Naste = Naste; if ( Naste) Naste > Poprz = Poprz; Po zakończeniu destrukcji struktura listy pozostaje poprawna.

Element listy 11 class ElementListy // public : ElementListy Poprz; ElementListy Naste; ElementListy() Poprz = Naste = NULL; ElementListy(); ; // void WstawPrzed(ElementListy ElemNast); void ElementListy::WstawPrzed(ElementListy ElemNast) Naste = ElemNast; if (!ElemNast) Poprz = NULL; return ; if (ElemNast > Poprz) ( Poprz = ElemNast > Poprz) > Naste = this ; ElemNast > Poprz = this ; Metoda WstawPrzed pozwala na wstawienie elementu w dowolne jej miejsce przed końcem listy.

Lista z zarzadc a 12 class ZarzadcaListy // public: ElementListy Glowa; ZarzadcaListy( ) Glowa = NULL; ZarzadcaListy( ); ; // void DodajNaPoczatek( ElementListy welem); Wprowadzenie zarzadcy umożliwia lepsze zorganizowanie dostępu do listy oraz operacji realizowanych na liście.

Zarzadca listy 13 class ZarzadcaListy // public: ElementListy Glowa; ZarzadcaListy( ) Glowa = NULL; ZarzadcaListy( ); ; // void DodajNaPoczatek( ElementListy welem); ZarzadcaListy:: ZarzadcaListy( ) if (! Glowa) return ; while ( Glowa > Naste) delete Glowa > Naste; delete Glowa; Destruktor klasy ZarzadcaListy umożliwia usunięcie całej listy, która zarzadza.

Zarzadca listy 14 class ZarzadcaListy // public: ElementListy Glowa; ZarzadcaListy( ) Glowa = NULL; ZarzadcaListy( ); ; // void DodajNaPoczatek( ElementListy welem); void ZarzadcaListy::DodajNaPoczatek( ElementListy welem) if (!welem ) return ; welem > Poprz = welem > Naste = NULL; if (! Glowa ) Glowa = welem; return ; welem >WstawPrzed( Glowa); Glowa = welem; Wykorzystanie metody ElementListy::WstawPrzed pozwala w prosty sposób zaimplementować metodę ZarzadcaListy::DodajNaPoczatek.

Rozszerzony element listy 15 class RozElementListy // public : RozZarzadcaListy Zarzadca; RozElementListy Poprz; RozElementListy Naste; RozElementListy( ) Poprz = Naste = NULL; Zarzadca = NULL; RozElementListy( ); ; // void WstawPrzed(RozElementListy ElemNast); Destruktor klasy RozElementListy umożliwia zachowanie poprawnej struktury listy oraz wskazań zarzadcy po usunięciu dowolnego jej elementu.

Rozszerzony element listy 16 class RozElementListy // public : RozZarzadcaListy Zarzadca; RozElementListy Poprz; RozElementListy Naste; RozElementListy( ) Poprz = Naste = NULL; Zarzadca = NULL; RozElementListy( ); ; // void WstawPrzed(RozElementListy ElemNast); RozElementListy:: RozElementListy( ) if ( Poprz) Poprz > Naste = Naste; else Zarzadca > Glowa = Naste; if ( Naste) Naste > Poprz = Poprz; Destruktor klasy RozElementListy umożliwia zachowanie poprawnej struktury listy oraz wskazań zarzadcy po usunięciu dowolnego jej elementu.

Rozszerzony element listy 17 class RozElementListy // public : RozZarzadcaListy Zarzadca; RozElementListy Poprz; RozElementListy Naste; RozElementListy( ) Poprz = Naste = NULL; Zarzadca = NULL; RozElementListy( ); ; // void WstawPrzed(RozElementListy ElemNast); void RozElementListy::WstawPrzed(RozElementListy ElemNast) Naste = ElemNast; if (!ElemNast) Poprz = NULL; return ; Zarzadca = ElemNast > Zarzadca; if (ElemNast > Poprz) ( Poprz = ElemNast > Poprz) > Naste = this ; else Zarzadca > Glowa = this ; ElemNast > Poprz = this ; Metoda WstawPrzed pozwala na wstawienie elementu w dowolne jej miejsce przed końcem listy. Aktualizuje ona również, o ile zachodzi taka potrzeba, samego zarzadcę.

Rozszerzony zarzadca listy 18 class RozZarzadcaListy // public: RozElementListy Glowa; RozZarzadcaListy( ) Glowa = NULL; RozZarzadcaListy( ); ; // void DodajNaPoczatek( RozElementListy welem); RozZarzadcaListy:: RozZarzadcaListy( ) //.. while ( Glowa) delete Glowa; //.. Rozbudowanie metod w klasie RozElementListy pozwoliło na prostszy zapis metod w klasie RozZarzadcaListy. Zapis destruktora całej listy skrócił się do jednej linii.

Rozszerzony zarzadca listy 19 class RozZarzadcaListy // public: RozElementListy Glowa; RozZarzadcaListy( ) Glowa = NULL; RozZarzadcaListy( ); ; // void DodajNaPoczatek( RozElementListy welem); void RozZarzadcaListy::DodajNaPoczatek( RozElementListy welem) //. if (!welem ) return ; welem > Poprz = welem > Naste = NULL; if (! Glowa ) ( Glowa = welem) > Zarzadca = this ; return ; welem >WstawPrzed( Glowa); //.. Metoda dodawania nowego elementu skróciła się o jedna instrukcję.

20 Pytania i ćwiczenia 1. Czy z poziomu jednego destruktora można powodować uruchomienie destruktorów innych obiektów? 2. Dany jest fragment kodu: RozZarzadcaListy RozElementListy Lst; welem; Lst.DodajNaPoczatek(wElem = new RozElementListy); Lst.DodajNaPoczatek(wElem); Jeżeli następna instrukcja będzie: for (welem = Lst. Glowa; welem; welem = welem > Naste); to ile razy wykona się przedstawiona powyżej pętla? 3. Czy działanie instrukcji: for (welem = Lst. Glowa; welem; welem = welem > Poprz); różnić się będzie od przedstawionej wcześniej? Jeśli tak, to ile razy wykona się ta pętla? 4. Czy po wykonaniu instrukcji przedstawionych w punkcie 2 destrukcja listy przebiegnie poprawnie?