链式队列算法库构建

news2024/10/6 2:23:15

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

数据结构之自建算法库——链队(链式队列)_数据结构函数链队列的算法框架有哪些-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.coloradmin.cn/o/1866638.html

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

相关文章

【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解(包含数据安全处理方案的加密解密)

前言 如何在 Unity 中正确制作一个保存和加载系统&#xff0c;该系统使用JSON 文件来处理保存配置文件&#xff0c;可以保存和加载任何类型对象&#xff01;标题为什么叫小型游戏存储功能呢&#xff1f;因为该存储功能可能只适合存储数据比较单一的情况&#xff0c;它非常的方…

Leetcode 102.目标和

给定一个正整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 ‘’ &#xff0c;在 1 之前添加 ‘-’ &…

AIGC笔记--U-ViT的简单代码实现

1--前言 原论文&#xff1a;All are Worth Words: A ViT Backbone for Diffusion Models 完整可debug的代码&#xff1a;Simple_U-ViT 2--结构 3--简单代码 以视频作为输入&#xff0c;实现上图红色框的计算&#xff1a; import torch import torch.nn as nn from einops im…

6.2 通过构建情感分类器训练词向量

在上一节中&#xff0c;我们简要地了解了词向量&#xff0c;但并没有去实现它。在本节中&#xff0c;我们将下载一个名为IMDB的数据集(其中包含了评论)&#xff0c;然后构建一个用于计算评论的情感是正面、负面还是未知的情感分类器。在构建过程中&#xff0c;还将为 IMDB 数据…

分享一个 MySQL 简单快速进行自动备份和还原的脚本和方法

前言 数据备份和还原在信息技术领域中具有非常重要的作用&#xff0c;不论是人为误操作、硬件故障、病毒感染、自然灾害还是其他原因&#xff0c;数据丢失的风险都是存在的。如果没有备份&#xff0c;一旦数据丢失&#xff0c;可能对个人、企业甚至整个组织造成巨大的损失。 …

2-17 基于matlab的改进的遗传算法(IGA)对城市交通信号优化分析

基于matlab的改进的遗传算法&#xff08;IGA&#xff09;对城市交通信号优化分析。根据交通流量以及饱和流量&#xff0c;对城市道路交叉口交通信号灯实施合理优化控制&#xff0c;考虑到交通状况的动态变化&#xff0c;及每个交叉口的唯一性。通过实时监测交通流量&#xff0c…

部署企业级AI知识库最重要的是什么?✍

随着人工智能技术的迅猛发展&#xff0c;企业级AI知识库成为提升企业管理效率和信息获取能力的重要工具。那么&#xff0c;在部署企业级AI知识库时&#xff0c;最重要的是什么呢&#xff1f;本文将从数据质量、系统可扩展性、用户体验以及智能化这四个关键方面进行详细分析。 …

单片机是否有损坏,怎沫判断

目录 1、操作步骤&#xff1a; 2、单片机损坏常见原因&#xff1a; 3、 单片机不工作的原因&#xff1a; 参考&#xff1a;细讲寄存器读写与Bit位操作原理--单片机C语言编程Bit位的与或非屏蔽运算--洋桃电子大百科P019_哔哩哔哩_bilibili 1、操作步骤&#xff1a; 首先需要…

Objects and Classes (对象和类)

Objects and Classes [对象和类] 1. Procedural and Object-Oriented Programming (过程性编程和面向对象编程)2. Abstraction and Classes (抽象和类)2.1. Classes in C (C 中的类)2.2. Implementing Class Member Functions (实现类成员函数)2.3. Using Classes References O…

第 28 篇 : SSH秘钥登录

1 生成秘钥 ssh-keygen -t rsa ls -a ./.ssh/一直回车就行了 2. 修改配置 vi /etc/ssh/sshd_config放开注释 公钥的位置修改 关闭密码登录 PubkeyAuthentication yes AuthorizedKeysFile .ssh/id_rsa.pub PasswordAuthentication no3. 下载id_rsa私钥, 自行解决 注意…

Vue中数组的【响应式】操作

在 Vue.js 中&#xff0c;当你修改数组时&#xff0c;Vue 不能检测到以下变动的数组&#xff1a; 当你利用索引直接设置一个项时&#xff0c;例如&#xff1a;vm.items[indexOfItem] newValue当你修改数组的长度时&#xff0c;例如&#xff1a;vm.items.length newLength 为…

常见图像分割模型介绍:FCN、U-Net、SegNet、Mask R-CNN

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

AI助力校园安全:EasyCVR视频智能技术在校园欺凌中的应用

一、背景分析 近年来&#xff0c;各地深入开展中小学生欺凌行为治理工作&#xff0c;但有的地方学生欺凌事件仍时有发生&#xff0c;严重损害学生身心健康&#xff0c;引发社会广泛关注。为此&#xff0c;教育部制定了《防范中小学生欺凌专项治理行动工作方案》进一步防范和遏…

软件构造 | 期末查缺补漏

软件构造 | 期末查缺补漏 总体观 软件构造的三维度八度图是由软件工程师Steve McConnell提出的概念&#xff0c;用于描述软件构建过程中的三个关键维度和八个要素。这些维度和要素可以帮助软件开发团队全面考虑软件构建的方方面面&#xff0c;从而提高软件质量和开发效率。 下…

文件批量重命名001到100 最简单的数字序号递增的改名技巧

文件批量重命名001到100 最简单的数字序号递增的改名方法。最近看到很多人都在找怎么批量修改文件名称&#xff0c;还要按固定的ID需要递增&#xff0c;这个办法用F2或者右键改名是不能做到的。 这时候我们可以通过一个专业的文件批量重命名软件来批量处理这些文档。 芝麻文件…

A-8 项目开源 qt1.0

A-8 2024/6/26 项目开源 由于大家有相关的需求&#xff0c;就创建一个项目来放置相关的代码和项目 欢迎交流&#xff0c;QQ&#xff1a;963385291 介绍 利用opencascade和vulkanscene实现stp模型的查看器打算公布好几个版本的代码放在不同的分支下&#xff0c;用qt实现&am…

如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区

如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区 1. 问题背景 有时我们需要获取特定 HIVE 库下所有分区表&#xff0c;或者所有分区表的所有分区&#xff0c;以便执行进一步的操作&#xff0c;比如通过 使用 HIVE 命令 MSCK REPAIR TABLE table_name sync partiti…

Redis实战—基于setnx的分布式锁与Redisson

本博客为个人学习笔记&#xff0c;学习网站与详细见&#xff1a;黑马程序员Redis入门到实战 P56 - P63 目录 分布式锁介绍 基于SETNX的分布式锁 SETNX锁代码实现 修改业务代码 SETNX锁误删问题 SETNX锁原子性问题 Lua脚本 编写脚本 代码优化 总结 Redisson 前言…

基于盲信号处理的人声分离

1.问题描述 在实际生活中&#xff0c;存在一种基本现象称为“鸡尾酒效应”&#xff0c;该效应指即使在非常嘈杂的环境中&#xff0c;人依然可以从噪声中提取出自己所感兴趣的声音。 在实际应用中&#xff0c;我们可能需要对混合的声音进行分离&#xff0c;此时已知的只有混合…