IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构与算法(C语言)代码实现-队列的相关操作代码实现(链队列) -> 正文阅读

[数据结构与算法]数据结构与算法(C语言)代码实现-队列的相关操作代码实现(链队列)

队列的概念

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

我们可以把队列理解成生活中排队做核酸的场景,站在第一个位置的人叫队头,站在最后一个位置的人叫队尾。出队就是做完核酸,入队就是来新的要做核酸的人,出队只能在队头出,即每次做核酸的只能是站在最前面的人做,入队要在队尾入,即后来者只能排在后面,不能进行插队。

链队列

使用链表实现的队列。

头指针:指向链表的头节点
尾指针:指向链表的最后一个节点
队空情况:头指针和尾指针指向同一位置

实现的操作概览

  • 初始化队列
    InitLinkQueue(LinkQueue &queue);
  • 销毁队列
    DestroyLinkQueue(LinkQueue &queue);
  • 判断队列是否为空
    LinkQueueEmpty(LinkQueue queue);
  • 获取队列的长度
    LinkQueueLength(LinkQueue queue);
  • 获取队头元素
    GetHead(LinkQueue queue, ElemType &e);
  • 清空队列
    ClearLinkQueue(LinkQueue &queue);
  • 入队操作
    EnLinkQueue(LinkQueue &queue, ElemType e);
  • 出队操作
    DeLinkQueue(LinkQueue &queue, ElemType &e);

C代码实现

#include <stdio.h>
#include <cstdlib>

//###一些常量
//函数结果状态码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//队列的最大容量
#define MAXSIZE 5


//函数类型
typedef int Status;
//队列的元素类型
typedef char ElemType;


//定义链队结点结构体
typedef struct LinkQueueNode{
    //节点数据域的类型
    ElemType data;
    //next指针域
    struct LinkQueueNode *next;
}LinkQueueNode, *QueuePointer;
typedef struct{
    //头指针,指向的是头结点,下一个才是队列的首元节点
    QueuePointer front;
    //尾指针
    QueuePointer rear;
    //记录队列的长度
    int length;
}LinkQueue;

//----------------------------------------------
//初始化队列
Status InitLinkQueue(LinkQueue &queue);
//销毁队列
Status DestroyLinkQueue(LinkQueue &queue);
//判断队列是否为空
Status LinkQueueEmpty(LinkQueue queue);
//获取队列的长度
int LinkQueueLength(LinkQueue queue);
//获取队头元素
void GetHead(LinkQueue queue, ElemType &e);
//清空队列
Status ClearLinkQueue(LinkQueue &queue);
//入队操作
Status EnLinkQueue(LinkQueue &queue, ElemType e);
//出队操作
Status DeLinkQueue(LinkQueue &queue, ElemType &e);
//----------------------------------------------

int main(){
    //初始化队列
    LinkQueue *queue = new LinkQueue;
    InitLinkQueue(*queue);
    //准备元素
    ElemType e1 = 'a', e2 = 'b', e3 = 'c', e4 = 'd', e5 = 'e', e6 = 'f';
    //入队
    EnLinkQueue(*queue, e1);
    EnLinkQueue(*queue, e2);
    EnLinkQueue(*queue, e3);
    EnLinkQueue(*queue, e4);
    EnLinkQueue(*queue, e5);
    EnLinkQueue(*queue, e6);
    //判断队列是否为空
    Status isEmpty = LinkQueueEmpty(*queue);
    printf("队列是否为空:%d\n", isEmpty);//0
    //出队
    DeLinkQueue(*queue, e1);
    printf("出队元素:%c\n", e1);//a
    //出队
    DeLinkQueue(*queue, e1);
    printf("出队元素:%c\n", e1);//b
    //队列的长度
    int length = LinkQueueLength(*queue);
    printf("队列的长度:%d\n", length);//4
    //获取队头元素
    GetHead(*queue, e1);
    printf("队列头元素:%c\n", e1);//c
    //清空队列
    ClearLinkQueue(*queue);
    //出队列
    DeLinkQueue(*queue, e1);//队列为空,出队失败!
    //销毁队列
    DestroyLinkQueue(*queue);
}

/**
 * 初始化队列,构造一个空队列
 * @param queue 队列
 * @return
 */
Status InitLinkQueue(LinkQueue &queue){
    //创建链表头结点
    LinkQueueNode *node = new LinkQueueNode;
    node->next = NULL;
    //头指针和尾指针都指向头结点,形成空队
    queue.front = queue.rear = node;
    //初始化队列长度为0
    queue.length = 0;
    return OK;
}

/**
 * 判断队列是否为空,是空队列返回TRUE
 * @param queue 队列
 * @return
 */
Status LinkQueueEmpty(LinkQueue queue){
    //根据队列长度判断
    return queue.length? FALSE: TRUE;
}

/**
 * 获取队列的长度
 * @param queue 队列
 * @return
 */
int LinkQueueLength(LinkQueue queue){
    //返回length属性
    return queue.length;
}

/**
 * 清空队列
 * @param queue
 */
Status ClearLinkQueue(LinkQueue &queue){
    //将队尾指向头结点,重置队列length属性
    queue.rear = queue.front;
    queue.length = 0;
    return OK;
}

/**
 * 销毁队列
 * @param queue
 */
Status DestroyLinkQueue(LinkQueue &queue){
    //定义一个队列指针,指向队头
    QueuePointer queuePointer = queue.front->next;
    for(QueuePointer p = queuePointer; p; p=queuePointer){
        //指针后移
        queuePointer = queuePointer->next;
        //销毁p指向的节点
        delete p;
    }
    //重置队列length属性
    queue.length = 0;
    return OK;
}

/**
 * 获取队头元素
 * @param queue
 * @param e :用来存放队头的元素
 */
void GetHead(LinkQueue queue, ElemType &e){
    //队头指针的next才是头元素所在的节点
    e = queue.front->next->data;
}

/**
 * 入队操作
 * @param queue 队列
 * @param e 要入队的元素
 */
Status EnLinkQueue(LinkQueue &queue, ElemType e){
    //创建新节点
    LinkQueueNode *node =  new LinkQueueNode;
    node->data = e;
    node->next = NULL;
    //插入节点
    queue.rear->next = node;
    //尾指针后移
    queue.rear = node;
    //更新长度
    queue.length++;
    return OK;
}

/**
 * 出队操作
 * @param queue 队列
 * @param e 用来接收出队的元素
 */
Status DeLinkQueue(LinkQueue &queue, ElemType &e){
    //判断是否是空队列
    if(queue.front == queue.rear){
        printf("队列为空,出队失败!\n");
        return ERROR;
    }
    //记录出队的元素节点
    LinkQueueNode *node = queue.front->next;
    //将出队的元素给e
    e = node->data;
    //移动头指针的next指针域
    queue.front->next = node->next;
    //销毁出队的节点
    delete node;
    //更新长度
    queue.length--;
    return OK;
}


  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:59:49  更:2022-10-17 13:03:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 2:42:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计