链式队列算法库构建

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

数据结构之自建算法库——链队(链式队列)_数据结构函数链队列的算法框架有哪些-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;
}


运行结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习--概念理解

知识点 一、机器学习概述 人工智能 机器学习 深度学习 学习的范围&#xff1a;模式识别、数据挖掘、统计学习、计算机视觉、语音识别、自然语言处理 可以解决的问题&#xff1a;给定数据的预测问题 二、机器学习的类型 监督学习 分类 回归 无监督学习 聚类 降维 强化…

iOS项目开发遇到问题杂项坑点记录

ios17 弹窗UIAlertController展示逻辑变化&#xff0c;单个词一行展示不下不换行&#xff08;这前版本会换行&#xff09;&#xff0c;直接截断超出部分。 UINavigationController push立刻pop会异常&#xff0c;使用用setViewCollerllers可以避免这个问题 键盘切换后立刻切页…

【React Native】measureInWindow在安卓上无法正确获取View在屏幕上的布局信息

问题描述&#xff1a; 在React Native中&#xff0c;我们可以使用measureInWindow的方式去获取一个View在屏幕中的位置信息&#xff1a; 下面这个Demo中&#xff0c;我们写了一个页面HomePage和一个列表项组件ListItemA&#xff0c;我们期望每过5s监测一次列表中每一项在屏幕中…

通过搭建 24 点小游戏应用实战,带你了解 AppBuilder 的技术原理

本文将通过一个 24 点小游戏的案例&#xff0c;详细介绍百度智能云千帆 AppBuilder 的基本技术原理和使用方法&#xff0c;帮助读者快速掌握 AI 原生应用的开发流程。 1 三步构建 AI 原生应用方法论 AI 原生应用与传统应用的最大区别是交互形态彻底的拟人化&#xff0c;通过文…

【Linux学习十八】网站管理:防火墙介绍、静态站点、动态站点、域名

