#include <iostream>

struct node {
    int data;
    struct node *next;
};
class Queue {
    node *front;
    node *rear;

 public:
    Queue() {
        front = NULL;
        rear = NULL;
    }
    void createNode(int val) {
        node *ptr;
        node *nn;
        nn = new node;
        ptr = front;
        nn->data = val;
        nn->next = NULL;
        front = nn;
        rear = nn;
    }
    void enqueue(int val) {
        if (front == NULL || rear == NULL) {
            createNode(val);
        } else {
            node *ptr;
            node *nn;
            ptr = front;
            nn = new node;
            nn->data = val;
            rear->next = nn;
            nn->next = front;
            rear = nn;
        }
    }
    void dequeue() {
        node *n;
        n = front;
        front = front->next;
        delete (n);
    }
    void traverse() {
        node *ptr;
        ptr = front;
        do {
            std::cout << ptr->data << " ";
            ptr = ptr->next;
        } while (ptr != rear->next);
        std::cout << front->data << std::endl;
    }
};
int main(void) {
    Queue q;
    q.enqueue(10);
    q.enqueue(20);
    q.enqueue(30);
    q.enqueue(40);
    q.enqueue(50);
    q.enqueue(60);
    q.enqueue(70);
    q.traverse();
    q.dequeue();
    q.traverse();
    return 0;
}

Circular Queue Using Linked List