Dvousměrný seznam

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