#ifndef __QList #define __QList #include template class Queue { private: struct QueueNode { int num; Etype data; QueueNode *Next; }; QueueNode *Front; QueueNode *Rear; Queue(const Queue &); // Prevent copy public: Queue( ) : Front( NULL ), Rear (NULL) { } // Initialize pointer ~Queue( ) { MakeEmpty( ); } // Make sure it's gone void Enqueue( const Etype & X, const int & ); void Dequeue( ); const Etype & Getdata( ) const; const int Getnum ( ) const; int IsEmpty( ) const { return Front == NULL; } // Just check pointer int IsFull( ) const { return 0; } // Not possible void MakeEmpty( ); }; template void Queue::Enqueue( const Etype & X, const int & Y ) { QueueNode *temp; temp = new QueueNode; // Make node temp->data = X; temp->num = Y; // Fill in parts temp->Next = NULL; if (Rear != NULL) { Rear->Next = temp; Rear = temp; } else Front = Rear = temp; } template void Queue::Dequeue( ) { QueueNode *Old = Front; if (IsEmpty()) // Insure validity { cout << "Attempt to Dequeue from an empty queue.\n"; exit(1); } Front = Front->Next; // Remove top if (Rear == Old) Rear = NULL; delete Old; } template const Etype & Queue::Getdata( ) const { if (IsEmpty()) // Insure validity { cout << "Attempt to access Front of empty queue.\n"; exit(1); } return Front->data; // Get front data value } template const int Queue::Getnum( ) const { if (IsEmpty()) // Insure validity { cout << "Attempt to access Front of empty queue.\n"; exit(1); } return Front->num; // Get front num value } template void Queue::MakeEmpty( ) { while( !IsEmpty( ) ) Dequeue( ); // Remove an element } #endif