Lista dwukierunkowa - przykład implementacji destruktorów

Lista dwukierunkowa - przykład implementacji destruktorów Lista dwukierunkowa - przykład implementacji destruktorów

rab.ict.pwr.wroc.pl
from rab.ict.pwr.wroc.pl More from this publisher

<strong>Lista</strong> <strong>dwukierunkowa</strong>1class 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.<strong>Lista</strong> <strong>dwukierunkowa</strong> - przykład <strong>implementacji</strong> destruktorów


Destrukcja elementu8. . .ElementListy:: ∼ ElementListy( ){if ( Poprz) Poprz–> Naste = Naste;if ( Naste) Naste–> Poprz = Poprz;}. . .Dostajemy się do polaPoprz w elemencie następnym.<strong>Lista</strong> <strong>dwukierunkowa</strong> - przykład <strong>implementacji</strong> destruktorów


Destrukcja elementu9. . .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łoadres elementu znajdujacego ˛ się przed elementem usuwanym.<strong>Lista</strong> <strong>dwukierunkowa</strong> - przykład <strong>implementacji</strong> destruktorów


Destrukcja elementu10. . .ElementListy:: ∼ ElementListy( ){if ( Poprz) Poprz–> Naste = Naste;if ( Naste) Naste–> Poprz = Poprz;}. . .Po zakończeniu destrukcji struktura listy pozostaje poprawna.<strong>Lista</strong> <strong>dwukierunkowa</strong> - przykład <strong>implementacji</strong> destruktorów


Element listy11class 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.<strong>Lista</strong> <strong>dwukierunkowa</strong> - przykład <strong>implementacji</strong> destruktorów


<strong>Lista</strong> z zarzadc ˛ a˛12class 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.<strong>Lista</strong> <strong>dwukierunkowa</strong> - przykład <strong>implementacji</strong> destruktorów


Zarzadca ˛ listy13class 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.˛<strong>Lista</strong> <strong>dwukierunkowa</strong> - przykład <strong>implementacji</strong> destruktorów


Zarzadca ˛ listy14class 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.<strong>Lista</strong> <strong>dwukierunkowa</strong> - przykład <strong>implementacji</strong> destruktorów


Rozszerzony element listy15class 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.<strong>Lista</strong> <strong>dwukierunkowa</strong> - przykład <strong>implementacji</strong> destruktorów


Rozszerzony element listy16class 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.<strong>Lista</strong> <strong>dwukierunkowa</strong> - przykład <strong>implementacji</strong> destruktorów


Rozszerzony element listy17class 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ę.˛<strong>Lista</strong> <strong>dwukierunkowa</strong> - przykład <strong>implementacji</strong> destruktorów


Rozszerzony zarzadca ˛ listy18class 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 klasieRozZarzadcaListy. Zapis destruktora całej listy skrócił się do jednej linii.<strong>Lista</strong> <strong>dwukierunkowa</strong> - przykład <strong>implementacji</strong> destruktorów


Rozszerzony zarzadca ˛ listy19class 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ę.<strong>Lista</strong> <strong>dwukierunkowa</strong> - przykład <strong>implementacji</strong> destruktorów


20Pytania i ćwiczenia1. Czy z poziomu jednego destruktora można powodować uruchomienie destruktorówinnych obiektów?2. Dany jest fragment kodu:RozZarzadcaListyRozElementListyLst;∗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 przebiegniepoprawnie?<strong>Lista</strong> <strong>dwukierunkowa</strong> - przykład <strong>implementacji</strong> destruktorów

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!