Queue.h

#ifndef __CIRCULAR_QUEUE_H__
#define __CIRCULAR_QUEUE_H__

#define TRUE    1
#define FALSE   0

typedef int Data;

typedef struct _node
{
    Data data;
    struct _node *next;
} Node;

typedef struct _lQueue
{
    Node *front;
    Node *rear;
} LQueue;

typedef LQueue Queue;

void QueueInit(Queue *pq);
int QIsEmpty(Queue *pq);

void EnQueue(Queue *pq, Data data);
Data DeQueue(Queue *pq);
Data QPeek(Queue *pq);

#endif

Queue.c

#include <stdlib.h>
#include <stdio.h>
#include "Queue.h"

void QueueInit(Queue *pq)
{
    pq->front = NULL;
    pq->rear = NULL;
}
int QIsEmpty(Queue *pq)
{
    if (pq->front == NULL)
        return TRUE;
    return FALSE;
}

void EnQueue(Queue *pq, Data data)
{
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;

    if (QIsEmpty(pq))
    {
        pq->front = newNode;
        pq->rear = newNode;
    }
    else
    {
        pq->rear->next = newNode;
        pq->rear = newNode;
    }
}

Data DeQueue(Queue *pq)
{
    Node *dNode = pq->front;
    int dData = pq->front->data;
    if (QIsEmpty(pq))
        exit (1);
    pq->front = pq->front->next;
    free(dNode);
    return dData;
}

Data QPeek(Queue *pq)
{
    if (QIsEmpty(pq))
        exit (1);
    return pq->front->data;
}

Queue.h

#ifndef __CIRCULAR_QUEUE_H__
#define __CIRCULAR_QUEUE_H__

#define TRUE    1
#define FALSE   0

#define QUE_LEN 100
typedef int Data;

class Node
{
private:
    int data;
    Node *next;
public:
    int GetData()
    {
        return data;
    }
    void SetData(int _data)
    {
        data = _data;
    }
    void SetNextNode(Node *_Node)
    {
        next = _Node;
    }
    Node* GetNextNode()
    {
        return next;
    }
};

class Queue
{
private:
    Node *front;
    Node *rear;
public:
    void QueueInit();
    int QIsEmpty();

    void EnQueue(Data data);
    Data DeQueue();
    Data QPeek();
};

#endif

Queue.cpp

#include "Queue.h"
#include <iostream>

void Queue::QueueInit()
{
    front = NULL;
    rear = NULL;
}
int Queue::QIsEmpty()
{
    if (front == NULL)
        return 1;
    return 0;
}

void Queue::EnQueue(Data data)
{
    Node *newNode = new Node;
    newNode->SetData(data);
    newNode->SetNextNode(NULL);

    if (QIsEmpty())
    {
        front = newNode;
        rear = newNode;
    }
    else
    {
        rear->SetNextNode(newNode);
        rear = newNode;
    }
}
Data Queue::DeQueue()
{
    Node *dNode = front;
    int dData = front->GetData();

    if (QIsEmpty())
    {
        std::cout << "no data" << std::endl;
        exit(1);
    }
    else
    {
        front = front->GetNextNode();
        free(dNode);
    }
    return dData;
}
Data Queue::QPeek()
{
    if (QIsEmpty())
        exit(1);
    return front->GetData();
}