Objektový seznam (druhá část)

#include <iostream>
#include <cassert>
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;
}
 
zpro/list4st.txt · Last modified: 2020/11/25 17:26 by 88.103.111.44
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki