队列(链式)

队列,是一种先进先出的线性表,它只允许在队头删除,在队尾插入,链式队列和单链表操作类似,但是有队首指针和队尾指针,下面是链式队列的表示和实现:

#include <iostream>

using namespace std;
//队列的链式表现与实现
struct QNode
{
    int data;
    QNode *next;
};
struct LinkQueue
{
    QNode * front;
    QNode * rear;
};

//初始化链式队列
LinkQueue * InitQueue()
{
    LinkQueue*lq = (LinkQueue*)malloc(sizeof(LinkQueue));
    if (!lq)
    {
        return NULL;
    }
    lq->front=NULL;
    lq->rear=NULL;
    return lq;
}

void  DestoryQueue(LinkQueue *lq)
{
    while(lq->front)
    {
        QNode *p=lq->front->next;
        free(lq->front);
        lq->front=p;
    }

}

//插入元素e 队尾元素 插入时候先判断队列是否为空
bool EnQueue(LinkQueue *lq,int e)
{
    QNode *p=(QNode*)malloc(sizeof(QNode));
    if (p!=NULL)
    {
        p->data=e;
        p->next=NULL;

        if (lq->front==NULL&&lq->front==NULL)//判断空
        {
            lq->front=p;
        }
        else
        {
            lq->rear->next=p;
        }
        lq->rear=p;//队尾指针需要移到最后
        return true;
    }
    return false;
}
//删除队首元素 删除前先验空 e返回删除元素
bool DeQueue(LinkQueue *lq,int &e)
{
    if (lq->front==NULL&&lq->front==NULL)
    {
        return false;
    }
    QNode *qnode = lq->front;
    e=qnode->data;
    lq->front=qnode->next;
    free(qnode);
    return true;
    
}

void PrintQueue(LinkQueue *lq)
{
    if (lq->front==NULL&&lq->front==NULL)
    {
        cout<<"sorry ,the queue is empty"<<endl;
        return;
    }
    cout<<"Now print the queue:"<<endl;
    QNode *p=NULL;
    p=lq->front;
    while(p)
    {
        cout<<p->data<<endl;
        p=p->next;
    }
}

void main()
{
    LinkQueue *lq=NULL;
    if (!InitQueue())
    {
        cout<<"Initial Fail!"<<endl;
    }
    lq=InitQueue();
    int ElemNum=0;
    cout<<"请输入要插入元素的个数:";
    cin>>ElemNum;
    int Elem=0;
    for (int i=0;i<ElemNum;i++)
    {
        cout<<"请输入要插入第 "<<i+1<<" 个元素:";
        cin>>Elem;
        if (EnQueue(lq,Elem))
        {
            cout<<"插入成功"<<endl;;
        }
    }
    PrintQueue(lq);//打印队列
    int delnum;
    DeQueue(lq,delnum);//删除第一个元素
    cout<<"the delete num is :"<<delnum<<endl;
    PrintQueue(lq);//打印队列
    DestoryQueue(lq);//销毁队列
    PrintQueue(lq);//打印队列
}

执行结果如下图:

原文地址:https://www.cnblogs.com/mu-tou-man/p/3899571.html