====== Objektový seznam (první část) ====== #include #include using namespace std; class Item; class List { public: Item * first; Item * last; private: void link (Item* before, Item* fresh, Item* after); public: void linkFirst (Item* fresh); void linkLast (Item* fresh); void linkAfter (Item* target, Item* fresh); void linkBefore (Item* target, Item* fresh); void insertFirst (string name0, int r0, int g0, int b0); void insertLast (string name0, int r0, int g0, int b0); void insertBefore (Item* target, string name0, int r0, int g0, int b0); void insertAfter (Item* target, string name0, int r0, int g0, int b0); void unlink (Item* p); void remove (Item* p); Item * find (string name0); void print (); List (); // konstruktor ~List (); // destruktor }; class Item { public: string name; int r, g, b; Item * prev; Item * next; // Item (); // konstruktor Item (string name0 = "", int r0 = 255, int g0 = 255, int b0 = 255); // konstruktor }; // Item::Item() : name(""), r(255), g(255), b(255), prev(nullptr), next(nullptr) { } Item::Item(string name0, int r0, int g0, int b0) : name(name0), r(r0), g(g0), b(b0), prev(nullptr), next(nullptr) { } List::List() // prazdny seznam { first = nullptr; last = nullptr; } List::~List() { Item* p = first; while (p != nullptr) { Item* t = p->next; delete p; p = t; } // first = nullptr; // last = nullptr; } void List::link (Item* before, Item* fresh, Item* after) { fresh->prev = before; fresh->next = after; if (before != nullptr) before->next = fresh; else first = fresh; if (after != nullptr) after->prev = fresh; else last = fresh; } void List::linkFirst (Item* fresh) { this->link (nullptr, fresh, this->first); } void List::linkLast (Item* fresh) { link (last, fresh, nullptr); } void List::linkAfter (Item* target, Item* fresh) { assert (target != nullptr); link (target, fresh, target->next); } void List::linkBefore (Item* target, Item* fresh) { assert (target != nullptr); link (target->prev, fresh, target); } void List::insertFirst (string name0, int r0, int g0, int b0) { this->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 List::insertAfter (Item* target, string name0, int r0, int g0, int b0) { linkAfter (target, new Item (name0, r0, g0, b0)); } void List::insertBefore (Item* target, string name0, int r0, int g0, int b0) { linkBefore (target, new Item (name0, r0, g0, b0)); } void List::unlink (Item* p) { assert (p != nullptr); Item* before = p->prev; Item* after = p->next; if (before != nullptr) before->next = after; else first = after; if (after != nullptr) after->prev = before; else last = before; p->prev = nullptr; p->next = nullptr; } void List::remove (Item* p) { unlink (p); delete p; } 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; // promenna pro nas seznam 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; b.insertBefore (t, "svetle " + t->name, 128, t->g, 128); // b.remove (t); } cout << endl; b.print (); List c; while (b.first != nullptr) { Item* t = b.first; b.unlink (t); c.linkFirst (t); } cout << endl; c.print (); return 0; }