Objektový seznam (první část)

#include <iostream>
#include <cassert>
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;
}
 
zpro/list3ct.txt · Last modified: 2020/11/19 15:15 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