🛵 链队列

链队列

定义数据结构

# include <iostream>
using namespace std;

typedef struct Qnode
{
    int data;
    struct Qnode *next;
} Qnode,*Qptr;

typedef struct
{
    Qnode *front; //对头指针
    Qnode*rear;  //队尾指针
} LinkQueue;

队列初始化

/**

* @brief 链队列初始化
*
* @param Q
 */
void InitQueue(LinkQueue &Q) //注意使用引用参数,否则出了函数,其改变无效
{
    Q.front = Q.rear = new Qnode; //创建头结点,头指针和尾指针指向头结点
    Q.front->next = NULL;         //头结点的next初始化为null
}

释放队列

/**
 * @brief 释放队列Q
 *
 * @param Q
 */
void freeQueue(LinkQueue &Q)
{
    if (Q.front == nullptr)
        return;
    while (Q.front != nullptr)
    {
        auto temp = Q.front;
        Q.front = Q.front->next;
        free(temp);
    }
}

链队列入队

/**

* @brief 链队列入队
*
* @param Q
* @param e
 */
void EnQueue(LinkQueue &Q, int e)
{
    Qptr s;
    s = new Qnode;
    s->data = e;
    s->next = NULL;
    Q.rear->next = s; //新元素插入队尾
    Q.rear = s;       //队尾指针后移
}

出队列

/**

* @brief 出队列
*
* @param Q
* @param e
* @return true
* @return false
 */
bool DeQueue(LinkQueue &Q, int &e)
{
    Qptr p;
    if (Q.front == Q.rear) //队空直接返回
        return false;
    p = Q.front->next; //另p指向第一个数据节点
    e = p->data;       //获取第一个节点存储内容
    Q.front->next = p->next;
    if (Q.rear == p) //若队列中只有一个元素,删除后需要修改队尾指针
        Q.rear = Q.front;
    delete p;
    return true;
}

取队头元素

/**

* @brief 取队头元素
*
* @param Q
* @return int
 */
int GetHead(LinkQueue Q)
{
    if (Q.front != Q.rear) //队列非空
        return Q.front->next->data;
    return -1;
}

测试样例

/**
 * @brief 测试样例
 *
 * @return int
 */
int main()
{
    LinkQueue Q;
    int n, x;
    InitQueue(Q);
    cout << "n:" << endl;
    cin >> n;
    while (n--)
    {
        cin >> x;
        EnQueue(Q, x);
    }
    cout << endl;
    cout << "queue heade el" << GetHead(Q) << endl;
    cout << "queue seq" << endl;
    while (true)
    {
        if (DeQueue(Q, x))
            cout << x << "\t";
        else
            break;
    }
    cout << endl;
    freeQueue(Q);
    return 0;
}
/*
n:
5
1 2 3 4 5

queue heade el1
queue seq
1       2       3       4       5
*/