====== Objektový seznam (druhá část) ====== #include #include using namespace std; class Item; class List { private: Item * first; Item * last; public: Item * getFirst () { return first; } Item * getLast () { return last; } bool empty () { return first == nullptr; } private: void link (Item* bef, Item* cur, Item* aft); public: void linkFirst (Item* cur); void linkLast (Item* cur); void insertFirst (string name0, int r0, int g0, int b0); void insertLast (string name0, int r0, int g0, int b0); Item * find (string name0); void print (); List (); ~List (); friend class Item; }; class Item { public: string name; int r, g, b; private: List * above; Item * prev; Item * next; public: Item * getPrev () { return prev; } Item * getNext () { return next; } public: void linkBefore (Item* cur); void linkAfter (Item* cur); void insertBefore (string name0, int r0, int g0, int b0); void insertAfter (string name0, int r0, int g0, int b0); void unlink (); Item (string name0 = "", int r0 = 255, int g0 = 255, int b0 = 255); ~Item () { if (above != nullptr) unlink (); } friend class List; }; Item::Item (string name0, int r0, int g0, int b0) : name (name0), r (r0), g (g0), b (b0), above (nullptr), prev (nullptr), next (nullptr) { } List::List () { first = nullptr; last = nullptr; } List :: ~ List () { Item* p = first; while (p != nullptr) { Item * t = p->next; delete p; p = t; } } void List :: link (Item* bef, Item* cur, Item* aft) { assert (cur != nullptr); assert (cur->above == nullptr); assert (bef == nullptr || bef->above == this); assert (aft == nullptr || aft->above == this); assert (bef == nullptr || bef->next == aft); assert (aft == nullptr || aft->prev == bef); cur->above = this; // nas seznam cur->prev = bef; cur->next = aft; if (bef != nullptr) bef->next = cur; else this->first = cur; if (aft != nullptr) aft->prev = cur; else last = cur; } void List :: linkFirst (Item * cur) { this->link (nullptr, cur, this->first); } void List :: linkLast (Item * cur) { link (last, cur, nullptr); } void Item::linkBefore (Item* cur) { assert (above != nullptr); above->link (this->prev, cur, this); } void Item :: linkAfter (Item* cur) { assert (above != nullptr); above->link (this, cur, this->next); } void List :: insertFirst (string name0, int r0, int g0, int b0) { linkFirst (new Item (name0, r0, g0, b0)); } void List :: insertLast (string name0, int r0, int g0, int b0) { linkLast (new Item(name0, r0, g0, b0)); } void Item :: insertBefore (string name0, int r0, int g0, int b0) { linkBefore (new Item (name0, r0, g0, b0)); } void Item :: insertAfter (string name0, int r0, int g0, int b0) { linkAfter (new Item (name0, r0, g0, b0)); } void Item::unlink () { assert (above != nullptr); Item* bef = prev; Item* aft = next; if (bef != nullptr) bef->next = aft; else above->first = aft; if (aft != nullptr) aft->prev = bef; else above->last = bef; above = nullptr; prev = nullptr; next = nullptr; } Item* List::find (string name0) { Item* p = first; while (p != nullptr && p->name != name0) { p = p->next; } return p; } void List::print () { Item * t = first; while (t != nullptr) { cout << t->name << " " << t->r << "," << t->g << "," << t->b << endl; t = t->next; } } int main() { List b; b.insertLast ("cervena", 255, 0, 0); b.insertLast ("zelena", 0, 255, 0); b.insertLast ("modra", 0, 0, 255); Item * t = b.find ("zelena"); if (t == nullptr) cout << "nenasli" << endl; else { cout << "nasli " << t->name << ", " << t->r << ", " << t->g << ", " << t->b << endl; t->insertAfter ("svetle " + t->name, 128, t->g, 128); } cout << endl; b.print (); List c; while (not b.empty ()) { Item * t = b.getLast (); t->unlink (); c.linkLast (t); } cout << endl; c.print (); return 0; }