1.Apache Apache官网: www.apache.org 软件包名称: httpd 服务端口:80/tcp(http) 443/tcp(https) 配置文件: /etc/httpd/conf/httpd.conf 子配置文件:/etc/httpd/conf.d/*.conf 查看被占用的端口号 netstat -tuln | grep <端口号> 解哪个程序正在使用端口 80&#xff0…

vue封装原生table表格方法

适用场景&#xff1a;有若干个表格&#xff0c;前面几列格式不一致&#xff0c;但是后面几列格式皆为占一个单元格&#xff0c;所以需要封装表格&#xff0c;表格元素自动根据数据结构生成即可&#xff1b;并且用户可新增列数据。 分类&#xff1a; 固定数据部分 就是根据数据…

docker配置redis主从复制

下载redis,复制redis.conf 主节点(6379) 修改redis.conf # bind 127.0.0.1 # 注释掉这里 protected-mode no # 改为no port 6379从节点(6380) 修改redis.conf bind 127.0.0.1 protected-mode no # 改为no port 6380 replicaof 172.17.0.2 6379 # 这里的ip为主节点容器的i…

SpringSecutrity原理

一、基于RBAC实现的权限管理通常需要涉及以下几张表&#xff1a; 1. 用户表&#xff08;user&#xff09;&#xff1a;记录系统中的所有用户&#xff0c;包括用户ID、用户名、密码等信息。 2. 角色表&#xff08;role&#xff09;&#xff1a;记录系统中的所有角色&#xff0…

【项目管理体系】代码评审规范

1完整性检查 2一致性检查 3正确性检查 4可预测性检查 5健壮性检查 6结构性检查 7可追溯性检查 8可理解性检查 9可验证性检查 软件开发全套资料获取&#xff1a;&#xff08;本文末个人名片直接获取&#xff09; 软件产品&#xff0c;特别是行业解决方案软件产品不同于一般的商品…

汽车EDI: BMW EDI项目案例

宝马集团是全世界成功的汽车和摩托车制造商之一&#xff0c;旗下拥有BMW、MINI和Rolls-Royce三大品牌&#xff1b;同时提供汽车金融和高档出行服务。作为一家全球性公司&#xff0c;宝马集团在14个国家拥有31家生产和组装厂&#xff0c;销售网络遍及140多个国家和地区。 本文主…

在Linux Ubuntu系统中使用Pascal语言

Pascal是一种结构化编程语言&#xff0c;而Free Pascal作为其现代编译器&#xff0c;不仅支持跨多种操作系统和处理器架构&#xff0c;还提供了高效的内存使用和函数重载等先进功能。Free Pascal继承了Pascal语言的核心特性&#xff0c;同时进行了扩展和优化&#xff0c;使其成…

【算法】单调队列 - 基础与应用-滑动窗口最大值

题目 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 思路 暴力&#xff1a;遍历一遍的过程中每次从窗口找到最大的数组&#…

Springboot 项目启动时扫描所有枚举并存入缓存(redis)

为什么这么做? 为了springboot 注解属性转换字典方便一点(使用缓存的方式在Springboot 启动时获取字典数据) 在启动时会扫描com.vehicle.manager.core.enumerate包下的所有枚举(包括类中的内部枚举),并取出对应属性以json的方式存入redis 目录结构如下: RedisUtil可以在Red…

无线领夹麦克风怎么挑选,能让声音变好听的领夹麦推荐大全

近年来&#xff0c;随着直播销售和个人视频日志&#xff08;Vlog&#xff09;的流行&#xff0c;自媒体内容创作已经成为一种文化现象。这一现象不仅改变了人们获取信息的方式&#xff0c;也极大地推动了相关音频设备的发展。无线领夹麦克风&#xff0c;以其轻巧的设计和出色的…

GPT-5即将登场,AI赋能未来:我们该如何迎接这场技术变革?

文章目录 从高中生到博士生&#xff1a;GPT-4到GPT-5的飞跃科技界的惊叹与期待GPT-5的影响与应用场景1. 更强的自然语言处理能力2. 智能助理的升级3. 教育与培训4. 创意产业5. 数据分析与决策支持 如何迎接GPT-5的到来&#xff1f;1. 学习与适应2. 探索与创新3. 合作与共赢4. 关…

gin-vue -admin 初始化安装后 进入 后台首页报错

报错原因&#xff1a; 因为 我是使用的phpstudy 小皮的数据库 默认的是MySam 的引擎 mysql 引擎需要是 innoDB 解决办法 &#xff1a; 在linux 的环境下 配置一个数据库 &#xff0c; 我是用的是vmware 虚拟机

windows系统如何快速查看显卡详情信息

winR&#xff0c;输入dxdiag 打开DirectX诊断工具&#xff0c;可以看到显卡的详细硬件信息

帝国cms未审核文章可视化预览效果

有时候为了让编辑更加清楚的看到别人审核之后的效果&#xff0c;同时文章有需要下一级审核才能在前端展示出来&#xff0c;今天就来展示一个未审核文章预览审核后的效果 这次给某出版社开发的时候&#xff0c;他们需要实现编辑能够预览自己发布之后的审核效果&#xff0c;所以就…

深度學習筆記14-CIFAR10彩色圖片識別(Pytorch)

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習紀錄博客&#x1f356; 原作者&#xff1a;K同学啊 | 接輔導、項目定制 一、我的環境 電腦系統&#xff1a;Windows 10 顯卡&#xff1a;NVIDIA GeForce GTX 1060 6GB 語言環境&#xff1a;Python 3.7.0 開發…

一本顶三本?入门LLM大模型必读《大模型应用开发极简入门》附PDF书籍

今天带来的是最近刚出版的新书&#xff1a; 《大模型应用开发极简入门&#xff1a;基于 GPT-4 和ChatGPT》 。 这本书是 O’Reilly 出版的&#xff0c;两位共同作者是来自 Worldline 公司的机器学习研究员 Olivier Caelen 和 数据工程师 Marie-Alice Blete。这两位作者一位侧重…