#ifndef LIST_H
#define LIST_H
#include <string>
using namespace std;
class Item;
class List
{
private:
Item * first;
Item * last;
public:
Item * getFirst () { return first; }
Item * getLast () { return last; }
public:
List (); // konstruktor
~ List (); // destruktor
void insertFirst (string name0);
void insertLast (string name0);
void linkFirst (Item * p);
void linkLast (Item * p);
void linkBefore (Item * old, Item * p); // vloz p pred old
void linkAfter (Item * old, Item * p); // vloz p za old
void unlink (Item * p); // odpoj p ze seznamu
void print ();
void insert (string name0);
void move (List & target); // presunout vsechny prvky z this do target
void reverse ();
private:
void link (Item * a, Item * b, Item * c); // pripoj b v poradi a, b, c
// b novy, zatim neni v senamu
// a predchudce, muze byt nulovy
// c naslednik, muze byt nulovy
};
class Item
{
private:
string name;
List * owner;
Item * prev;
Item * next;
public:
string getName () { return name; }
Item * getPrev () { return prev; }
Item * getNext () { return next; }
public:
Item (string name0 = "");
friend class List;
};
#endif // LIST_H
#include "list.h"
// #include <assert.h>
#include <cassert>
#include <iostream>
using namespace std;
List::List() :
first (nullptr),
last (nullptr)
{
}
Item::Item (string name0) :
name (name0),
owner (nullptr),
prev (nullptr),
next (nullptr)
{
}
void List::insertFirst (string name0)
{
linkFirst ( new Item (name0) );
}
void List::insertLast (string name0)
{
// Item * p = new Item;
// p->name = name0;
Item * p = new Item (name0);
linkLast (p);
}
void List::linkFirst(Item *p)
{
link (nullptr, p, first);
}
void List::linkLast(Item *p)
{
link (last, p, nullptr);
}
void List::linkBefore (Item *old, Item *p)
// vloz p pred old
{
assert (old != nullptr);
link (old->prev, p, old);
}
void List::linkAfter(Item *old, Item *p)
// vloz p za old
{
assert (old != nullptr);
link (old, p, old->next);
}
void List::link(Item *a, Item *b, Item *c)
{
// #include <cassert>
assert (b != nullptr);
assert (b->owner == nullptr);
b->owner = this;
assert (a == nullptr || a->owner == this);
assert (c == nullptr || c->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::unlink (Item *p)
{
assert (p != nullptr);
assert (p->owner == this);
Item * a = p->prev;
Item * c = p->next;
if (a != nullptr)
a->next = c; // mame predchudce, muzeme propojit
else
first = c; // nemame predchudce, naslednik se stava prvnim
if (c != nullptr)
c->prev = a;
else
last = a;
p->owner = nullptr;
p->prev = nullptr;
p->next = nullptr;
}
List::~List()
{
Item * p = first;
while (p != nullptr)
{
Item * t = p->next;
unlink (p);
delete p;
p = t;
}
}
void List::move (List & target)
{
Item * p = first;
while (p != nullptr)
{
Item * t = p->next;
unlink (p);
target.linkLast (p);
p = t;
}
}
void List::reverse ()
{
List target;
Item * p = first;
while (p != nullptr)
{
Item * t = p->next;
unlink (p);
target.linkFirst (p);
p = t;
}
target.move (*this);
}
void List::print ()
{
// #include <iostream>
cout << "[" << endl;
Item * p = first;
while (p != nullptr)
{
cout << p->name << endl;
p = p->next;
}
cout << "]" << endl << endl;
}
void List::insert (string name0)
{
Item * t = first;
while (t != nullptr && t->name <= name0)
t = t->next;
Item * p = new Item (name0);
if (t != nullptr)
linkBefore (t, p);
else
linkLast (p);
}
#include <iostream>
#include "list.h"
using namespace std;
int main()
{
List a;
a.insertFirst ("Mikes");
a.insertLast ("Bobes");
a.insertFirst ("Pasik");
a.print ();
List b;
b.insert ("Vochumurka");
b.insert ("Kremilek");
b.insert ("Racochejl");
b.print ();
// Item * t = b.getFirst();
// b.unlink (t);
// a.linkFirst (t);
a.move (b);
a.print ();
b.print ();
b.reverse();
b.print ();
return 0;
}