/***********************************************************************/ /* file slist.cc */ /* contains the implementation of class members of class */ /* slist. */ /***********************************************************************/ #include "slist.h" /***********************************************************************/ /* implementation of class slist */ /***********************************************************************/ /***********************************************************************/ /* operator= */ /* copies all data members of the passed slist. The resulting slist */ /* is a new copy of the passed list. */ /***********************************************************************/ template <class type> const slist<type>& slist<type>::operator=(const slist<type>& sl) { this->sz= sl.sz; if (sl.head != NULL) { this->head= new slist_item<type>(*sl.head); this->tail= this->head; while (this->tail->next) { this->tail= this->tail->next; } } else { if (this->head != NULL) { delete this->head; } this->head= NULL; this->tail= NULL; } return *this; } /***********************************************************************/ /* 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> slist_item<type> *slist<type>::prepend(const type& dat) { return add(dat); } /***********************************************************************/ /* public member function del_item */ /* takes a pointer on an slist_item and deletes it deletes from the */ /* slist. Its data is returned. */ /***********************************************************************/ template <class type> type slist<type>::del_item(slist_item<type>* it) { assert(it != NULL); type data= it->data; del(data); return data; } /***********************************************************************/ /* public member function first */ /* takes no argument and returns a pointer to the first item in the */ /* slist. */ /***********************************************************************/ template <class type> slist_item<type> *slist<type>::first() { return this->head; } /***********************************************************************/ /* public member function last */ /* takes no argument and returns a pointer to the last item in the */ /* slist. */ /***********************************************************************/ template <class type> slist_item<type> *slist<type>::last() { return this->tail; } /***********************************************************************/ /* public memeber function search */ /* takes an argument of type and searches an item containing this data.*/ /* A pointer on the item containing the correct data ist returned if */ /* found; otherwise NULL is returned. */ /***********************************************************************/ template <class type> slist_item<type> *slist<type>::search(const type& dat) { if (this->head != NULL) { slist_item<type> *parent= parent_search(dat); if (parent) { return parent->next; } else { return this->head; } } else { return NULL; } } /***********************************************************************/ /* public member function succ */ /* takes a pointer to an item in the slist and returns a pointer to */ /* the successor in the slist. */ /***********************************************************************/ template <class type> slist_item<type> *slist<type>::succ(slist_item<type> *it) { assert(it != NULL); return it->next; } /***********************************************************************/ /* public member function insert */ /* takes a pointer to a slist node and an argument type. It inserts a */ /* new item with the correct data behind the node received as first */ /* argument. */ /***********************************************************************/ template <class type> slist_item<type> *slist<type>::insert(slist_item<type> *parent, const type& dat) { assert(parent != NULL); slist_item<type> *it= new slist_item<type>(dat); it->next= parent->next; parent->next= it; this->sz++; if (this->tail == parent) { this->tail= it; } return it; } /***********************************************************************/ /* public member function append */ /* takes an argument of type and appends an item to the slist */ /* containing the passed data. */ /***********************************************************************/ template <class type> slist_item<type> *slist<type>::append(const type& dat) { if (this->head != NULL) // same as if (tail != NULL) { return insert(this->tail, dat); } else { return add(dat); } } template <class type> ostream &operator<<(ostream& os, slist<type>& sl) { slist_iterator<type> *iter= sl.iterator(); while(iter->step()) { os << iter->c_value(); os << endl; } delete iter; return os; } template <class type> istream &operator>>(istream& is, slist<type>& sl) { type dat; while (is.good()) { is >> dat; if (is.good()) { sl.append(dat); } } return is; }