#pragma implementation #include "list.h" // constructor template list_node::list_node():next(NULL),prev(NULL) { }; // copy constructor template list_node::list_node(const T& e):next(NULL),prev(NULL),element(e) { }; // constructor with node template list_iterator::list_iterator(list_node* n):node(n) {} // is node pointing to an element? template bool list_iterator::has_more_elements() { return node != NULL; }; // list_iterator I; // if T is a struct or class // T->field template T* list_iterator::operator->() { return &(node->element); }; // list_iterator I; // *I, element I is pointing to template T& list_iterator::operator*() { return node->element; }; // ++I template T& list_iterator::operator++() { node = node->next; return node->element; }; // I++ template T& list_iterator::operator++(int) { T& remember = node->element; node = node->next; return remember; }; // --I template T& list_iterator::operator--() { node = node->prev; return node->element; }; // I-- template T& list_iterator::operator--(int) { T& remember = node->element; node = node->prev; return remember; }; // return internal rep., ie node template list_node* list_iterator::get_node() { return node; }; // set pointer internally to NULL template void list_iterator::invalidate() { node = NULL; }; // equal template int list_iterator::operator==(const list_iterator& I) { return I.node == node; }; // not equal template int list_iterator::operator!=(const list_iterator& I) { return ! ((*this) == I); }; // I[n], (same as *(I+n) // nth element template T& list_iterator::operator[](int n) { return (*this + n).node->element; }; // I + n // iterator to nth element template list_iterator list_iterator::operator+(int n) const { if (n < 0) return operator-(-n); list_iterator I; I.node = this->node; for(int i=0;i list_iterator list_iterator::operator-(int n) const { if (n < 0) return operator+(-n); list_iterator I; I.node = this->node; for(int i=0;i void list::destroy() { list_node* ptr = _first; while(ptr != NULL) { list_node* next = ptr->next; delete ptr; ptr = next; } size = 0; }; // insert the nodes from L2 after at and // before at_nex template void list::copy(const list& L) { list_iterator I = L.first(); while(I.has_more_elements()) { insert_after(last(),*I); I++; } }; // L.insert_before(I,n) // insert n before I template void list:: insert_before(list_iterator I,const T& element) { list_node* node = I.get_node(); if (_first == NULL) { _first = new list_node(element); size = 1; _last = _first; return; } if (node == NULL) return; list_node* before = node->prev; size ++; if (before == NULL) { _first = new list_node(element); _first->next = node; node->prev = _first; return; } before->next = new list_node(element); before->next->next = node; before->next->prev = node->prev; node->prev = before->next; }; // L.insert_after(I,n) // insert n after I template void list::insert_after(list_iterator I,const T& element) { list_node *node = I.get_node(); if (_first == NULL) { _first = new list_node(element); size = 1; _last = _first; return; } if (node == NULL) return; list_node* after = node->next; size ++; if (after == NULL) { _last = new list_node(element); _last->prev = node; node->next = _last; return; } node->next = new list_node(element); node->next->prev = node; node->next->next = after; after->prev = node->next; }; // L.remove(I) // remove the element pointed to by I template void list::remove(list_iterator& I) { list_node* n = I.get_node(); if (n==NULL) return; list_node* after = n->next; list_node* before = n->prev; if (before == NULL) { _first = after; } else { before->next = after; } if (after == NULL) { _last = before; } else { after->prev = before; } size--; delete n; I.invalidate(); }; template const list_iterator list::first() const { list_iterator I(_first); return I; }; template const list_iterator list::last() const { list_iterator I(_last); return I; }; template int list::length() const { return size; }; template list::list() :_first(NULL),_last(NULL),size(0) { }; template list::list(const list& L):_first(NULL),_last(NULL),size(0) { copy(L); }; template list::~list(){ destroy(); }; template list& list::operator=(const list& L) { destroy(); copy(L); return *this; }; #include "list_inst.h"