A lista eleme. mutató rész. adat rész. Listaelem létrehozása. Node Deklarálás. Létrehozás. Az elemet nekünk kell bef zni a listába

Hasonló dokumentumok
A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

Programozás II gyakorlat. 4. Öröklődés

Programozás C++ -ban 2007/4

infix kifejezés a+b ab+ +ab postfix kifejezés prefix kifejezés a+b ab+ +ab a+b ab+ +ab Készítette: Szabóné Nacsa Rozália

4. Öröklődés. Programozás II

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

Programozás II gyakorlat. 8. Operátor túlterhelés

Programozás II. ATM példa Dr. Iványi Péter

3. Osztályok II. Programozás II

Elemi alkalmazások fejlesztése II. 2. Beadandó feladat Juhász Ádám

Körkörös listák. fej. utolsó. utolsó. fej

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Osztály és objektum fogalma

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

mul : S T N 1 ha t S mul(s, t) := 0 egyébként Keresés Ezt az eljárást a publikus m veletek lenti megvalósításánál használjuk.

500. CC Megoldó Alfréd CC 500.

117. AA Megoldó Alfréd AA 117.

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Programozás C++ -ban

500. AA Megoldó Alfréd AA 500.

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

C++ Gyakorlat jegyzet 7. óra

Maximum kiválasztás tömbben

128. AA Megoldó Alfréd AA 128.

ISA szimulátor objektum-orientált modell (C++)

Programozás II. 4. Dr. Iványi Péter

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

500. DD Megoldó Alfréd DD 500.

.AA Megoldó Alfréd AA.

Algoritmizálás + kódolás C++ nyelven és Pascalban

Programozás II. 2. Dr. Iványi Péter

1. Alapok. Programozás II

Pénzügyi algoritmusok

Bevezetés a programozásba 2

Programozás II. 6.Öröklés Dr. Iványi Péter

Dinamikus láncolt lista 4. GYAKORLAT

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

228. AA Default Konstruktor AA 228.

Bevezetés a programozásba Előadás: A const

Tervminták II. (Híd, Bejáró, Gyártófüggvény) Halmaz és bejárása Osztály-sablonok

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

503.AA Megoldo Arisztid 503.A

Algoritmusok és adatszerkezetek gyakorlat 06 Adatszerkezetek

C++ Gyakorlat jegyzet 8. óra

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

Felhasználó által definiált adattípus

félstatikus adatszerkezetek: verem, várakozási sor, hasítótábla dinamikus adatszerkezetek: lineáris lista, fa, hálózat

Feladat. Ternáris fa. Típusspecikáció. Reprezentáció. Absztrakt implementáció. Érdi Gerg EAF II. 4/3.

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Objektumorientált programozás C# nyelven

XIII. STL. Tároló Bejáró Algoritmus. XIII.1 A vector #include <vector> #include <vector> #include <algorithm> using namespace std;

Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (1. ea) C++

Fejlett programozási nyelvek C++ Iterátorok

C++ programozási nyelv Konstruktorok-destruktorok

Bevezetés a C++ programozási nyelvbe

1000.AA Megoldo Alfréd 1000.A

Alprogramok, paraméterátadás

Algoritmusok és adatszerkezetek gyakorlat 07

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

Programozás alapjai II. (2. ea) C++

Programozás alapjai II. (2. ea) C++

Objektumorientált programozás C# nyelven III.

Objektum elvű alkalmazások fejlesztése. Verem típus osztály-sablonja

Pénzügyi algoritmusok

0.2.1 Operátorok túlterhelése (műveletek definiálhatók felhaszn. típusokra) Kutya. Eb1. Eb2. Név (txt): Rex. Blöki. Német juhász 3

Programozás II gyakorlat. 6. Polimorfizmus

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

C# osztályok. Krizsán Zoltán

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

0. Megoldó Manó 0. Programozás alapjai 2. (inf.) pót zárthelyi gyak. hiányzás: 2 n/kzhp: n/11,5. ABCDEF IB.028/2.

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Programozás C++ -ban 2007/7

Objektumorientált programozás C# nyelven

INFORMATIKAI ALAPISMERETEK

Fordított és szkript nyelvek összehasonlító elemzése. Sergyán Szabolcs

Programozás I gyakorlat. 5. Struktúrák

Objektum elvű alkalmazások fejlesztése 3. beadandó

Programozás alapjai II. (1. ea) C++

Informatika terméktervezőknek

Származtatási mechanizmus a C++ nyelvben

500.AJ Megoldó Magyar Magdolna 500.J

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

111. AA Megoldó Alfréd AA 111.

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

