链式队列算法库构建

学习贺利坚老师课程,构建链式队列算法库

数据结构之自建算法库——链队(链式队列)_数据结构函数链队列的算法框架有哪些-CSDN博客文章浏览阅读6.2k次,点赞3次,收藏9次。本文针对数据结构基础系列网络课程(3):栈和队列中第10课时队列的链式存储结构及其基本运算的实现。按照“0207将算法变程序”[视频]部分建议的方法,建设自己的专业基础设施算法库。链队算法库采用程序的多文件组织形式,包括两个文件:      1.头文件:liqueue.h,包含定义链队数据结构的代码、宏定义、要实现算法的函数的声明;#ifndef LIQUEUE_H_INCLUDED#de_数据结构函数链队列的算法框架有哪些https://blog.csdn.net/sxhelijian/article/details/48464501本人详细解析博客

队列的链式存储结构及其基本运算实现_队列结构及运算的实现-CSDN博客文章浏览阅读1.3k次,点赞5次,收藏7次。前面我们介绍了顺序队列的存储 ,是利用数组存储数据 , 然后删除节点数据和添加节点数据都是在数组完成的 , 有一个弊端就是 ,当我们操作的数量很大时 , 如果数组存储结构就很难队列操作了 ,那就需要利用链式存储结构了_队列结构及运算的实现https://blog.csdn.net/qq_57484399/article/details/127365820

版本更新日志:

v1.0: 对原始博客, 命名进行重构, 更有可读性

V1.0

函数功能:

//(1)初始化链队
void Init_chain_queue(chain_queue *&init_queue);
//(2)销毁链队
void Destroy_chain_queue(chain_queue *&destroy_queue);
//(3)判断链队是否为空
bool Empty_chain_queue(chain_queue *judge_queue);
//(4)遍历计算并返回链队的元素个数
int Length_chain_queue(chain_queue *measure_queue);
//(5)入队
void Enter_chain_queue(chain_queue *&enter_queue, ElemType enter_elem);
//(6)出队
bool Out_chain_queue(chain_queue *&out_queue, ElemType &out_value);

chain_queue.h头文件:

#ifndef _CHAIN_QUEUE_H_INCLUDED_
#define _CHAIN_QUEUE_H_INCLUDED_typedef char ElemType;
typedef struct chain_queue_Node
{ElemType data;struct chain_queue_Node *next;}chain_queue_Node;  //链队数据节点定义typedef struct
{chain_queue_Node *chain_queue_front;chain_queue_Node *chain_queue_rear;}chain_queue;     //链队类型定义//(1)初始化链队
void Init_chain_queue(chain_queue *&init_queue);
//(2)销毁链队
void Destroy_chain_queue(chain_queue *&destroy_queue);
//(3)判断链队是否为空
bool Empty_chain_queue(chain_queue *judge_queue);
//(4)遍历计算并返回链队的元素个数
int Length_chain_queue(chain_queue *measure_queue);
//(5)入队
void Enter_chain_queue(chain_queue *&enter_queue, ElemType enter_elem);
//(6)出队
bool Out_chain_queue(chain_queue *&out_queue, ElemType &out_value);#endif // _CHAIN_QUEUE_H_INCLUDED_

chain_queue.cpp

