Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Relevanta dokument
Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

Föreläsning Datastrukturer (DAT036)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 3 Datastrukturer (DAT037)

Datastrukturer. Föreläsning 5. Maps 1

Föreläsning Datastrukturer (DAT036)

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

Föreläsning 7. Träd och binära sökträd

Träd Hierarkiska strukturer

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

Föreläsning 9 Innehåll

Ett generellt träd är. Antingen det tomma trädet, eller en rekursiv struktur: rot /. \ /... \ t1... tn

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Föreläsning 10 Datastrukturer (DAT037)

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

Algoritmer och datastrukturer 2012, föreläsning 6

Föreläsning 4 Datastrukturer (DAT037)

Programmering i C++ EDA623 Mallar. EDA623 (Föreläsning 12) HT / 29

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Föreläsning 3 Datastrukturer (DAT037)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDIU01 - Programmering i C++, grundkurs

Datastrukturer. föreläsning 3. Stacks 1

Trädstrukturer och grafer

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 9 Datastrukturer (DAT037)

TDIU01 Programmering i C++

Tentamen i Algoritmer & Datastrukturer i Java

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Föreläsning Datastrukturer (DAT037)

Föreläsning 9 Innehåll

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

maxlist-1. Indexerad lista Länkad lista

Föreläsning Datastrukturer (DAT036)

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Träd - C&P kap. 10 speciellt binära sökträd sid. 452

Träd. Rot. Förgrening. Löv

Tentamen, Algoritmer och datastrukturer

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

TDDC76 - Programmering och Datastrukturer

Föreläsning Datastrukturer (DAT036)

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

TDDC76 - Programmering och Datastrukturer

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 8 Om abstrakta datatyper och binära sökträd

TDDC76 - Programmering och Datastrukturer

Självbalanserande AVL-träd Weiss, avsnitt 4.4

F5: Debriefing OU2, repetition av listor, träd och hashtabeller. Carl Nettelblad

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 4 Innehåll

Föreläsning 14 Innehåll

Tentamen kl Uppgift 4. Uppgift 5

Föreläsning 7. Träd och binära sökträd

Föreläsning 13. Träd

Innehåll. Parametriserade typer. Klassmallar. Klassmallen Vektor Konstructor med std::initializer_list. Klassmallen Vektor Medlemsfunktioner

DAI2 (TIDAL) + I2 (TKIEK)

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Implementering av tabellen. Operationer på tabellen

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

Lösningar Datastrukturer TDA

Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Föreläsning 5. Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 2. Länkad lista och iterator

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Föreläsning Datastrukturer (DAT036)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Vad har vi pratat om i kursen?

13 Prioritetsköer, heapar

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Lösningsförslag till tentamen Datastrukturer, DAT037,

Länkade strukturer, parametriserade typer och undantag

Föreläsning 2. Länkad lista och iterator

Träd. Ett träd kan se ut på detta sätt:

Lösningsförslag till tentamen Datastrukturer, DAT037,

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Specifikationer för tabellfunktionerna. Operationer på tabellen

Datastrukturer. föreläsning 10. Maps 1

Binära sökträd. Seminarium 9 Binära sökträd Innehåll. Traversering av binära sökträd. Binära sökträd Definition. Exempel på vad du ska kunna

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Programkonstruktion och. Datastrukturer

Lösningsförslag till exempeltenta 1

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Tillämpad programmering

EN SNABBIS OM DoA. Programmeringsmetodik med Java, HT-07 Kognitionsvetenskapliga programmet. Pedher Johansson 7 januari 2008

Tentamen Datastrukturer (DAT036)

Föreläsning 10 Innehåll. Diskutera. Inordertraversering av binära sökträd. Binära sökträd Definition

Collections och datastrukturer. Kursbokens kapitel 13 och

Datastrukturer och algoritmer. Föreläsning 4 Test, Stack och Kö

Föreläsning 10 Innehåll

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

Föreläsning 14. Filhantering

Transkript:

Programmering i C++ EDAF30 Dynamiska datastrukturer EDAF30 (Föreläsning 11) HT 2014 1 / 34

