数据结构与算法学习笔记十---链队列的表示和实现(C语言)

目录

前言

1.什么是链队

2.链队的表示和实现

1.定义

2.初始化

3.销毁

4.清空

5.空队列

6.队列长度

7.获取队头

8.入队

9.出队

10.遍历队列

11.完整代码


前言

    本篇博客介绍链栈队列的表示和实现。

1.什么是链队

    链队是采用链式存储结构实现的队列。通常链队使用单链表表示。

   

图1.链队的示意图

     为了操作方便,我们给链队列增加一个头结点,令头指针始终指向头结点。

2.链队的表示和实现

1.定义

typedef int QElemType;
typedef int Status;
typedef struct QNode{QElemType data;struct QNode * next;
}QNode,*QueuePtr;
typedef struct {QueuePtr front;//队头指针QueuePtr rear;//队尾指针
}LinkQueue;

2.初始化

            初始化的时候给链队分配一个结点。

        图2.空队列

//初始化
Status initLinkQueue(LinkQueue * linkQueue){linkQueue->front =  linkQueue->rear = (QueuePtr)malloc(sizeof(QNode));if (!linkQueue->front) {return 0;}return 1;
}

3.销毁

        当需要销毁队列时,我们需要释放队列中所有节点的内存,并将队列结构体中的指针置空。

         我们需要遍历所有的结点,释放结点内存,最后置空头结点。