Internet programozása. 3. előadás

Programozási alapismeretek 2009/2010

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Bevezetés a programozásba I.

Objektumok inicializálása

A C++ Standard Template Library rövid összefoglalás

Programozás(A szakirány) II. beadandó feladat Farkas András HP6S15 1. csoport Veszprémi Anna / Hudoba Péter

Programozás I gyakorlat

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Számítógép és programozás 2

Géptermi zh-írás forgatókönyve

Programozás C és C++ -ban

Átírás:

A lista eleme 0 adat rész mutató rész Listaelem létrehozása p: Node 0 0 3 0 Az elemet nekünk kell bef zni a listába Deklarálás struct Node { int int value; Node* next; next; adattagok Létrehozás Node* p=new Node(); Node(int i=0, i=0, Node *p=0) { value=i; konstruktor next=p; ; ; Node* p=new Node(3);

u: v: 0 p: 0 Node Node *u,*v,*p;.... Nem: Node* u,v,p; Node* p=new Node; u->next=p; p->next=v;.... Egy Egy elem elem bef bef zése zése a listába (vázlat) Egyirányú lista fejelemmel Reprezentáció L: head 0 Egyirányú lista fejelem nélkül L: 0 3

Feladat Lista osztály - deklaráció #ifndef #ifndeflist_h #define #define LIST_H LIST_H List.h struct structnode { int intvalue; Node* Node* next; next; Node(int i=0, i=0, Node Node *p=0):value(i),next(p){ ; ; class class List List { public: public:.... M veletek veletek.... private: private: Node* Node* head; head; ; ; #endif #endif 4

List osztály deklaráció #ifndef #ifndeflist_h #define #define LIST_H LIST_H List.h struct structnode { int intvalue; Node* Node* next; next; Node(int i=0, i=0, Node Node *p=0):value(i),next(p){ ; ; List(); List(); class class List List { Node* Node* add(int add(intvalue); List.h public: public: Node* Node* next(node* pointer); Node* Node* first(); first(); M veletek veletek Node* Node* insertafter(node* pointer, pointer, int intvalue); Node* Node* insertbefore(node* pointer, pointer, int intvalue); private: private: Node* Node* erase(node* pointer); Node* Node* head; head; bool boolempty(); ; ; //Kiegészítõ funkciók List& List& sort(); sort(); #endif #endif void void print(); print(); Lista osztály implementáció: konstruktor #include <iostream.h> #include "list.h" "list.h" using using namespace std; std; List::List() { head=0; head=0; 5

Lista osztály implementáció: insertafter() Node* List::insertAfter(Node* pointer, int intvalue) { if if (head == == 0) 0) { head ==0 head=new Node(value,0); return head; 0 else else { Node* p=new Node(value,pointer->next); pointer->next=p; return p; p; A pointer pointer által általkijelölt kijelöltelem elemután utánbeszúr beszúregy egyelemet. elemet. Visszatérési érték: érték: a a beszúrt beszúrtelemre elemremutató mutatópointer. A pointer pointer által általkijelölt elem elemután utánbeszúr beszúregy egy elemet. elemet. Visszatérési érték: érték: a a beszúrt beszúrtelemre elemremutató mutató pointer. pointer. Lista osztály implementáció: insertafter() pointer: Node* List::insertAfter(Node* pointer, int intvalue) { p: if if (head == == 0) 0) { head=new Node(value,0); return head; else else { Node* p=new Node(value,pointer->next); pointer->next=p; return p; p; 4 3 head!=!= 0 6

Lista osztály implementáció: add() Node* List::add(int value) { Node* p=head; if if (head!=!= 0) 0) { while(p->next!=!= 0) 0) { return insertafter(p,value); A lista listavégéhez végéhezcsatol csatolegy egy elemet. elemet. Visszatérési érték: érték: a a csatolt csatoltelemre elemremutató mutató pointer. pointer. 3 p: 4 0 Lista osztály implementáció: insertbefore() Node* Node* List::insertBefore(Node* pointer, pointer, int intvalue) { if if (head (head == == 0) 0) { //nincs //nincselem head=new Node(value,0); return return head; head; else else if if (pointer==head) { // // egy egyelem elem Node* Node* q=new q=new Node(value,head); head=q; A head=q; pointer pointer által általkijelölt kijelöltelem elemelé elébeszúr return return q; egy q; egyelemet. elemet. Visszatérési érték: érték: a a beszúrt beszúrtelemre elemre else else { //legalább két kételem elem mutató mutatópointer. Node* Node* p=head; p=head; while while (p->next!=!= pointer) pointer) { 3 Node* Node* q=new q=new Node(value,pointer); p->next=q; return return q; q; 7

Lista osztály implementáció: insertbefore() Node* Node* List::insertBefore(Node* pointer, pointer, int intvalue) { if if (head (head == == 0) 0) { //nincs //nincselem head=new Node(value,0); return return head; head; else else if if (pointer==head) { // // egy egyelem elem Node* Node* q=new q=new Node(value,head); head=q; head=q; return return q; q; else else { //legalább két kételem elem Node* Node* p=head; p=head; while while (p->next!=!= pointer) pointer) { Node* Node* q=new q=new Node(value,pointer); p->next=q; return return q; q; head ==0 0 Lista osztály implementáció: insertbefore() Node* Node* List::insertBefore(Node* pointer, pointer, int intvalue) { if if (head (head == == 0) 0) { //nincs //nincselem head=new Node(value,0); return return head; head; else else if if (pointer==head) { // // egy egyelem elem Node* Node* q=new q=new Node(value,head); head=q; head=q; return return q; q; else else { //legalább két kételem elem Node* Node* p=head; p=head; while while (p->next!=!= pointer) pointer) { Node* Node* q=new q=new Node(value,pointer); p->next=q; return return q; q; q: pointer == == head 8

Lista osztály implementáció: insertbefore() Node* Node* List::insertBefore(Node* pointer, pointer, int intvalue) { if if (head (head == == 0) 0) { //nincs //nincselem head=new Node(value,0); return return head; head; else else if if (pointer==head) { // // egy egyelem elem Node* Node* q=new q=new Node(value,head); head=q; head=q; return return q; q; else else { //legalább két kételem elem Node* Node* p=head; p=head; while while (p->next!=!= pointer) pointer) { Node* Node* q=new q=new Node(value,pointer); 3 p->next=q; return return q; q; p: pointer: 4 q: pointer!=!= head && head!=!= 0 3 Lista osztály implementáció: erase() Node* Node* List::erase(Node* pointer) pointer) { if if (pointer==0) return return pointer; pointer; if if (head (head == == 0) 0) {//nincs {//nincselem return return head; head; else else if if (pointer==head){// egy egyelem elem head=pointer->next; delete delete pointer; pointer; return return head; head; Törli Törlia a pointer pointer által általmutatott mutatottelemet. Visszatérési érték: érték: a a törölt töröltelemet elemetkövetõ követõelemre elemre else else {//legalább két kételem elem mutató mutatópointer. Node* Node* p=head; p=head; Ha Ha a a lista listaüres üresvolt, akkor akkornullát ad ad vissza. vissza. while(p->next!=!= pointer) pointer) { 3 p->next=pointer->next; delete delete pointer; pointer; return return p->next; 9

Lista osztály implementáció: erase() Node* Node* List::erase(Node* pointer) pointer) { if if (pointer==0) return return pointer; pointer; if if (head (head == == 0) 0) {//nincs {//nincselem return return head; head; else else if if (pointer==head){// egy egyelem elem head=pointer->next; delete delete pointer; pointer; return return head; head; else else {//legalább két kételem elem Node* Node* p=head; p=head; while(p->next!=!= pointer) pointer) { p->next=pointer->next; delete delete pointer; pointer; return return p->next; Fontos Fontos technika!! Miel Miel tt tt egy egy pointer pointer által által mutatott mutatott elemre elemre hivatkozunk, meg meg kell kell nézni, nézni, hogy hogy ez ez a a pointer pointer mutat-e mutat-e valahova. Lista osztály implementáció: erase() Node* Node* List::erase(Node* pointer) pointer) { if if (pointer==0) return return pointer; pointer; if if (head (head == == 0) 0) {//nincs {//nincselem return return head; head; else else if if (pointer==head){// egy egyelem elem head=pointer->next; delete delete pointer; pointer; return return head; head; else else {//legalább két kételem elem Node* Node* p=head; p=head; while(p->next!=!= pointer) pointer) { p->next=pointer->next; delete delete pointer; pointer; return return p->next; head == == 0 head = 0 0

Lista osztály implementáció: erase() Node* Node* List::erase(Node* pointer) pointer) { if if (pointer==0) return return pointer; pointer; if if (head (head == == 0) 0) {//nincs {//nincselem return return head; head; else else if if (pointer==head){// egy egyelem elem head=pointer->next; delete delete pointer; pointer; return return head; head; else else {//legalább két kételem elem Node* Node* p=head; p=head; while(p->next!=!= pointer) pointer) { p->next=pointer->next; delete delete pointer; pointer; return return p->next; pointer == == head pointer: head = 0 0 Lista osztály implementáció: erase() Node* Node* List::erase(Node* pointer) pointer) { if if (pointer==0) return return pointer; pointer; if if (head (head == == 0) 0) {//nincs {//nincselem return return head; head; else else if if (pointer==head){// egy egyelem elem head=pointer->next; delete delete pointer; pointer; return return head; head; else else {//legalább két kételem elem Node* Node* p=head; p=head; while(p->next!=!= pointer) pointer) { 3 p->next=pointer->next; delete delete pointer; pointer; return return p->next; p: pointer: pointer!=!= head && head!=!= 0

Lista osztály implementáció: next(), first() //Rááll a következ elemre //Visszatérési érték: a következ //Ha //Ha a lista listaüres üresvolt, akkor 0 elemre mutató pointer Node* List::next(Node* pointer) { if if (pointer==0) return pointer; else else return pointer->next; p: //Rááll az azels elemre. //Ha //Ha a lista listaüres üresvolt, akkor a visszatérési érték: 0 Node* List::first() { return head; Lista osztály implementáció: empty() //A //A visszatérési érték értékhamis, ha ha a lista listaüres bool boollist::empty() { return(head==0);

Lista osztály implementáció: operator+ List List operator+(list& l, l, List& l) l) { List List l; l; Node* p=l.first(); while (p!=0) { l.add(p->value); p=l.next(p); p=l.first(); while (p!=0) { l.add(p->value); l: p=l.next(p); return l; l; l: l: 3 4 5 3 p: 4 5 Konkatenáció Rendezés p: 3 5 p: tmp 9 7 6 0 p: 3 5 p: 9 7 6 0 if if (p==head && && p==p->next){ tm head=p; p->next=p; p->next=tmp; tmp=p; p=p; p=p; p=tmp; 3

Elem átf zése p: 3 5 p: 4 3 5 tmp: 9 7 6 0 9 7 6 0 p: p: 3 if if (p==head && && p==p->next){ tm head=p; p->next=p; p->next=tmp; tmp=p; p=p; p=p; p=tmp; tmp: p: 7 p: 3 5 p: 3 5 p: 6 9 7 6 0 if if (p==head && && p==p->next){ tm head=p; p->next=p; p->next=tmp; tmp=p; p=p; p=p; p=tmp; 9 7 6 0 tmp: 5 4

Elem átf zése 3 5 p: 9 7 6 0 p: 3 5 p: 9 7 6 0 p: Rendezés 3 5 p: 9 7 6 0 p: 3 5 p: 9 7 6 0 p: 5

Lista osztály implementáció: sort() //Növekvõ sorrendbe rendezi rendezia a listát listát List& List& List::sort(){ Node* Node* p=head; Node* Node* p; p; Node Node *q, *q,*q, *q,*tmp; *tmp; while while (p!=0) (p!=0){ while(p!=0) { if if (p->value > p->value) { // Cserebere return return *this; *this; Lista osztály implementáció: sort() if if (p==head && && p==p->next){ tm head=p; p->next=p; p->next=tmp; tmp=p; p=p; p=p; p=tmp; p: p: 6

Lista osztály implementáció: sort() else elseif if (p!=head && && p==p->next){ for(q=head;q->next!=p;q=q->next); tm q->next=p; p->next=p; p->next=tmp; tmp=p; p=p; p=p; p=tmp; p: p: Lista osztály implementáció: sort() else elseif if (p==head && && p!=p->next){ for(q=p->next;q->next!=p;q=q->next); tm head=p; p->next=p->next; q->next=p; p->next=tmp; tmp=p; p=p; p=p; p=tmp; p: p: 7

Lista osztály implementáció: sort() else elseif if (p!=head && && p!=p->next){ for(q=head;q->next!=p;q=q->next); for(q=p->next;q->next!=p;q=q->next); tm q->next=p; p->next=p->next; q->next=p; p->next=tmp; tmp=p; p=p; p=p; p=tmp; p: p: A rendezés bonyolult. Ha Ha rendezett listára szükségünk, akkor lehet hogy érdemes eleve olyan típust készíteni, amelyben rendezetten tároljuk az az elemeket. A Sorter osztály megvalósítása 8

Sorter osztály: deklaráció class classlist; class classsorter { Sorter.h public: public: Sorter(); ~Sorter(); void voidinsert(int value); value); void voidinsert(const int int t[], t[], const constint int n); n); Sorter& Sorter& insert(sorter& s); s); Sorter& Sorter& insert(list& l); l); void voidremove(int value); value); Sorter& Sorter& unique(); void voidprint(); private: private: List List *rep; *rep; ; ; Sorter osztály implementáció: konstruktor, destruktor Sorter::Sorter() { rep=new List; List; Sorter.cpp Sorter::~Sorter() { delete deleterep; 9

Sorter osztály implementáció: insert void voidsorter::insert(int value) value) { if if (rep->empty()){ rep->add(value); Ha Ha az az adatainkat tároló tároló lista lista üres, üres, akkor akkor Sorter.cpp else elseif if (value (value < rep->first()->value) { Ha Ha a a beszúrandó adat adat kisebb, kisebb, mint mint az az rep->insertbefore(rep->first(),value); adatainkat tároló tároló lista lista els els elem, elem, akkor akkor else else { Node* Node* p=rep->first(); while while (!((p->next!= 0) 0) && &&(value >= >= p->value) && &&(value <= <= (p->next)->value) (p->next== 0))) 0))) { Keressük meg meg a a beszúrás helyét, helyét, és és szúrjuk szúrjuk be! be! rep->insertafter(p,value); Sorter osztály implementáció: insert void voidsorter::insert(int value) value) { if if (rep->empty()){ rep->add(value); else elseif if (value (value < rep->first()->value) { rep->insertbefore(rep->first(),value); 4 p: 3 else else { Node* Node* p=rep->first(); while while (!((p->next!= 0) 0) && &&(value >= >= p->value) && &&(value <= <= (p->next)->value) (p->next== 0))) 0))) { Keressük meg meg a a beszúrás helyét, helyét, és és szúrjuk szúrjuk be! be! rep->insertafter(p,value); Sorter.cpp 0

Sorter osztály implementáció: insert void voidsorter::insert(const int int t[], t[], const constint int n){ n){ for for (int (int i=0; i=0; i< i< n; n; insert(t[i++])); Feltöltés tömbb tömbb l l Sorter.cpp Sorter& Sorter::insert(List& l){ l){ Node* p=l.first(); while (p!=0) { insert(p->value); return *this; Feltöltés listából listából Sorter.cpp Sorter osztály implementáció: insert Sorter& Sorter::insert(Sorter& s){ s){ Node* p=s.rep->first(); while (p!=0) { insert(p->value); p=s.rep->next(p); Feltöltés Sorter -b ll Sorter.cpp return *this;

Sorter osztály implementáció: remove() void voidsorter::remove(int value) { Node* p=rep->first(); Sorter.cpp while ((p!=0) && &&(p->value!=!= value)) { if((p!=0) && &&(p->value == == value)) { rep->erase(p); A paraméterben megadott érték (egyetlen) elemet kiveszi a sorter-b sorter-b l. l. Sorter osztály implementáció: print() void voidsorter::print() { Node* p=rep->first(); if if (p (p!=!= 0) 0) { cout cout << << "A "A lista: lista: ""; ; while(p!=!= 0) 0) { cout cout << << p->value << << """; "; cout cout << << endl; endl; else elsecout << << "Ures lista!" << << endl; endl; Sorter.cpp

A projekt Main.cpp #include <iostream.h> #include "list.h" main.cpp "list.h" #include "sorter.h" using usingnamespace std; std; int int main() main() { char charbarmi; Sorter Sorters; s; int int adat; adat; char charmuvelet; cout cout << << "muvelet(i-insert, r: r: remove, remove, u: u: unique, unique, q: q: quit) quit) "" << << endl endl ;; cin cin >> >> muvelet; while while (!(muvelet == == 'q')) 'q')){.... cin cin >> >> muvelet; cin cin >> >> barmi; barmi; return return0; 0; 3

Main.cpp #include <iostream.h> main.cpp #include "list.h" "list.h" #include "sorter.h" while using usingnamespace std; while (!(muvelet == == 'q')) 'q')){ std; switch int int main() main() { switch (muvelet) { case char charbarmi; case 'i': 'i': cin Sorter Sorters; cin >> >> adat; adat; s; s.insert(adat); int int adat; adat; break; char charmuvelet; break; case cout cout << << "muvelet(i-insert, r: r: remove, remove, u: u: unique, case 'r': unique, q: q: quit) 'r': quit) "" << << endl endl ; cin ; cin cin >> >> muvelet; cin >> >> adat; adat; s.remove(adat); while while (!(muvelet == == 'q')) 'q')){ break;... break;. case cin cin >> >> muvelet; case 'u': 'u': s.unique(); break; cin cin >> >> barmi; break; barmi; return return0; 0; s.print(); cin cin >> >> muvelet; Feladat 4

5