链式队列

链队列定义:
1. 使用两个指针分别记录队头和队尾的当前位置
2. 设立一个头结点,并令头指针指向头结点,头结点的指针域指向队头元素所在的结点
3. 判空条件:头指针和尾指针均指向头结点
这里写图片描述

代码实现:
1.初始化链式队列:初始化头指针和尾指针指向头结点,令头结点的指针域为空

Status InitQueue(LinkQueue &q)
{
    q.front = q.rear = (QueuePtr)malloc(sizeof(QNode));//初始化队头和队尾的指针指向头结点
    if (!q.front)
        exit(OVERFLOW);
    q.front->next = NULL;//头结点的指针域为NULL
    return OK;
}

2.向队尾添加元素: 创建一个新结点,数据域为所插元素,指针域为空,将队尾结点的指针指向新结点,(如果新结点为头结点,那么也相当于将头结点的指针域指向新结点),最后将指向队尾的指针指向新结点。

Status EnQueue(LinkQueue &q, ElemType e)
{
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));//创建新结点
    if (!p)
        exit(OVERFLOW);
    p->data = e;//新结点数据为w
    p->next = NULL;//下一个结点初始化为NULL
    q.rear->next = p; //将队尾结点的指针指向新结点,如果新结点为第一个结点则q->rear->next相当于q->front->next,为头结点指针域赋值
    q.rear = p;//将指向队尾的指针指向新结点
    return OK;
}

3.队头元素出队:如果头尾指针指向相同,队列为空队。否则,取出头结点指针域所指队头结点的元素。头结点指针指向队头结点的指针域,生成新的队头结点。如果队中只有一个元素,元素出队后队尾指针指向头结点。

Status DeQueue(LinkQueue &q, ElemType &e)
{
    if (q.rear == q.front)
        return ERROR;
    QueuePtr p = q.front->next;
    if (q.front->next == q.rear)//如果队中只有一个元素,元素出队后队尾指针指向头结点
        q.rear = q.front;
    e = p->data;
    q.front->next = p->next;
    return OK;
}

4.清空,销毁队列

Status DestroyQueue(LinkQueue &q)
{
    while (q.front)//头指针不空
    {
        q.rear = q.front->next;//尾指针指向头指针的指针域
        free(q.front);//释放头指针空间
        q.front = q.rear;//头指针指向尾指针
    }
    return OK;
}
void Clear(LinkQueue &q)
{
    DestroyQueue(q);
    InitQueue(q);
}

5.判断队列是否为空:头尾指针是否相同

Status QueueEmpty(LinkQueue q)
{
    return q.front == q.rear;
}

6.队列元素个数统计:从队头结点开始计算,一直到队尾结点

int QueueLength(LinkQueue q)
{
    int count = 0;
    for (QueuePtr p = q.front; p != q.rear; p = p->next)
        count++;
    return count;
}

7.取出队头元素:若队列不空,则返回头结点所指队头结点的数据域

Status GetTop(LinkQueue q, ElemType &e)
{
    if (q.front == q.rear)
        return ERROR;
    e = q.front->next->data;
    return OK;
}

8.遍历队列元素:从队头元素开始,到队尾结束

Status QueueTraverse(LinkQueue q)
{
    if (q.front == q.rear)
        return ERROR;
    QueuePtr p = q.front->next;
    for (; p != q.rear; p = p->next)
        cout << p->data<<" ";
    cout << p->data ;
    return OK;
}

main.cpp:

#include"LinkQueue.h"

ElemType e;

int main()
{
    LinkQueue q;
    if (InitQueue(q))
        cout << "链队列初始化完成" << endl;
    if (QueueEmpty(q))
        cout << "队列为空" << endl;
    else
        cout << "队列中元素共"<<QueueLength(q) <<"个"<< endl;
    for (int i = 0; i < 5; i++)
    {
        cin >> e;
        EnQueue(q, e);
    }
    if (QueueEmpty(q))
        cout << "队列为空" << endl;
    else
        cout << "队列中元素共" << QueueLength(q) << "个" << endl;
    QueueTraverse(q);
    cout << endl;
    DeQueue(q, e);
    cout << "取出队头元素" << e << endl;
    GetTop(q, e);
    cout << "队列的队头元素为" << e << endl;
    Clear(q);
    if (QueueEmpty(q))
        cout << "队列为空" << endl;
    else
        cout << "队列中元素共" << QueueLength(q) << "个" << endl;
    if (DestroyQueue(q))
        cout << "队列已被销毁" << endl;
    system("pause");
    return 0;
}

控制台输出结果:
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值