template struct elem_link2 { T inf; elem_link2 *pred, *succ; }; template class DLList { public: DLList(); ~DLList(); DLList(DLList const &); DLList& operator=(DLList const &); void IterStart(elem_link2* = NULL); elem_link2* IterSucc(); void IterEnd(elem_link2* = NULL); elem_link2* IterPred(); void ToEnd(T const &); void DeleteElem(elem_link2 *, T &); void print(); void print_reverse(); private: elem_link2 *Start, *End, *CurrentS, *CurrentE; void DeleteList(); void CopyList(DLList const &); }; template DLList::DLList() { Start = End = NULL; } template DLList::~DLList() { DeleteList(); } template DLList::DLList(DLList const &r) { CopyList(r); } template DLList& DLList::operator=(DLList const &r) { if (this != &r) { DeleteList(); CopyList(r); } return *this; } template void DLList::DeleteList() { elem_link2 *p = Start; while (p) { Start = Start->succ; delete p; p = Start; } End = NULL; } template void DLList::CopyList(DLList const &r) { Start = End = NULL; elem_link2 *p = r.Start; while (p) { ToEnd(p->inf); p = p->succ; } } template void DLList::ToEnd(T const &x) { elem_link2 *p = new elem_link2; p->inf = x; p->succ = NULL; p->pred = End; if (End) { End->succ = p; End = p; } else { Start = End = p; } } template void DLList::IterStart(elem_link2 *p) { if (p) CurrentS = p; else CurrentS = Start; } template elem_link2* DLList::IterSucc() { elem_link2 *p = CurrentS; if (CurrentS) CurrentS = CurrentS->succ; return p; } template void DLList::IterEnd(elem_link2 *p) { if (p) CurrentE = p; else CurrentE = End; } template elem_link2* DLList::IterPred() { elem_link2 *p = CurrentE; if (CurrentE) CurrentE = CurrentE->pred; return p; } template void DLList::DeleteElem(elem_link2 *p, T &x) { x = p->inf; if (Start == End) { Start = NULL; End = NULL; } else if (p == Start) { Start = Start->succ; Start->pred = NULL; } else if (p == End) { End = End->pred; End->succ = NULL; } else { p->pred->succ = p->succ; p->succ->pred = p->pred; } delete p; } template void DLList::print() { elem_link2 *p = Start; while (p) { cout<< p->inf <<" "; p = p->succ; } cout<<"\n"; } template void DLList::print_reverse() { elem_link2 *p = End; while (p) { cout<< p->inf <<" "; p = p->pred; } cout<<"\n"; }