#include "pch.h" #include #include #include using namespace std; class Item; class List { public: Item * first; Item * last; List () : first (nullptr), last (nullptr) { } ~ List (); void insertFirst(Item * p); void insertLast (Item * p); void print(); Item * search (string s); private: void link (Item * a, Item * b, Item * c); // b .. novy prvek friend class Item; }; class Item { public: string name; List * owner; Item * prev; Item * next; Item (string name0 = "") : name (name0), owner (nullptr), prev(nullptr), next(nullptr) { } void insertBefore(Item * p); // vlozit novy prvek p pred this void insertAfter(Item * p); // vlozit novy prvek p za this }; void List::link (Item * a, Item *b, Item *c) { assert(b != nullptr); assert(b->owner == nullptr); b->owner = this; b->prev = a; b->next = c; if (a != nullptr) a->next = b; else first = b; if (c != nullptr) c->prev = b; else last = b; } void List::insertFirst(Item * p) { assert (this != nullptr); link (nullptr, p, first); } void List::insertLast(Item * p) { assert(this != nullptr); link(last, p, nullptr); } void Item::insertBefore(Item * p) { assert(this != nullptr); assert(owner != nullptr); owner->link(prev, p, this); } void Item::insertAfter(Item * p) { assert(this != nullptr); assert(owner != nullptr); owner->link (this, p, next); } void List::print() { Item * p = first; while (p != nullptr) { cout << p->name << endl; p = p->next; } } Item * List::search (string s) { Item * p = first; while (p != nullptr && p->name != s) p = p->next; return p; } List::~List() { Item * p = first; while (p != nullptr) { Item * t = p->next; delete p; p = t; } } int main() { List a; Item * t = new Item("abc"); Item * u = new Item ("def"); a.insertLast(t); a.insertFirst(u); t->insertBefore(new Item("...")); u->insertAfter(new Item("???")); a.print(); cout << "O.K."; }