链队

作者: lxr_ | 来源:发表于2022-06-28 21:00 被阅读0次

1.队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出
2.为了操作方便,我们将队头指针指向链队列的头结点,队尾指针指向终端结点,如下图所示:

链式队列
3.空队列时,front和rear都指向头结点,如下图所示
空队列
4.队列的入队操作相当于在链表尾部插入结点(注意空队列插入时要修改队头指针),队列的出队操作相当于删除头结点的后继元素结点(注意队列中只有一个元素时要修改队尾指针),具体可看链表操作总结(https://www.jianshu.com/p/faa15e9c7da1)。
LinkQueue.h
#pragma once

#define MAXSIZE 10
// 函数结果状态代码
#define OK      1
#define ERROR   0
#define INFEASIBLE  -1
#define OVERFLOW    -2

//Status 是函数的类型,其值是函数结果状态代码
typedef int Status;

//数据类型
typedef int QElemType;

//链式队列定义
typedef struct Qnode
{
    QElemType data;
    Qnode* next;
}QNode, * QueuePtr;

typedef struct
{
    QueuePtr front; //队头指针,指向头结点
    QueuePtr rear;  //队尾指针
}LinkQueue;

//链队初始化
Status InitQueue(LinkQueue& Q);

//链队销毁
Status DestroyQueue(LinkQueue& Q);

//入队
Status EnQueue(LinkQueue& Q, QElemType e);

//出队
Status DeQueue(LinkQueue& Q, QElemType& e);

//取队头元素
Status GetHead(LinkQueue Q, QElemType& e);

LinkQueue.cpp

#include "LinkQueue.h"

#include <iostream>
using namespace std;

//链队初始化
Status InitQueue(LinkQueue& Q)
{
    Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));

    if (!Q.front)
    {
        cout << "初始化失败" << endl;
        exit(OVERFLOW);
    }

    Q.front->next = NULL;
    return OK;
}

//链队销毁
Status DestroyQueue(LinkQueue& Q)
{
    QueuePtr p;
    while (Q.front)
    {
        p = Q.front->next;
        free(Q.front);
        Q.front = p;
    }
    return OK;
}

//入队
Status EnQueue(LinkQueue& Q, QElemType e)
{
    QueuePtr n = (QueuePtr)malloc(sizeof(QNode));
    if (!n)
    {
        cout << "入队失败" << endl;
        exit(OVERFLOW);
    }
    n->data = e;
    n->next = NULL;

    if (Q.front == Q.rear)  //当队列为空时,还需要修改队头指针
    {
        Q.front->next = n;
        Q.rear = n;
        return OK;
    }
    Q.rear->next = n;
    Q.rear = n;

    return OK;
}
//出队
Status DeQueue(LinkQueue& Q, QElemType& e)
{
    if (Q.front == Q.rear)
    {
        cout << "队空" << endl;
        return ERROR;
    }

    QueuePtr p = Q.front->next;
    e = p->data;

    Q.front->next = p->next;

    if (Q.rear == p)            //如果队列中只有一个元素,则头指针的next域恰好为尾指针指向的结点,还需要修改尾指针指向头结点(队列为空)
    {
        Q.rear = Q.front;
    }

    free(p);

    return OK;
}

//取队头元素
Status GetHead(LinkQueue Q, QElemType& e)
{
    if (Q.front == Q.rear)
    {
        cout << "队空" << endl;
        return ERROR;
    }
    e = Q.front->next->data;
    return OK;
}

main.cpp

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

using namespace std;

int main(int argc, char** argv)
{

    LinkQueue Q;
    InitQueue(Q);

    for (int i = 0; i < 4; i++)
    {
        EnQueue(Q, i);
    }

    QElemType e;
    GetHead(Q, e);
    cout << "队头元素:" << e << endl;
    for (int i = 0; i < 4; i++)
    {
        DeQueue(Q, e);
        cout << e << endl;
    }
    DeQueue(Q, e);          //队空

    return 0;
}

相关文章

  • 链队

    1.队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出2.为了操作方便,我们将队头指针指向链队列的头...

  • 队列的链式表示和实现(链队)

    链队是指采用链式存储结构实现的队列。通常链队用单链表来表示,其存储结构如下: 链队的初始化 (1)生成新结点作为头...

  • 栈和队列

    顺序栈的基本操作: 链栈的基本操作 顺序队的基本操作 链队的基本操作

  • 【数据结构】【C#】009-队列:👬👬链队列

    C#数据结构:链队列 1、自定义链队列结构: 链队列节点类 2、链队列类: 链队列测试用例: 输出结果: 注: 队...

  • 读书笔记

    1.对于链队,在进行删除操作时, 头、尾指针可能都要修改(当链队中只剩一个节点,头尾指针都要改变。) 2.在结构性...

  • 2019年区块链技术专利数量中企占第一

    目前,全球范围内,企业看,区块链技术竞争已经形成了第一梯队和第二梯队,截至2019年4月,阿里巴巴以290件区块链...

  • 栈和队列

    栈和队列 本质上是稍加限制的线性表 栈和队列定义 栈顺序栈定义 链栈结点定义 队列顺序队列 链队列链队类型定义 链...

  • 链队创建及操作

    #include #include using namespace std; #define OK 1 typed...

  • 数据结构 栈和队列

    数据结构 栈和队列 栈 顺序栈 top = -1 链栈 初始化 判断队空 入队: 头插法 出队: 单链表删除 队列...

  • 队列(链队列)

    队列:只允许在一段进行插入,在另一端进行删除的线性表。 链队列:使用链表实现的队列;具有队头指针和队尾指针,指示队...

网友评论

      本文标题:链队

      本文链接:https://www.haomeiwen.com/subject/rvlzvrtx.html