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

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

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036)

Datastrukturer. Föreläsning 5. Maps 1

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Träd Hierarkiska strukturer

Föreläsning 3 Datastrukturer (DAT037)

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

Föreläsning 9 Innehåll

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

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

Föreläsning 10 Datastrukturer (DAT037)

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å

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

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

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

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

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

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

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)

Föreläsning 3 Datastrukturer (DAT037)

TDIU01 - Programmering i C++, grundkurs

Datastrukturer. föreläsning 3. Stacks 1

Trädstrukturer och grafer

Föreläsning Datastrukturer (DAT037)

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

Föreläsning Datastrukturer (DAT036)

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

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

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

Tommy Färnqvist, IDA, Linköpings universitet

TDIU01 Programmering i C++

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning Datastrukturer (DAT036)

TDDC76 - Programmering och Datastrukturer

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

Tentamen kl Uppgift 4. Uppgift 5

Föreläsning 14 Innehåll

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

TDDC76 - Programmering och Datastrukturer

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

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

Föreläsning 9 Innehåll

Föreläsning Datastrukturer (DAT036)

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

maxlist-1. Indexerad lista Länkad lista

Föreläsning 13. Träd

Lösningar Datastrukturer TDA

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

Tentamen i Algoritmer & Datastrukturer i Java

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

Datastrukturer. föreläsning 10. Maps 1

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

DAI2 (TIDAL) + I2 (TKIEK)

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

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

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

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

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

Föreläsning 4 Innehåll

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

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

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

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

13 Prioritetsköer, heapar

Seminarium 13 Innehåll

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

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

Lösningsförslag till exempeltenta 1

Föreläsning Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

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

Föreläsning 2 Datastrukturer (DAT037)

Vad har vi pratat om i kursen?

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

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

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

Föreläsning 13 Datastrukturer (DAT037)

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

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

Tentamen, Algoritmer och datastrukturer

Ordnad lista. Listor... Ordnad lista... Ordnad lista typer

Föreläsning 2. AVL-träd, Multi-Way -sökträd, B-träd TDDD71: DALG. Innehåll. Innehåll. 1 Binära sökträd

Länkade strukturer, parametriserade typer och undantag

Föreläsning 8 Datastrukturer (DAT037)

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

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Föreläsning 13 Datastrukturer (DAT037)

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

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

Föreläsning 10 Innehåll

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

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

Datastrukturer i Haskell

Transkript:

Programmering i C++ EDA623 Dynamiska datastrukturer EDA623 (Föreläsning 11) HT 2013 1 / 31

Dynamiska datastrukturer Innehåll Länkade listor Stackar Köer Träd EDA623 (Föreläsning 11) HT 2013 2 / 31

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

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) EDA623 (Föreläsning 11) HT 2013 4 / 31

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); EDA623 (Föreläsning 11) HT 2013 5 / 31

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); EDA623 (Föreläsning 11) HT 2013 6 / 31

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); EDA623 (Föreläsning 11) HT 2013 7 / 31

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 EDA623 (Föreläsning 11) HT 2013 8 / 31

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; EDA623 (Föreläsning 11) HT 2013 9 / 31

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); EDA623 (Föreläsning 11) HT 2013 10 / 31

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 << ; EDA623 (Föreläsning 11) HT 2013 11 / 31

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; ; EDA623 (Föreläsning 11) HT 2013 12 / 31

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); EDA623 (Föreläsning 11) HT 2013 13 / 31

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; EDA623 (Föreläsning 11) HT 2013 14 / 31

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; EDA623 (Föreläsning 11) HT 2013 15 / 31

Köer Implementering av kö mha enkellänkad lista + extra pekare EDA623 (Föreläsning 11) HT 2013 16 / 31

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&) { EDA623 (Föreläsning 11) HT 2013 17 / 31

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; EDA623 (Föreläsning 11) HT 2013 18 / 31

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; EDA623 (Föreläsning 11) HT 2013 19 / 31

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; EDA623 (Föreläsning 11) HT 2013 20 / 31

Träd Allmän trädstruktur EDA623 (Föreläsning 11) HT 2013 21 / 31

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

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); EDA623 (Föreläsning 11) HT 2013 23 / 31

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); EDA623 (Föreläsning 11) HT 2013 24 / 31

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); EDA623 (Föreläsning 11) HT 2013 25 / 31

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 << ; EDA623 (Föreläsning 11) HT 2013 26 / 31

Träd Traversering av ett träd på 3 olika sätt EDA623 (Föreläsning 11) HT 2013 27 / 31

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 EDA623 (Föreläsning 11) HT 2013 28 / 31

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; EDA623 (Föreläsning 11) HT 2013 29 / 31

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 EDA623 (Föreläsning 11) HT 2013 30 / 31

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); EDA623 (Föreläsning 11) HT 2013 31 / 31