#include <stdio.h>
#include <malloc.h>
#include "chain_queue.h"/**************************************************
(1)函数名: Init_chain_queue
功  能: 初始化链队
参  数: chain_queue *&init_queue
思  路: 分配空间-链队首尾指针置空
返回值: 无
**************************************************/
void Init_chain_queue(chain_queue *&init_queue)
{init_queue = (chain_queue *)malloc(sizeof(chain_queue));init_queue->chain_queue_front = NULL;init_queue->chain_queue_rear = NULL;
}
/**************************************************
(2)函数名: Destroy_chain_queue
功  能: 销毁链队
参  数: chain_queue *&destroy_queue:要进行销毁的队列
思  路: 和数组有区分,我们这里要遍历释放,释放的同时,要记录后继元素
返回值: 无(只有成功,没有失败)
**************************************************/
void Destroy_chain_queue(chain_queue *&destroy_queue)
{chain_queue_Node *delete_Node;  //删除的节点chain_queue_Node *follow_Node;  //删除节点的后继线索节点//初始要删除的节点, 指向首指针指向的节点delete_Node = destroy_queue->chain_queue_front;if(delete_Node != NULL){//记录后继节点follow_Node = delete_Node->next;//当后继节点不为空时, 往后走while(follow_Node != NULL){//释放当前节点free(delete_Node);delete_Node = follow_Node;follow_Node = delete_Node->next;}}//否则free(delete_Node);//销毁此节点free(destroy_queue);//销毁首尾指针}/**************************************************
(3)函数名: Empty_chain_queue
功  能: 判断链队是否为空
参  数: chain_queue *judge_queue: 要进行判断是否为空的链队的指针
思  路: 首尾指针是否都为空
返回值: bool: 队列是否为空? true,空:false,非空
**************************************************/
bool Empty_chain_queue(chain_queue *judge_queue) //判断链队是否为空
{return (judge_queue->chain_queue_rear == NULL);
}
/**************************************************
(4)函数名: Length_chain_queue
功  能: 遍历计算并返回链队的元素个数
参  数:chain_queue *measure_queue: 要进行测量元素个数的链队
思  路: 定义节点,遍历链队, 同步跟随,计算个数
返回值: int: 返回元素个数
**************************************************/
int Length_chain_queue(chain_queue *measure_queue)
{int counter = 0;chain_queue_Node *measure_Node;//测量节点measure_Node = measure_queue->chain_queue_front;while(measure_Node != NULL){counter++;measure_Node = measure_Node->next;    //同步跟随}return counter;
}
/**************************************************
(5)函数名: Enter_chain_queue
功  能: 链队入队
参  数: (1)chain_queue *&enter_queue: 要入队的链队的指针地址(2)ElemType enter_elem: 入队的元素值
思  路: 链队入队数量不限制,只是需要区分一下指针指引,一个元素和两个元素.队列内无元素, 则需要同时修改两个指针对内有元素, 则只修改尾指针即可
返回值: 无
**************************************************/
void Enter_chain_queue(chain_queue *&enter_queue, ElemType enter_elem)
{chain_queue_Node *enter_Node;   //入队节点enter_Node = (chain_queue_Node *)malloc(sizeof(chain_queue_Node));enter_Node->data = enter_elem;enter_Node->next = NULL;//分如果一个节点和多个节点,指针指引问题if(enter_queue->chain_queue_rear == NULL){enter_queue->chain_queue_front = enter_Node;//首尾指针指向入队节点enter_queue->chain_queue_rear = enter_Node;}else{//将入队节点,链接到队尾enter_queue->chain_queue_rear->next = enter_Node;//尾指针指向入队节点enter_queue->chain_queue_rear = enter_Node;}}
/**************************************************
(6)函数名: Out_chain_queue
功  能: 出队
参  数: chain_queue *&out_queue, ElemType &out_value
注  意:  出队则需要注意,队内是否有元素,有元素,也要区分一个元素和多个元素因为只有一个元素,出队,则需要同时修改首尾指针指向空多个元素,则只需要修改队首指针
返回值: bool:是否出队成功? true,成功,队内有元素:false,失败,队内无元素
**************************************************/
bool Out_chain_queue(chain_queue *&out_queue, ElemType &out_value)//出队
{chain_queue_Node *out_Node;//判断链队是否为空if(Empty_chain_queue(out_queue)){return false;}//锁定出队节点out_Node = out_queue->chain_queue_front;//队列只有一个节点if(out_queue->chain_queue_front == out_queue->chain_queue_rear){out_queue->chain_queue_front = out_queue->chain_queue_rear = NULL;}else           //队列中有多个节点{out_queue->chain_queue_front = out_queue->chain_queue_front->next;}out_value = out_Node->data;free(out_Node);return true;
}

main.cpp测试函数

#include <stdio.h>
#include "chain_queue.h"int main()
{ElemType test_value;chain_queue *test_queue;printf("(1)初始化链队test_queue\n");Init_chain_queue(test_queue);printf("\n依次进链队元素a,b,c\n");Enter_chain_queue(test_queue,'a');Enter_chain_queue(test_queue,'b');Enter_chain_queue(test_queue,'c');printf("\n(3)链队为%s\n",(Empty_chain_queue(test_queue)?"空":"非空"));if(Out_chain_queue(test_queue,test_value) == 0){printf("\n队空,不能出队\n");}else{printf("\n(4)出队一个元素%c)\n",test_value);}printf("\n(5)链队q的元素个数为:%d\n",Length_chain_queue(test_queue));printf("\n(6)依次进链队元素d,e,f\n");Enter_chain_queue(test_queue,'d');Enter_chain_queue(test_queue,'e');Enter_chain_queue(test_queue,'f');printf("\n(7)链队test此时的元素个数是%d\n",Length_chain_queue(test_queue));printf("\n(8)出链队序列:\n");while(!Empty_chain_queue(test_queue)){Out_chain_queue(test_queue,test_value);printf("\n%c\n",test_value);}printf("\n(9)释放队列\n");Destroy_chain_queue(test_queue);return 0;
}

运行结果

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

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

相关文章

低碳短视频:成都柏煜文化传媒有限公司

低碳短视频&#xff1a;绿色传播的新风尚 随着全球气候变化和环境问题日益严峻&#xff0c;低碳生活已经成为人们追求的新风尚。在这个背景下&#xff0c;低碳短视频应运而生&#xff0c;以其独特的方式传播绿色理念&#xff0c;推动低碳生活方式的普及。成都柏煜文化传媒有限…

printf趣味代码,打印图案

文章目录 1.打印佛祖2.打印猫猫 (闪烁效果) 1.打印佛祖 #include <stdio.h>void budda_bless(){printf("///\n\ // _ooOoo_ //\n\ // o8888888o //\n\ // …

文件I/O基础-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

文件I/O基础 本章将介绍Linux应用编程中最基础的知识&#xff0c;即文件I/O&#xff08;Input/Output&#xff09;。文件I/O指的是对文件进行读写操作&#xff0c;在Linux系统中一切皆文件&#xff0c;这是Linux系统设计的核心理念&#xff0c;因此文件I/O操作既是基础又是最重…

【软件下载】Folx详细安装教程视频-Folx软件最新版下载

根据大数据调查表明Acceleration PRO下载&#xff1a;抽出多达10个流的故障能够显着提高下载速度。根据行业数据显示与iTunes PRO集成&#xff1a;通过将Folx集成到iTunes来下载歌曲和视频&#xff0c;能够在下载后立即自动添加到iTunes库。实际上我们可以这样讲通过代理下载&a…

udp udpClient 聊天室

简介 1、UDP&#xff08;User Data Protocol&#xff0c;用户数据报协议&#xff09; &#xff08;1&#xff09; UDP是一个非连接的协议&#xff0c;传输数据之前源端和终端不建立连接&#xff0c;当它想传送时就简单地去抓取来自应用程序的数据&#xff0c;并尽可能快地把它…

Vue38 安装脚手架 vue-cli ,并使用脚手架创建项目

安装脚手架 vue-cli &#xff0c;并使用脚手架创建项目 第一步 安装脚手架 npm config set registry https:\\[registry.npmmirror.com // 切换淘宝镜像 npm install -g vue/cli第二步 切换到创建项目的目录&#xff0c;创建项目 cd XXX vue create XXX第三步 启动项目 npm…

化茧成蝶 | 继HuggingFace首家落地大模型具身智能场景

关于具身智能的起源 近年来&#xff0c;大语言模型&#xff08;LLMs&#xff09;的兴起给机器人领域带来了革命性的改变&#xff0c;大模型赋予了传统机器人理解和推理的能力&#xff0c;让具身智能这一概念再度出现在大众的视角中。OpenCSG 作为国内 AI 开源社区的先锋&#…

[AI MoneyPrinterTurbo] 一键成片,超级印钞机

今天&#xff0c;我们将踏上一段关于MoneyPrinterTurbo的探索之旅&#xff0c;这是一个文生视频工具&#xff0c;旨在让视频创作变得轻松而有趣。 故事的开始 想象一下&#xff0c;你只需要提供一个视频主题或关键词&#xff0c;剩下的——视频文案、素材、字幕、背景音乐&am…

openCV3.0 C++ 学习笔记补充(自用 代码+注释)---持续更新 二(51-)

环境&#xff1a;OpenCV3.2.0 VS2015 51、Mean-Shift算法分割图像 cv::pyrMeanShiftFiltering() 参考链接&#xff1a;【从零学习OpenCV 4】分割图像——Mean-Shift分割算法 Mean-Shift算法又被称为均值漂移法&#xff0c;是一种基于颜色空间分布(彩色图像的像素值)的图像分割…

pycharm鼠标变成小方块

异常图片&#xff1a; 异常原因&#xff1a;误动了键盘insert键 解决方法&#xff1a;Fninsert

根据配置生成一个合并单元格的table表格的html代码

​分享最近工作中遇到的一个场景&#xff1a;导出表格&#xff0c;需要准备好表格的html代码&#xff0c;此表格支持最上面的表头合并且居中展示表格标题&#xff0c;如果上下行数据有相同的&#xff0c;则要上下合并单元格 封装了一个如下的方法 const configToTable (conf…

国家自然科学基金标书大全(2002-2024)

数据来源&#xff1a;在20世纪80年代初&#xff0c;为了促进中国的科技体制革新并改革科研资金分配机制&#xff0c;中国科学院的89位院士联名向党和国家领导人提出建议&#xff0c;设立了国家自然科学基金的设立。国自然基金自创立以来&#xff0c;根据国家发展科学技术方针、…

dataguard 主备切换方式switchover 和 failover 操作步骤

作者介绍&#xff1a;老苏&#xff0c;10余年DBA工作运维经验&#xff0c;擅长Oracle、MySQL、PG数据库运维&#xff08;如安装迁移&#xff0c;性能优化、故障应急处理等&#xff09; 公众号&#xff1a;老苏畅谈运维 欢迎关注本人公众号&#xff0c;更多精彩与您分享。datagu…

SpringBoot整合拦截器和日期转换器

一、SpringBoot整合拦截器 1.添加拦截器 package com.by.interceptor;import com.by.pojo.User; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import java…

【ARM】内存属性Memory Attributes (MemAttr)

目录 1. EWA 2. Device 3. Cacheable 4. Allocate 5. 内存属性的传播 6. 事务属性组合 7. Memory Type 内存属性Memory Attributes (MemAttr) 包含Early Write Acknowledgment (EWA), Device, Cacheable, 以及Allocate。 1. EWA EWA&#xff0c;Early Write Acknowledg…

AI自动生成角色和情节连续的漫画,中山大学联想提出AutoStudio,可以多轮交互式连续生成并保持主题一致性。

中山大学和联想研究院提出AutoStudio: 是一种无需训练的多代理框架&#xff0c;用于多轮交互式图像生成&#xff0c;能够在生成多样化图像的同时保持主体一致性。 AutoStudio 采用三个基于 LLM 的智能体来解释人类意图并为 SD 模型生成适当的布局指导。此外&#xff0c;还引入…

让AI保持怪异

让AI保持怪异 Anthropic的创意技术专家和员工设计师凯尔图尔曼(Kyle Turman)分享了一种深深引起共鸣的观点。他说(转述原话):“人工智能实际上真的很奇怪&#xff0c;我认为人们对这一点的认识还不够。”这引发了我向小组提出的问题:我们是否有消毒人工智能固有的陌生感的风险?…

python-序列相关

序列&#xff08;squence&#xff09;是一组按顺序、紧密排列在一起的数据集。序列的作用是便于管理、方便数据操作更重要的是序列支持切片操作。 序列主要包括&#xff1a;列表、元组、字符串和字节串 内置数据结构&#xff1a; 容器&#xff1a;列表、元组、字典、集合 结构…

Chromium 调试指南2024 Mac篇 - 准备工作 (一)

1.引言 Chromium是一个由Google主导开发的开源浏览器项目&#xff0c;它为Google Chrome浏览器提供了基础框架。Chromium不仅是研究和开发现代浏览器技术的重要平台&#xff0c;还为众多其他基于Chromium的浏览器&#xff08;如Microsoft Edge、Brave等&#xff09;提供了基础…

atcoder abc 359

A count takahashi 问题: 思路&#xff1a;字符串比较 代码&#xff1a; #include <bits/stdc.h>using namespace std;int main() {int n;cin >> n;int ans 0;for(int i 1; i < n; i ) {string s;cin >> s;if(s[0] T) ans ;}cout << ans;re…