#include "list.h"

List::List()
{
    _size = 0;

    header->data = 0;
    header->succ = trailer;
    header->pred = NULL;

    trailer->succ = NULL;
    trailer->pred = header;
}

List::~List()
{
    clear();
    delete trailer;
    delete header;
}

void List::clear()
{
    while (0 < _size)
        remove(0);
}

Node List::predInsert(Node Old, int New)
{
    Node T = new node;
    T->data = New;
    T->succ = Old;
    T->pred = Old->pred;
    Old->pred = T;
    T->pred->succ = T;
    _size++;
    return T;
}
Node List::succInsert(Node Old, int New)
{
    Node T = new node;
    T->data = New;
    T->pred = Old;
    T->succ = Old->succ;
    Old->succ = T;
    T->succ->pred = T;
    _size++;
    return T;
}
int List::firstInsert(int New)
{
    Node T = new node;
    T->data = New;
    T->pred = header;
    T->succ = header->succ;
    header->succ = T;
    T->succ->pred = T;
    _size++;
    return New;
}
int List::lastInsert(int New)
{
    Node T = new node;
    T->data = New;
    T->succ = trailer;
    T->pred = trailer->pred;
    trailer->pred = T;
    T->pred->succ = T;
    _size++;
    return New;
}
Node List::predInsertN(Node Old, Node New)
{
    Node T = new node;
    T = New;
    T->succ = Old;
    T->pred = Old->pred;
    Old->pred = T;
    T->pred->succ = T;
    _size++;
    return T;
}
Node List::succInsertN(Node Old, Node New)
{
    Node T = new node;
    T = New;
    T->pred = Old;
    T->succ = Old->succ;
    Old->succ = T;
    T->succ->pred = T;
    _size++;
    return T;
}

Node List::firstInsertN(Node New)
{
    Node T = new node;
    T = New;
    T->pred = header;
    T->succ = header->succ;
    header->succ = T;
    T->pred->succ = T;
    _size++;
    return T;
}
Node List::lastInsertN(Node New)
{
    Node T = new node;
    T = New;
    T->succ = trailer;
    T->pred = trailer->pred;
    trailer->pred = T;
    T->pred->succ = T;
    _size++;
    return T;
}
Node List::find(int i)
{
    Node p = first();
    while (0 < i--)
    {
        p = p->succ;
    }

    return p;
}
int List::get(int i)
{
    return find(i)->data;
}

int List::remove(int i)
{

    Node T = find(i);
    int ans = T->data;
    removeN(T);
    return ans;
}

void List::removeN(Node i)
{
    (i->pred)->succ = i->succ;
    (i->succ)->pred = i->pred;
    delete i;
    _size--;
}

Node List::searchN(int value, int n, Node p)
{
    while (0 <= n--)
        if (((p = p->pred)->data) <= value)
            break;
    return p;
}

void List::sort()
{
    Node p=first();
    for (int r = 0; r < _size; r++)
    {
        succInsert(searchN(p->data,r,p),p->data);
        p=p->succ;
        removeN(p->pred);
    }
}

int List::valid(Node p)
{
    return p && (trailer != p) && (header != p);
}