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