/* File: sl_list.C Copyright glh 9/15/92 */ #include "sl_list.H" template SlList::SlList(const T& elm) { tail->next = tail = new SlNode(elm); length = 1; } template SlList::SlList(const SlList& lst) { if (lst.Length() == 0) { length = 0; tail = NULL; } else { tail->next = tail = new SlNode(lst.Retrieve(1)); for (int i=2; i<=lst.length; i++) Append(lst.Retrieve(i)); } } template SlList& SlList::operator=(const SlList& lst) { if (this != &lst) { // check for assigning list to itself before deleting MakeEmpty(); for (int i=1; i<=lst.length; i++) Append(lst.Retrieve(i)); } return *this; } template void SlList::Insert(const T& elm, int pos) { assert((pos > 0) && (pos <= length)); SlNode* prev_node; SlNode* current_node; prev_node = current_node = tail->next; SlNode* new_node = new SlNode(elm); // create the new node if (pos == 1) { new_node->next = tail->next; tail->next = new_node; } else { current_node = current_node->next; for (int i=2; inext; } prev_node->next = new_node; // splice the new node into the list new_node->next = current_node; } length++; } template void SlList::Append(const T& elm) { SlNode* new_node = new SlNode(elm); if (tail == NULL) { //empty list tail = new_node; tail->next = tail; } else { new_node->next = tail->next; tail->next = new_node; tail = new_node; } length++; } template T& SlList::Retrieve(int pos) const { assert((pos > 0) && (pos <= length)); SlNode* temp = tail->next; for (int i=1; inext; return temp->data; } template void SlList::Delete(int pos) { assert((pos > 0) && (pos <= length)); SlNode* prev_node; SlNode* current_node; prev_node = current_node = tail->next; if (pos == 1) { if (length == 1) // deleting only node in list tail = NULL; else tail->next = current_node->next; } else { // traverse list current_node = current_node->next; for (int i=2; inext; } prev_node->next = current_node->next; if (current_node == tail) // deleting the tail node tail = prev_node; } delete current_node; length--; } template void SlList::MakeEmpty() { SlNode* temp = NULL; while (temp != tail) { temp = tail->next; tail->next = temp->next; delete temp; } delete tail; length = 0; tail=NULL; } template ostream& operator<<(ostream& os, const SlList& lst) { SlNode* temp = lst.tail->next; os << "("; if (lst.length != 0) for (int i=0; idata; if (i != lst.length-1) os << ","; temp = temp->next; } os << ")"; return os; } /* for (int i=0; idata << ","; temp = temp->next; } os << temp->data; } */ template SlListIterator::SlListIterator(const SlList* lst) { if (lst->length == 0) current=0; else current=1; list=lst; } template int SlListIterator::Reset() { if (list->length == 0) current=0; else current=1; return current; } template int SlListIterator::operator++() { if (current == list->length || list->length == 0) return 0; return(++current); } template int SlListIterator::operator++(int) { if (current == list->length || list->length == 0) return 0; return(++current); }