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