template class DLList { // das interne Listenelement struct Element { Element* next; Element* prev; T item; Element (T &t) { item = t; next = prev = 0; } }; public: typedef T MemberType; // Merke Grundtyp // der iterator kapselt Zeiger auf Listenelement class Iterator { private: Element* p; public: Iterator () { p=0; } Iterator (Element* q) { p=q; } bool operator!= (Iterator x) { return p!=x.p; } bool operator== (Iterator x) { return p==x.p; } Iterator operator++ () { // prefix p=p->next; return *this; } Iterator operator++ (int) { // postfix Iterator tmp = *this; p=p->next; return tmp; } Iterator operator-- () { // prefix p=p->prev; return *this; } Iterator operator-- (int) { // postfix Iterator tmp = *this; p=p->prev; return tmp; } T& operator* () { return p->item; } T* operator-> () { return &(p->item); } friend class DLList; // Liste man. p } ; // Iteratoren Iterator begin () const {return head;} Iterator end () const {return Iterator();} Iterator rbegin () const {return tail;} Iterator rend () const {return Iterator();} // Konstruktion, Destruktion, Zuweisung DLList (); DLList (const DLList& list); DLList& operator= (const DLList&); ~DLList(); // Listenmanipulation Iterator insert (Iterator i, T t);// einf. vor i void erase (Iterator i); void append (const DLList& l); void clear (); bool empty () const; int size () const; Iterator find (T t) const; private: Iterator head; // erstes Element der Liste Iterator tail; // letztes Element der Liste } ; // Insertion template typename DLList::Iterator DLList::insert (Iterator i, T t) { Element* e = new Element(t); if (empty()) { assert(i.p==0); head.p = tail.p = e; } else { e->next = i.p; if (i.p!=0) { // insert before i e->prev = i.p->prev; i.p->prev = e; if (head==i) head.p=e; } else { // insert at end e->prev = tail.p; tail.p->next = e; tail.p = e; } } return Iterator(e); } template void DLList::erase (Iterator i) { if (i.p==0) return; if (i.p->next!=0) i.p->next->prev = i.p->prev; if (i.p->prev!=0) i.p->prev->next = i.p->next; if (head==i) head.p=i.p->next; if (tail==i) tail.p=i.p->prev; delete i.p; } template void DLList::append (const DLList& l) { for (Iterator i=l.begin(); i!=l.end(); i++) insert(end(),*i); } template bool DLList::empty () const { return begin()==end(); } template void DLList::clear () { while (!empty()) erase(begin()); } // Constructors template DLList::DLList () {} template DLList::DLList (const DLList& list) { append(list); } // Assignment template DLList& DLList::operator= (const DLList& l) { if (this!=&l) { clear(); append(l); } return *this; } // Destructor template DLList::~DLList() { clear(); } // Size method template int DLList::size () const { int count = 0; for (Iterator i=begin(); i!=end(); i++) count++; return count; } template typename DLList::Iterator DLList::find (T t) const { DLList::Iterator i = begin(); while (i!=end()) { if (*i==t) break; i++; } return i; } template std::ostream& operator<< (std::ostream& s, DLList& a) { s << "("; for (typename DLList::Iterator i=a.begin(); i!=a.end(); i++) { if (i!=a.begin()) s << " "; s << *i; } s << ")" << std::endl; return s; }