====== Strom vytvořený pomocí seznamů ====== #include #include using namespace std; class Item; class Item { public: string name; int r, g, b; private: Item * above; Item * prev; Item * next; Item * first; Item * last; public: Item * getAbove () { return above; } Item * getPrev () { return prev; } Item * getNext () { return next; } Item * getFirst () { return first; } Item * getLast () { return last; } bool empty () { return first == nullptr; } private: void link (Item* before, Item* fresh, Item* after); void indent (int level); public: void linkBefore (Item* fresh); void linkAfter (Item* fresh); void linkFirst (Item* fresh); void linkLast (Item* fresh); void insertBefore (string name0, int r0 = 255, int g0 = 255, int b0 = 255); void insertAfter (string name0, int r0 = 255, int g0 = 255, int b0 = 255); void insertFirst (string name0, int r0 = 255, int g0 = 255, int b0 = 255); void insertLast (string name0, int r0 = 255, int g0 = 255, int b0 = 255); void unlink (); Item * find (string name0); Item * lookup (string name0); void print (int level = 0); Item (string name0 = "", int r0 = 255, int g0 = 255, int b0 = 255); // konstruktor ~Item (); // destruktor }; Item::Item (string name0, int r0, int g0, int b0) : name (name0), r (r0), g (g0), b (b0), above (nullptr), prev (nullptr), next (nullptr), first (nullptr), last (nullptr) { } Item::~Item () { if (above != nullptr) { unlink (); } Item* p = first; while (p != nullptr) { Item* t = p->next; delete p; p = t; } } void Item::link (Item* before, Item* fresh, Item* after) { assert (before == nullptr || before->above == this && before->next == after); // before nulove nebo z naseho seznamu, nenulove before ma za naslednika after assert (after == nullptr || after->above == this && after->prev == before); // after nulove nebo z naseho seznamu, nenulove after ma za predchudce before assert (fresh != nullptr); // test zda fresh existuje assert (fresh->above == nullptr); // test zda fresh neni v zadnem seznamu fresh->above = this; // fresh zaradime do naseho seznamu 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 Item::linkFirst (Item* fresh) { this->link (nullptr, fresh, this->first); } void Item::linkLast (Item* fresh) { link (last, fresh, nullptr); } void Item::linkBefore (Item* fresh) { assert (this != nullptr); assert (above != nullptr); above->link (this->prev, fresh, this); } void Item::linkAfter (Item* fresh) { assert (this != nullptr); assert (above != nullptr); above->link (this, fresh, this->next); } void Item::insertBefore (string name0, int r0, int g0, int b0) { linkBefore (new Item (name0, r0, g0, b0)); } void Item::insertFirst (string name0, int r0, int g0, int b0) { this->linkFirst (new Item (name0, r0, g0, b0)); } void Item::insertLast (string name0, int r0, int g0, int b0) { linkLast (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 (this != nullptr && this->above != nullptr); // existuje a je v nejakem seznamu Item* t = above; Item* before = prev; Item* after = next; if (before != nullptr) before->next = after; else t->first = after; if (after != nullptr) after->prev = before; else t->last = before; prev = nullptr; next = nullptr; above = nullptr; // jiz neni zarazen do seznamu } Item* Item::find (string name0) { Item* p = first; while (p != nullptr && p->name != name0) { p = p->next; } return p; } Item* Item::lookup (string name0) { Item* result = nullptr; if (name == name0) { result = this; } Item* p = first; while (p != nullptr && result == nullptr) { result = p->lookup (name0); p = p->next; } return result; } void Item::indent (int level) { for (int i = 1; i <= level; i++) cout << " "; } void Item::print (int level) { indent (level); cout << name << endl; if (!empty ()) { indent (level); cout << "[" << endl; Item* t = first; while (t != nullptr) { t->print (level+1); t = t->next; } indent (level); cout << "]" << endl; } } int main () { Item b ("zvirata"); // promenna pro nas seznam b.insertLast ("selmy"); b.insertLast ("sudokopytnici"); b.insertLast ("lichokopytnici"); Item * t = b.find ("selmy"); t->insertLast ("kockovite"); t->insertLast ("psovite"); t->insertLast ("medvedovite"); t = t->find ("medvedovite"); t->insertLast ("medved"); b.print (); t = b.lookup ("zvirata"); if (t != nullptr) cout << "nasli" << endl; return 0; }