====== Dvousměrný seznam ====== #include #include using namespace std; struct Item; struct List { Item * first; Item * last; }; struct Item { string name; int r, g, b; Item * prev; Item * next; }; void init (List& a) // prazdny seznam { a.first = nullptr; a.last = nullptr; } void link (List& a, Item* before, Item* fresh, Item* after) { fresh->prev = before; fresh->next = after; if (before != nullptr) before->next = fresh; else a.first = fresh; if (after != nullptr) after->prev = fresh; else a.last = fresh; } void linkFirst (List& a, Item* fresh) { link (a, nullptr, fresh, a.first); } void linkLast (List& a, Item* fresh) { link (a, a.last, fresh, nullptr); } void linkAfter (List& a, Item* target, Item* fresh) { assert (target != nullptr); link (a, target, fresh, target->next); } void linkBefore (List& a, Item* target, Item* fresh) { assert (target != nullptr); link (a, target->prev, fresh, target); } void insertFirst (List& a, string name0, int r0, int g0, int b0) { Item* t = new Item; t->name = name0; t->r = r0; t->g = g0; t->b = b0; linkFirst (a, t); } void insertLast(List& a, string name0, int r0, int g0, int b0) { Item* t = new Item; t->name = name0; t->r = r0; t->g = g0; t->b = b0; linkLast (a, t); } void insertAfter(List& a, Item* target, string name0, int r0, int g0, int b0) { Item* t = new Item; t->name = name0; t->r = r0; t->g = g0; t->b = b0; linkAfter(a, target, t); } void insertBefore (List & a, Item* target, string name0, int r0, int g0, int b0) { Item* t = new Item; t->name = name0; t->r = r0; t->g = g0; t->b = b0; linkBefore (a, target, t); } Item * find (List & a, string name0) { Item * p = a.first; while (p != nullptr && p->name != name0) { p = p->next; } return p; } void print (List & a) { Item * t = a.first; while (t != nullptr) { cout << t->name << " " << t->r << "," << t->g << "," << t->b << endl; t = t->next; } } void unlink (List& a, Item* p) { assert (p != nullptr); Item * before = p->prev; Item * after = p->next; if (before != nullptr) before->next = after; else a.first = after; if (after != nullptr) after->prev = before; else a.last = before; p->prev = nullptr; p->next = nullptr; } void remove (List& a, Item* p) { unlink (a, p); delete p; } void clear (List& a) { Item * p = a.first; while (p != nullptr) { Item * t = p->next; delete p; p = t; } a.first = nullptr; a.last = nullptr; } int main() { List b; // promenna pro nas seznam init (b); insertLast (b, "cervena", 255, 0, 0); insertLast (b, "zelena", 0, 255, 0); insertLast (b, "modra", 0, 0, 255); Item * t = find (b, "zelena"); if (t == nullptr) cout << "nenasli" << endl; else { cout << "nasli " << t->name << ", " << t->r << ", " << t->g << ", " << t->b << endl; insertBefore (b, t, "svetle " + t->name, 128, t->g, 128); // remove(a, t); } cout << endl; print (b); List c; init (c); while (b.first != nullptr) { Item* t = b.first; unlink (b, t); linkFirst (c, t); } cout << endl; print(c); clear(c); return 0; }