template struct q_elem {T inf; q_elem* link; }; template class queue {public: queue(); ~queue(); queue(queue const &); queue& operator=(queue const &); void InsertElem(T const&); int DeleteElem(T &); bool empty() const; void print(); private: q_elem *front, *rear; void delqueue(); void copy(queue const&); }; template queue::queue() {front = NULL; rear = NULL; } template queue::~queue() {delqueue(); } template queue::queue(queue const & r) {copy(r); } template queue& queue::operator=(queue const& r) {if (this != &r) {delqueue(); copy(r); } return *this; } template void queue::delqueue() {T x; while(DeleteElem(x)); } template void queue::copy(queue const & r) {rear = NULL; if (r.rear) {q_elem *p = r.front; while (p) {InsertElem(p->inf); p = p->link; } } } template void queue::InsertElem(T const& x) {q_elem *p = new q_elem; p->inf = x; p->link = NULL; if (rear) rear->link = p; else front = p; rear = p; } template int queue::DeleteElem(T & x) {q_elem *p; if (!rear) return 0; p = front; x = p->inf; if (p==rear) {rear = NULL; front = NULL;} else front = p->link; delete p; return 1; } template void queue::print() {T x; while (DeleteElem(x)) cout << x << " "; cout << endl; } template bool queue::empty() const {return rear == NULL; }