// 销毁队列
void destroyLinkQueue(LinkQueue *linkQueue) {while (linkQueue->front) { // 循环释放队列中所有节点的内存QueuePtr temp = linkQueue->front;linkQueue->front = linkQueue->front->next;free(temp);}linkQueue->rear = NULL; // 将 rear 指针置空
}

4.清空

        清空队列的方法与销毁队列的方法类似,但不释放队列结构体本身的内存,只释放队列中节点的内存并将队列恢复到初始状态。

// 清空队列
void clearLinkQueue(LinkQueue *linkQueue) {while (linkQueue->front) { // 循环释放队列中所有节点的内存QueuePtr temp = linkQueue->front;linkQueue->front = linkQueue->front->next;free(temp);}linkQueue->rear = NULL; // 将 rear 指针置空
}

5.空队列

        队头和队尾相同的时候为空队列。

// 判断队列是否为空
Status isLinkQueueEmpty(LinkQueue *linkQueue) {return linkQueue->front == NULL; // 如果队头指针为空,则队列为空
}

6.队列长度

// 计算队列长度
int getLinkQueueLength(LinkQueue *linkQueue) {int length = 0;QueuePtr p = linkQueue->front->next; // 从队头指针开始while (p != NULL) { // 遍历队列length++;p = p->next;}return length;
}

7.获取队头

        获取队头元素。

// 获取队列头结点
Status getLinkQueueFront(LinkQueue *linkQueue, QElemType *element) {if (linkQueue->front == NULL) { // 队列为空return 0;}*element = linkQueue->front->next->data; // 将队头节点的数据存储到 element 中return 1;
}

8.入队

        入队列的时候如下所示。

        图3.入队列示意图

// 入队列
Status enLinkQueue(LinkQueue * linkQueue,QElemType element){QueuePtr newNode = (QNode *)malloc(sizeof(QNode));//生成一个新节点if (!newNode) {return 0;}newNode->data = element;newNode->next = NULL;linkQueue->rear->next = newNode;linkQueue->rear = newNode;return 1;
}

9.出队

        出队列的时候如下如所示:

图4.出队列示意图

// 出队列
Status deLinkQueue(LinkQueue * linkQueue,QElemType *element){if (linkQueue->front == linkQueue->rear) {//空队列return 0;}QueuePtr p = linkQueue->front->next;// 指向头结点* element = p->data;linkQueue->front->next = p->next;//修改头指针if (linkQueue->front == p) {//如果仅有一个节点linkQueue->rear = linkQueue->front;//修改尾指针}free(p);return 1;
}

10.遍历队列

// 遍历队列(忽略头结点)
void traverseLinkQueueIgnoreHead(LinkQueue *linkQueue) {if (linkQueue->front == NULL || linkQueue->front->next == NULL) { // 队列为空或只有头结点printf("队列为空\n");return;}QueuePtr current = linkQueue->front->next; // 从头结点的下一个节点开始遍历while (current != NULL) { // 遍历直到队尾printf("%d\t", current->data); // 打印当前节点的数据current = current->next; // 移动到下一个节点}printf("\n");
}

11.完整代码

#include <stdlib.h>typedef int QElemType;
typedef int Status;
typedef struct QNode{QElemType data;struct QNode * next;
}QNode,*QueuePtr;
typedef struct {QueuePtr front;//队头指针QueuePtr rear;//队尾指针
}LinkQueue;//初始化
Status initLinkQueue(LinkQueue * linkQueue){linkQueue->front =  linkQueue->rear = (QueuePtr)malloc(sizeof(QNode));if (!linkQueue->front) {return 0;}return 1;
}
// 销毁队列
void destroyLinkQueue(LinkQueue *linkQueue) {while (linkQueue->front) { // 循环释放队列中所有节点的内存QueuePtr temp = linkQueue->front;linkQueue->front = linkQueue->front->next;free(temp);}linkQueue->rear = NULL; // 将 rear 指针置空
}
// 清空队列
void clearLinkQueue(LinkQueue *linkQueue) {while (linkQueue->front) { // 循环释放队列中所有节点的内存QueuePtr temp = linkQueue->front;linkQueue->front = linkQueue->front->next;free(temp);}linkQueue->rear = NULL; // 将 rear 指针置空
}
// 判断队列是否为空
Status isLinkQueueEmpty(LinkQueue *linkQueue) {return linkQueue->front == NULL; // 如果队头指针为空,则队列为空
}
// 计算队列长度
int getLinkQueueLength(LinkQueue *linkQueue) {int length = 0;QueuePtr p = linkQueue->front->next; // 从队头指针开始while (p != NULL) { // 遍历队列length++;p = p->next;}return length;
}
// 获取队列头结点
Status getLinkQueueFront(LinkQueue *linkQueue, QElemType *element) {if (linkQueue->front == NULL) { // 队列为空return 0;}*element = linkQueue->front->next->data; // 将队头节点的数据存储到 element 中return 1;
}
// 遍历队列
// 遍历队列(忽略头结点)
void traverseLinkQueueIgnoreHead(LinkQueue *linkQueue) {if (linkQueue->front == NULL || linkQueue->front->next == NULL) { // 队列为空或只有头结点printf("队列为空\n");return;}QueuePtr current = linkQueue->front->next; // 从头结点的下一个节点开始遍历while (current != NULL) { // 遍历直到队尾printf("%d\t", current->data); // 打印当前节点的数据current = current->next; // 移动到下一个节点}printf("\n");
}// 入队列
Status enLinkQueue(LinkQueue * linkQueue,QElemType element){QueuePtr newNode = (QNode *)malloc(sizeof(QNode));//生成一个新节点if (!newNode) {return 0;}newNode->data = element;newNode->next = NULL;linkQueue->rear->next = newNode;linkQueue->rear = newNode;return 1;
}
// 出队列
Status deLinkQueue(LinkQueue * linkQueue,QElemType *element){if (linkQueue->front == linkQueue->rear) {//空队列return 0;}QueuePtr p = linkQueue->front->next;// 指向头结点* element = p->data;linkQueue->front->next = p->next;//修改头指针if (linkQueue->front == p) {//如果仅有一个节点linkQueue->rear = linkQueue->front;//修改尾指针}free(p);return 1;
}void testLinkQueue(void){LinkQueue queue;if (initLinkQueue(&queue)) {printf("链队列初始化成功!\n");}else {printf("链队列初始化失败!\n");}if (isLinkQueueEmpty(&queue)) {printf("队列为空\n");}printf("队列长度:%d\n",getLinkQueueLength(&queue));for (int i = 1; i <= 10 ; i++) {if (enLinkQueue(&queue, i)) {printf("数据元素%d入队成功!\n",i);}else{printf("入队失败!\n");}}printf("遍历链队列初!\n");if (!isLinkQueueEmpty(&queue)) {printf("队列不为空\n");}QElemType headFront;if (getLinkQueueFront(&queue, &headFront)) {printf("队列头结点获取成功,队头元素为:%d\n",headFront);}traverseLinkQueueIgnoreHead(&queue);printf("队列长度:%d\n",getLinkQueueLength(&queue));printf("队列长度:%d\n",getLinkQueueLength(&queue));for (int i = 1; i <= 10 ; i++) {int element;if (deLinkQueue(&queue, &element)) {printf("出队列成功,出队列的数据元为素%d!\n",element);}else{printf("入队失败!\n");}}destroyLinkQueue(&queue);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/701115.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx 发布静态资源

一. nginx 发布静态资源 在nginx中nginx.conf配置文件中添加内容如下&#xff1a; server {listen 90;server_name localhost;# 配置静态资源文件&#xff0c;就可以访问了location / {root /home/fooie-shop;index index.html;}# 配置音频和图片资源location /imoo…

用大于meilisearch-java-0.7.0.jar的报错的解决

Elasticsearch 做为老牌搜索引擎&#xff0c;功能基本满足&#xff0c;但复杂&#xff0c;重量级&#xff0c;适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求&#xff0c;极快&#xff0c;单文件&#xff0c;超轻量。 所以&#xff0c;对于中小型项目来说…

Ceph集群扩容及数据再均衡原理分析

用户文件在Ceph RADOS中存储、定位过程大概包括&#xff1a;用户文件切割成对象、对象映射到PG、PG分组PGP、PG映射到OSD。这些过程中&#xff0c;可能涉及了大量概念和变量&#xff0c;而其实它们大部分是通过HASH、CRUSH等算法计算出来的&#xff0c;初始参数可能也就只有这么…

Day28

回溯算法part02 LC组合总和II 终止条件&#xff0c;sumn且mid.size()k加入result。其他终止条件sum>n或者mid.size()>k也结束一样可以引入剪枝操作进行优化&#xff0c;其实sum>n也可以算是剪枝操作的一部分 LC17电话号码的字母组合&#xff08;超时5min&#xff…

Ubuntu 安装chrome和chromedriver

1.安装包下载 百度网盘地址 2.更新软件包 sudo apt-get update 3.安装chrome sudo apt install ./google-chrome-stable_current_amd64.deb 4.检查是否安装成功 google-chrome --version 5.安装chrome-driver驱动&#xff0c;解压zip文件 unzip chromedriver_linux64.z…

如何使用AI总结超长PDF文件?NoteGPT做到了!

NoteGPT&#xff08;PDF Summary with AI - NoteGPT&#xff09;是我在做一个产品&#xff0c;其中一个功能就是如题&#xff0c;总结超长的PDF文件。 这篇文章从业务和技术的角度&#xff0c;来给大家分享下&#xff0c;我是如何实现的。 为什么要做总结总结超长PDF文件&…

【生信技能树】GEO数据挖掘全流程

R包的安装&#xff0c;每次做分析的时候先运行这段代码把R包都安装好了&#xff0c;这段代码不需要任何改动&#xff0c;每次分析直接运行。 options("repos""https://mirrors.ustc.edu.cn/CRAN/") if(!require("BiocManager")) install.packag…

RS422一主多从MAX3490

RS422一主多从MAX3490 最近项目用到了RS422一主多从&#xff0c;一个主机4个从机。芯片用的MAX3490&#xff0c;几经折腾&#xff0c;最终只能从一拖4改为一拖2。 主机发送端&#xff0c;从机4个接收端都是正常的&#xff0c;没有问题。波形非常完美&#xff0c;没有太大变形 …

超级漂亮的 Ai 官网源码

超级漂亮的 AI 官网源码 效果图部分源码领取源码下期更新预报 效果图 部分源码 <script lang"js">function project3D(x, y, z, vars) {var p, dx - vars.camXy - vars.camY - 8z - vars.camZp Math.atan2(x, z)d Math.sqrt(x * x z * z)x Math.sin(p - v…

揭秘奇葩环境问题:IDEA与Maven版本兼容性解析

1.问题描述 最近在实现通过Java爬虫获取网页源码&#xff0c;然后紧接着将源码转换为图片上传到OSS服务器&#xff0c;其中探索了很多办法&#xff0c;但是在实现过程中遇到一个奇葩问题&#xff0c;就是我无论下载任何Maven依赖&#xff0c;都无法正常下载&#xff0c;简直是…

八年前端开发之路中遇到的一些实用技巧分享——代码思路及通用场景

在开发中比较有用的代码思路 1. 链式编程2. 高阶函数应用-(添加数据并提供删除方法)3. 利用Promise链切入&#xff08;延迟执行&#xff09;4. 通过中间层来解决问题&#xff08;装饰者模式&#xff09;5. 单例模式 1. 链式编程 所谓链式编程即是函数调用后返回对象本身 let …

自动化中遇到的问题归纳总结

1、动态元素定位不到 解决方法&#xff1a;尽量使用固定元素定位&#xff0c;如没有固定元素&#xff0c;则采用绝对路径进行定位&#xff0c;因为元素路径是唯一且不变的 2、自动化脚本执行速度较慢 尽量使用css方法定位元素&#xff0c;使用等待时&#xff0c;少用sleep方…