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