キュー(Queue)——(3)ダイナミックチェーン実装補完(先頭ノードバージョンなし)


先頭ノードを持たない個人的な感覚は先頭ノードより理解しにくいので、先頭ノードも使いやすいので、先頭ノードのバージョンはここをクリックしてください.ここでは実装コードだけを貼ります.(C++)
myqueue.h
//       
typedef struct  _QNode
{
    char _data;
    struct  _QNode * _next;
}QNode;

typedef struct _Queue
{
    QNode *_front;
    QNode *_rear;
}Queue;

void initQueue(Queue * pq);
bool isQueueEmpty(Queue * pq);
void enQueue(Queue * pq,char data);
char deQueue(Queue * pq);
void clearQueue(Queue * pq);

 
myqueue.cpp
#include "myqueue.h"
#include 
#include 
//       
void initQueue(Queue * pq)
{
    pq->_front = pq->_rear = NULL;
}
bool isQueueEmpty(Queue * pq)
{
    if(pq->_front == pq->_rear && pq->_front == NULL)
        return 1;
    else
        return 0;
}
void enQueue(Queue * pq,char data)
{
    if(isQueueEmpty(pq)) {
        pq->_front = (QNode*)malloc(sizeof(QNode));
        pq->_front->_data = data;
        pq->_rear = pq->_front;
        pq->_rear->_next = NULL;
    }
    else{

        QNode *cur = (QNode*)malloc(sizeof(QNode));
        cur->_data = data;
        cur->_next = NULL;
        pq->_rear->_next = cur;
        pq->_rear = cur;
    }

}
char deQueue(Queue * pq)
{
    char data;
    if(pq->_front == pq->_rear){
        data = pq->_front->_data;
        free(pq->_front);
        pq->_rear = pq->_front = NULL;

    }
    else
    {
        data = pq->_front->_data;
        QNode *t = pq->_front;
        pq->_front = pq->_front->_next;
        free(t);
    }
    return data;
}

void clearQueue(Queue * pq)
{
    if(isQueueEmpty(pq))
        return ;
    QNode *t;
    while(pq->_front)
    {
        t = pq->_front;
        pq->_front = pq->_front->_next;
        free(t);
    }
}

 
main関数
#include 
#include"myqueue.h"
using namespace std;
int main()
{
    Queue q;
    initQueue(&q);
    for(char ch='A';ch<='Z';ch++)
        enQueue(&q,ch);
    while(!isQueueEmpty(&q))
        printf("%c ",deQueue(&q));
    return 0;
}