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