Dynamiska datastrukturer Innehåll Länkade listor Stackar Köer Träd Säkrare minneshantering (shared_ptr och unique_ptr) EDAF30 (Föreläsning 11) HT 2014 2 / 34

Länkade listor Enkellänkad lista class Element { public: Element *nasta; int data; Element(Element *n, int d) : nasta(n), data(d) { ; EDAF30 (Föreläsning 11) HT 2014 3 / 34

Länkade listor Uppbyggande av enkellänkad lista Element *forsta=nullptr; // Börja med tom lista forsta = new Element(forsta, 2); // 1:a elem forsta = new Element(forsta, 5); // 2:a elem forsta = new Element(forsta, 4); // 3:e elem // forsta pekar på sist inlagda elem.(3:e) EDAF30 (Föreläsning 11) HT 2014 4 / 34

Länkade listor Sökning i enkellänkad lista Element *sok(element *forsta, int sokt) { Element *p; for (p = forsta; p && p->data!=sokt; p = p->nasta) { return p; Insättning i början på enkellänkad lista void lagg_forst(element *& forsta, int d) { forsta = new Element(forsta, d); EDAF30 (Föreläsning 11) HT 2014 5 / 34

Länkade listor Insättning i slutet av enkellänkad lista void lagg_sist(element *& forsta, int d) { if (!forsta) // tom lista forsta = new Element(nullptr, d); else { Element *p; for (p=forsta; p->nasta; p=p->nasta) ; p->nasta = new Element(nullptr, d); EDAF30 (Föreläsning 11) HT 2014 6 / 34

Länkade listor Länkade listor och rekursion //Skriva ut lista baklänges mha rekursion void skriv_baklanges(element *forsta) { if (forsta) { skriv_baklanges(forsta->nasta); cout << forsta->data << ; // Lägg in sist i lista mha rekursion void lagg_sist_rek(element *& forsta, int d) { if (!forsta) forsta = new Element(nullptr, d); else lagg_sist_rek(forsta->nasta, d); EDAF30 (Föreläsning 11) HT 2014 7 / 34

Länkade listor Dubbellänkad lista (med huvudnod) class Element { public: Element *fram, *bak; int data; Element(Element *f=nullptr, Element *b=nullptr, int d=0) : fram(f), bak(b), data(d) { if (f == nullptr) fram = bak = this; ; Element *forsta = new Element; // skapa tom lista EDAF30 (Föreläsning 11) HT 2014 8 / 34

Länkade listor Ta bort och lägga till i dubbellänkad lista void ta_bort(element *e) { e->bak->fram = e->fram; e->fram->bak = e->bak; delete e; void lagg_fore(element *e, int d) { Element *pny = new Element(e, e->bak, d); e->bak->fram = pny; e->bak = pny; EDAF30 (Föreläsning 11) HT 2014 9 / 34

Länkade listor Lägga in på olika ställen i dubbellänkad lista // Lägga in först i listan void lagg_forst(element *forsta, int d) { lagg_fore(forsta->fram, d); // Lägga in efter void lagg_efter(element *e, int d) { lagg_fore(e->fram, d); // Lägg in sist void lagg_sist(element *forsta, int d) { lagg_efter(forsta->bak, d); EDAF30 (Föreläsning 11) HT 2014 10 / 34

Länkade listor Utskrift av cirkulär dubbellänkad lista // framlänges void skriv(element *forsta) { Element *p; for (p=forsta->fram; p!=forsta; p=p->fram) cout << p->data << ; //... och baklänges void skriv_baklanges(element *forsta) { Element *p; for (p=forsta->bak; p!=forsta; p=p->bak) cout << p->data << ; EDAF30 (Föreläsning 11) HT 2014 11 / 34

Stackar Implementering av en stack mha enkellänkad lista // stack.h #include <stdexcept> class Element; class Stack { public: Stack() : forsta(nullptr) { ~Stack(); void push(int d); void pop(); // throw(length_error) int top(); // throw(length_error) bool empty(); private: Element *forsta; Stack(const Stack&) {; Stack& operator= (const Stack&) {return *this; ; EDAF30 (Föreläsning 11) HT 2014 12 / 34

Stackar Implementering av en stack mha enkellänkad lista // stack.cpp #include "stack.h" class Element { friend class Stack; Element *nasta; int data; Element(Element *n, int d):nasta(n), data(d) { ; void Stack::push(int d) { forsta = new Element(forsta, d); EDAF30 (Föreläsning 11) HT 2014 13 / 34

Stackar Implementering av en stack mha enkellänkad lista // stack.cpp (forts.) void Stack::pop() /*throw(length_error)*/ { if (empty()) throw length_error("stack::pop"); Element *p = forsta; int d = p->data; forsta = forsta->nasta; delete p; int Stack::top() /*throw(length_error)*/ { if (empty()) throw length_error("stack::top"); return forsta->data; EDAF30 (Föreläsning 11) HT 2014 14 / 34

Stackar Implementering av en stack mha enkellänkad lista // stack.cpp (forts.) bool Stack::empty() { return!forsta; Stack::~Stack() { while (!empty()) {// Gå igenom och ta bort Element *p = forsta; forsta = forsta->nasta; delete p; EDAF30 (Föreläsning 11) HT 2014 15 / 34

Köer Implementering av kö mha enkellänkad lista + extra pekare EDAF30 (Föreläsning 11) HT 2014 16 / 34

Köer Implementering av kö mha enkellänkad lista + extra pekare // queue.h #include <stdexcept> class Element; class Queue { public: Queue() : forsta(nullptr), sista(nullptr) { ~Queue(); void push(int d); void pop(); // throw(std::length_error) int front(); // throw(std::length_error) int back(); // throw(std::length_error) bool empty(); private: Element *forsta, *sista; Queue(const Queue&) { Queue& operator= (const Queue&) { EDAF30 (Föreläsning 11) HT 2014 17 / 34

Köer Implementering av kö mha enkellänkad lista + extra pekare // queue.cpp #include "queue.h" using namespace std; class Element { friend class Queue; Element *nasta; int data; Element(Element *n, int d) : nasta(n), data(d) { ; void Queue::push(int d) { Element *pny = new Element(0, d); if (empty()) forsta = pny; else sista->nasta = pny; sista = pny; EDAF30 (Föreläsning 11) HT 2014 18 / 34

Köer Implementering av kö mha enkellänkad lista + extra pekare // queue.cpp (forts.) void Queue::pop() /*throw(length_error)*/ { if (empty()) throw length_error("queue::pop"); Element *p=forsta; forsta = forsta->nasta; if (empty()) sista = 0; delete p; int Queue::front() /*throw(length_error)*/ { if (empty()) throw length_error("queue::front"); return forsta->data; EDAF30 (Föreläsning 11) HT 2014 19 / 34

Köer Implementering av kö mha enkellänkad lista + extra pekare // queue.cpp (forts.) int Queue::back() /*throw(length_error)*/ { if (empty()) throw length_error("queue::back"); return sista->data; bool Queue::empty() { return!forsta; // Destruktorn Queue::~Queue() { while (!empty()) { Element *p = forsta; forsta = forsta->nasta; delete p; EDAF30 (Föreläsning 11) HT 2014 20 / 34

Träd Allmän trädstruktur EDAF30 (Föreläsning 11) HT 2014 21 / 34

Träd Binärt träd: Högst två barn per förälder EDAF30 (Föreläsning 11) HT 2014 22 / 34

Träd En klass för noder i ett binärt träd class Nod { public: int data; Nod *vanster, *hoger; Nod(int d=0, Nod *v=nullptr, Nod *h=nullptr) : data(d), vanster(v), hoger(h) { ; //... skapa ett litet binärträd Nod *rot = new Nod(4); rot->vanster = new Nod(2); rot->hoger = new Nod(7); EDAF30 (Föreläsning 11) HT 2014 23 / 34

Träd Gå igenom (traversera) ett träd i in-order: vänster delträd rot höger delträd // Utskrift av delträd med rot p i in-order void inorder(nod *p) { if (p!= nullptr) { inorder(p->vanster); cout << p->data << ; inorder(p->hoger); EDAF30 (Föreläsning 11) HT 2014 24 / 34

Träd Gå igenom (traversera) ett träd i pre-order: rot vänster delträd höger delträd // Utskrift av delträd med rot p i pre-order void preorder(nod *p) { if (p!= nullptr) { cout << p->data << ; preorder(p->vanster); preorder(p->hoger); EDAF30 (Föreläsning 11) HT 2014 25 / 34

Träd Gå igenom (traversera) ett träd i post-order: vänster delträd höger delträd rot // Utskrift av delträd med rot p i post-order void postorder(nod *p) { if (p!= nullptr) { postorder(p->vanster); postorder(p->hoger); cout << p->data << ; EDAF30 (Föreläsning 11) HT 2014 26 / 34

Träd Traversering av ett träd på 3 olika sätt EDAF30 (Föreläsning 11) HT 2014 27 / 34

Träd Traversering av ett träd på 3 olika sätt Resultat av inorder-utskrift 3 4 7 9 11 12 13 16 17 19 21 Resultat av preorder-utskrift 11 7 3 4 9 16 13 12 19 17 21 Resultat av postorder-utskrift 4 3 9 7 12 13 17 21 19 16 11 EDAF30 (Föreläsning 11) HT 2014 28 / 34

Träd Djupet för ett träd = antalet noder på den längsta vägen från trädets rot till något av dess löv int djup(nod *r) { if (r == nullptr) return 0; else { int vdjup = djup(r->vanster); int hdjup = djup(r->hoger); if (vdjup > hdjup) return vdjup + 1; else return hdjup + 1; EDAF30 (Föreläsning 11) HT 2014 29 / 34

Träd Binärt sökträd: Alla noder i vänstra delträdet har mindre nyckelvärden än roten och alla noder i högra har större värden EDAF30 (Föreläsning 11) HT 2014 30 / 34

Träd Egenskap hos binära sökträd: Utskrift i inorder ger värdena i växande ordning (sorterat) 3 4 7 9 11 12 13 16 17 19 21 Sökning efter visst värde Nod* sok(nod *r, int sokt) { if (r == nullptr) return nullptr; else if (sokt == r->data) return r; else if (sokt < r->data) return sok(r->vanster, sokt); else if (sokt > r->data) return sok(r->hoger, sokt); EDAF30 (Föreläsning 11) HT 2014 31 / 34

Säkrare minneshantering (ej i kursboken överkurs) I biblioteket till C++11 finns tillägg för säkra pekare, bl.a.: shared_ptr<t> make_shared<t>(params) unique_ptr<t> make_unique<t>(params) en säker pekarvariabel med delat ägarskap till ett objekt av typen T objektet tas bort när sista säkra pekaren på det försvinner skapar och returnerar en säker pekare använd i st f new T(params) en säker pekarvariabel med ensamt ägarskap till ett objekt av typen T objektet tas bort när sista säkra pekaren på det försvinner skapar och returnerar en säker pekare använd i st f new T(params) EDAF30 (Föreläsning 11) HT 2014 32 / 34

Säkrare minneshantering (exempel) En klass för noder i ett binärt träd med shared_ptr #include <memory> using namespace std; class Nod { public: int data; shared_ptr<nod> vanster, hoger; Nod(int d = 0, shared_ptr<nod> v = nullptr, shared_ptr<nod> h = nullptr) : data(d), vanster(v), hoger(h) { ~Nod() { // shared_ptr ser till noderna // i delträden tas bort när // inga pekare finns kvar på dem ; EDAF30 (Föreläsning 11) HT 2014 33 / 34

Säkrare minneshantering (exempel forts.) shared_ptr används på samma sätt som en vanlig pekare //... skapa ett litet binärträd shared_ptr<nod> rot = make_shared<nod>(4); rot->vanster = make_shared<nod>(2); rot->hoger = make_shared<nod>(7); // ta bort den enda pekaren till rotnoden // genom att tilldela rot ett nytt värde rot = nullptr; // destruktorn till Nod anropas // som anropar destruktorerna för // vanster och hoger (som anropar...) EDAF30 (Föreläsning 11) HT 2014 34 / 34