/***********************************************************************/
/* file dlist.cc */
/* contains the implementation of class members of class */
/* dlist. */
/***********************************************************************/
#include "dlist.h"
/***********************************************************************/
/* implementation of class dlist */
/***********************************************************************/
/***********************************************************************/
/* public member function prepend */
/* takes one argument of type and prepends an item to the list */
/* containing the passed data using the more basic member function */
/* add(). */
/***********************************************************************/
template <class type>
dlist_item<type> *dlist<type>::prepend(const type& dat)
{
return add(dat);
}
/***********************************************************************/
/* public member function first */
/* takes no argument and returns a pointer to the first item in the */
/* dlist. */
/***********************************************************************/
template <class type>
dlist_item<type> *dlist<type>::first()
{
return this->head;
}
/***********************************************************************/
/* public member function last */
/* takes no argument and returns a pointer to the last item in the */
/* dlist. */
/***********************************************************************/
template <class type>
dlist_item<type> *dlist<type>::last()
{
return this->tail;
}
/***********************************************************************/
/* public member function succ */
/* takes a pointer to an item in the dlist and returns a pointer to */
/* the successor in the dlist. */
/***********************************************************************/
template <class type>
dlist_item<type> *dlist<type>::succ(dlist_item<type> *it)
{
assert(it != NULL);
return it->next;
}
template <class type>
dlist_item<type> *dlist<type>::search(const type& dat)
{
return find(dat);
}
/***********************************************************************/
/* public member function insert */
/* takes a pointer to a dlist node and an argument type. It inserts a */
/* new item with the correct data behind the node received as first */
/* argument. */
/***********************************************************************/
template <class type>
dlist_item<type> *dlist<type>::insert_after(dlist_item<type> *parent,
const type& dat)
{
assert(parent != NULL);
dlist_item<type> *it= new dlist_item<type>(dat);
it->next= parent->next;
it->prev= parent;
parent->next= it;
this->sz++;
if (this->tail == parent) {
this->tail= it;
}
else {
it->next->prev= it;
}
return it;
}
/***********************************************************************/
/* public member function append */
/* takes an argument of type and appends an item to the dlist */
/* containing the passed data. */
/***********************************************************************/
template <class type>
dlist_item<type> *dlist<type>::append(const type& dat)
{
if (this->head != NULL) // same as if (tail != NULL)
{
return insert_after(this->tail, dat);
}
else
{
return add(dat);
}
}
template <class type>
ostream &operator<<(ostream& os, dlist<type>& sl)
{
dlist_iterator<type> *iter= sl.iterator();
forall (iter)
{
os << iter->c_value();
os << endl;
}
delete iter;
return os;
}
template <class type>
istream &operator>>(istream& is, dlist<type>& sl)
{
type dat;
while (is.good())
{
is >> dat;
if (is.good())
{
sl.append(dat);
}
}
return is;
}