#ifndef LIST_H
#define LIST_H
template<class T> class List;
template<class T> class ListNode {
friend class List<T>;
private:
ListNode<T> *next;
T data;
ListNode(const ListNode<T> *n, T e) : next((ListNode<T> *)n), data(e) {}
ListNode(void);
~ListNode(void) {}
};
template<class T> class List {
private:
ListNode<T> *head;
ListNode<T> *curr;
public:
List() : head(0), curr(0) {}
~List(void)
{
while ( !empty() )
remove();
}
void insert_after(T elem)
{
if ( head )
{
curr->next = new ListNode<T>(curr->next, elem);
curr = curr->next;
}
else
head = curr = new ListNode<T>((ListNode<T> *) 0, elem);
}
void insert_before(T elem)
{
ListNode<T> *p;
if ( curr == head )
head = curr = new ListNode<T>(head, elem);
else
{
for (p = head; p->next != curr; p = p->next)
;
curr = p;
insert_after(elem);
}
}
void remove(void)
{
ListNode<T> *p;
if ( curr != head )
{
for (p = head; p->next != curr; p = p->next)
;
p->next = curr->next;
}
else
head = head->next;
delete curr;
curr = head;
}
T retrieve(void) const {return curr->data;}
int find_first(void) {return !(curr = head);}
int find_prior(void)
{
ListNode<T> *p;
int fail = (curr == head);
if ( !fail )
{
for (p = head; p->next != curr; p = p->next)
;
curr = p;
}
return fail;
}
int find_next(void)
{
int fail = (curr->next == (ListNode<T> *) 0);
if ( !fail )
curr = curr->next;
return fail;
}
int empty(void) const {return (head == (ListNode<T> *) 0);}
};
#endif