Implementation of the Queue ADT Using a Circular Linked List

 

 

 

 

queue.h

 

#include <stddef.h>

 

class Queue

{

public:   

    Queue();

    ~Queue();

    Queue( /* in */ const Queue& srcQueue );

    void Enqueue( /* in */ int newItem );

    int Front() const;

    int Dequeue();

    bool IsEmpty() const;

    bool IsFull() const;

private:

    struct Node

    {

        int   item;

        Node* next;

    };

    Node* rear;

};

 

queue.cpp

 

#include "queue.h"

 

Queue::Queue()

{

    rear  = NULL;

}

 

bool Queue::IsEmpty() const

{

    return ( rear == NULL );

}

 

bool Queue::IsFull() const

{

    return false;

}

 

int Queue::Front() const

{

    return rear->next->item;

}

 

 

 

void Queue::Enqueue( /* in */ int newItem )

{

    Node* newPtr = new Node;

 

    newPtr->item = newItem;

    if ( rear == NULL )

        newPtr->next = newPtr;

    else

    {

        newPtr->next = rear->next;

        rear->next   = newPtr;

    }

    rear = newPtr;

}

 

int Queue::Dequeue()

{

    Node* front = rear->next;

    int   item = front->item;

 

    if ( front == rear )

        rear = NULL;

    else

        rear->next = front->next;

    delete front;

    return item;

}

 

Destructor

 

Queue::~Queue()

{

    if ( rear != NULL )

    {

        Node* front = rear->next;

 

        while ( front != rear )

        {

            rear->next = front->next;

            delete front;

            front = rear->next;

        }

        delete rear;

    }

}

 

Copy Constructor

 

Queue::Queue( /* in */ const Queue& srcQueue )

{

    Node* newPtr;

 

    if ( srcQueue.rear == NULL )

        rear = NULL;

    else

    {

        Node* srcPtr = srcQueue.rear->next;

        Node* front = new Node;

       

        front->item = srcPtr->item;

        rear = front;

        while ( srcPtr != srcQueue.rear )

        {

            srcPtr = srcPtr->next;

            newPtr = new Node;

            newPtr->item = srcPtr->item;

            rear->next = newPtr;

            rear = newPtr;

        }

        rear->next = front;

    }

}