template struct elem_cir { T inf; elem_cir* link; }; template class CirList { public: CirList(); ~CirList(); CirList(CirList const &); CirList& operator=(CirList const &); void IterStart(elem_cir* = NULL); elem_cir* Iter(); void Insert(T const &); void ToEnd(T const &); void DeleteElem(elem_cir *, T &); void print(); private: elem_cir *Start, *Current; void DeleteList(); void CopyList(CirList const &); }; template CirList::CirList() { Start = Current = NULL; } template CirList::~CirList() { DeleteList(); } template CirList::CirList(CirList const &r) { CopyList(r); } template CirList& CirList::operator=(CirList const &r) { if (this != &r) { DeleteList(); CopyList(r); } return *this; } template void CirList::IterStart(elem_cir *p) { if (p) Current = p; else if (Start) Current = Start->link; else Current = NULL; } template elem_cir* CirList::Iter() { if (!Current) return NULL; elem_cir *p = Current; if (Current == Start) Current = NULL; else Current = Current->link; return p; } template void CirList::DeleteList() { IterStart(); elem_cir *p = Iter(); while (p) { delete p; p = Iter(); } } template void CirList::CopyList(CirList const &r) { Start = NULL; elem_cir *p = r.Start; if (p) { p = p->link; while (p != r.Start) { ToEnd(p->inf); p = p->link; } ToEnd(p->inf); } } template void CirList::Insert(T const &x) { elem_cir *p = new elem_cir; p->inf = x; if (Start) { p->link = Start->link; Start->link = p; } else { Start = p; Start->link = p; } } template void CirList::ToEnd(T const &x) { Insert(x); Start = Start->link; } template void CirList::DeleteElem(elem_cir *p, T &x) { x = p->inf; if (Start == Start->link) { Start = NULL; delete p; } else { elem_cir *q = Start; while (q->link != p) q = q->link; q->link = p->link; if (p == Start) Start = q; delete p; } } template void CirList::print() { IterStart(); elem_cir *p = Iter(); while (p) { cout<< p->inf <<" "; p = Iter(); } cout<<"\n"; }