C语言数据结构:链式队列的创建及其出入队操作

这篇具有很好参考价值的文章主要介绍了C语言数据结构:链式队列的创建及其出入队操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

/********************************************************************************************************
 *
 *该程序实现链式队列元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以链式队列中元素
 *的数据类型为DataType_t,用户可以根据实际情况修改链式队列中元素的类型。
 *
 *另外,为了方便管理链式队列,所以用户设计LQueue_t结构体,该结构体中包含两个成员:结点的数据域+结点的指针域
 *
 *以链表作为基础来实现队列的操作,可以避免内存浪费以及避免内存成片移动,只需要确定队头和队尾即可,一般把链表头部作为队头,可以实现头删,把链表尾部作为队尾,可以实现尾插。
 *
 * Copyright (c)  2023-2024   a1583839363@163.com   All right Reserved
 * ******************************************************************************************************/

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

// 指的是链式队列中的结点有效数据类型,用户可以根据需要进行修改
typedef int DataType_t;

// 构造链式队列的结点,其中所有结点的数据类型应该是相同的
typedef struct LinkedQueue
{
    DataType_t data;          // 结点的数据域
    struct LinkedQueue *next; // 结点的指针域

} LQueue_t;

// 创建一个空链式队列,空链式队列应该有一个头结点,对链表进行初始化
LQueue_t *LQueue_Create(void)
{
    // 1.创建一个头结点并对头结点申请内存
    LQueue_t *Head = (LQueue_t *)calloc(1, sizeof(LQueue_t));
    if (NULL == Head)
    {
        perror("Calloc memory for Head is Failed");
        exit(-1);
    }

    // 2.对头结点进行初始化,头结点是不存储有效内容的!!!
    Head->next = NULL;

    // 3.把头结点的地址返回即可
    return Head;
}

// 创建新的结点,并对新结点进行初始化(数据域 + 指针域)
LQueue_t *LQueue_NewNode(DataType_t data)
{
    // 1.创建一个新结点并对新结点申请内存
    LQueue_t *New = (LQueue_t *)calloc(1, sizeof(LQueue_t));
    if (NULL == New)
    {
        perror("Calloc memory for NewNode is Failed");
        return NULL;
    }

    // 2.对新结点的数据域和指针域进行初始化
    New->data = data;
    New->next = NULL;

    return New;
}

// 入队
bool LQueue_Enqueue(LQueue_t *Head, DataType_t data)
{
    // 1.创建新的结点,并对新结点进行初始化
    LQueue_t *New = LQueue_NewNode(data);
    if (NULL == New)
    {
        printf("can not insert new node\n");
        return false;
    }

    // 2.判断链式队列是否为空,如果为空,则直接入队即可
    if (NULL == Head->next)
    {
        Head->next = New;
        return true;
    }

    // 3.如果链式队列为非空,则把新结点入队到链式队列的队尾
    LQueue_t *Last = Head;
    while (Last->next != NULL)
    {
        Last = Last->next;
    }
    Last->next = New;

    return true;
}

// 出队
bool LQueue_Dequeue(LQueue_t *Head)
{
    // 1.对链式队列的首结点的地址进行备份
    LQueue_t *Temp = Head->next;
    // 2.判断链式队列是否为空,如果为空,则直接退出
    if (NULL == Head->next)
    {
        return false;
    }
    // 3.链式队列非空,则直接出队
    Head->next = Temp->next;
    Temp->next = NULL;
    free(Temp);

    return true;
}

// 遍历
void LQueue_Print(LQueue_t *Head)
{
    // 对链式队列的头结点的地址进行备份
    LQueue_t *Phead = Head;

    // 首结点
    while (Phead->next)
    {
        // 把头的直接后继作为新的头结点
        Phead = Phead->next;

        // 输出头结点的直接后继的数据域
        printf("data = %d\n", Phead->data);
    }
}

int main(int argc, char const *argv[])
{
    LQueue_t *Head = LQueue_Create();
    LQueue_Enqueue(Head, 1);
    LQueue_Enqueue(Head, 2);
    LQueue_Enqueue(Head, 3);
    LQueue_Dequeue(Head);
    LQueue_Print(Head);

    return 0;
}

文章来源地址https://www.toymoban.com/news/detail-859160.html

到了这里,关于C语言数据结构:链式队列的创建及其出入队操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【脚踢数据结构】队列(顺序和链式)

    (꒪ꇴ꒪ ),Hello我是 祐言QAQ 我的博客主页:C/C++语言,Linux基础,ARM开发板,软件配置等领域博主🌍 快上🚘,一起学习,让我们成为一个强大的攻城狮! 送给自己和读者的一句鸡汤🤔: 集中起来的意志可以击穿顽石! 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏

    2024年02月12日
    浏览(38)
  • 【数据结构】二叉树链式结构的实现及其常见操作

    目录 1.手搓二叉树 2.二叉树的遍历 2.1前序、中序以及后序遍历 2.2二叉树的层序遍历 3.二叉树的常见操作 3.1求二叉树节点数量 3.2求二叉树叶子节点数量 3.3求二叉树第k层节点个数 3.3求二叉树的深度 3.4二叉树查找值为x的节点 4.二叉树的销毁 在学习二叉树的基本操作前,需先要

    2024年02月12日
    浏览(46)
  • 模拟实现链式二叉树及其结构学习——【数据结构】

    W...Y的主页 😊 代码仓库分享 💕 之前我们实现了用顺序表完成二叉树(也就是堆),顺序二叉树的实际作用就是解决堆排序以及Topk问题。 今天我们要学习的内容是链式二叉树,并且实现链式二叉树,这篇博客与递归息息相关! 目录 链式存储 二叉树链式结构的实现 链式二叉

    2024年02月07日
    浏览(41)
  • 探索数据结构:链式队与循环队列的模拟、实现与应用

    队列(queue)是一种只允许在一端进行插入操作,而在另一端进行删除操作的线性表。其严格遵循 先进先出(First In First Out) 的规则,简称 FIFO 。 队头(Front) :允许删除的一端,又称队首。 队尾(Rear) :允许插入的一端。 队列与栈类似,实现方式有两种。一种是以 数组

    2024年04月08日
    浏览(83)
  • C/C++语言 数据结构 创建邻接表存储的无向图及其邻接表的输出

    目录 1.邻接表相关知识补充  2. 图的邻接存储表示 3.测试输入与输出样例 4.代码实现 4.1 创建无向图邻接表 4.2 输入无向图的邻接表 定义: 对于图中每个顶点 vi,把所有邻接于 vi的顶点(对有向图是将从vi出发的弧的弧头顶点链接在一起)链接成一个带头结点的单链表,将所

    2024年02月05日
    浏览(47)
  • 数据结构——二叉树的创建与遍历(链式存储结构)

    二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。以下是对链式存

    2024年02月05日
    浏览(51)
  • 【数据结构】队列及其实现

    目录 😎前言 认识队列 队列的初始化 队列判空 数据队尾入队 数据队头出队 取队头数据 取队尾数据 队列数据的个数 队列销毁 总结 上次我们学习了栈及其实现,当然也少不它的好兄弟队列啦,今天我们开始队列的学习 队列的性质是 先进先出 ,就比如车辆进出隧道一般,它

    2024年02月09日
    浏览(44)
  • 数据结构入门(C语言版)二叉树链式结构的实现

    简单回顾一下二叉树的 概念: ★ 空树 ★非空:根节点,根节点的左子树、根节点的右子树组成的。 从概念中可以看出,二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的。 下面我们先看二叉树的结构体定义以及创建 首先结构体的定义是元素本身,以

    2023年04月23日
    浏览(47)
  • 数据结构例题代码及其讲解-栈与队列

    栈Stack 后进先出 ​ 栈的结构体定义及基本操作。 初始化 ​ 这里初始化时是将栈顶指针指向-1,有些则是指向0,因此后续入栈出栈的代码略微有点区别 判断栈是否为空 压栈操作 由于初始时栈顶指针指向-1,因此需要先变化栈顶指针,然后入栈操作; 且当MaxSize为50时候,数

    2024年02月10日
    浏览(42)
  • 【C语言】数据结构——链式二叉树实例探究

    💗个人主页💗 ⭐个人专栏——数据结构学习⭐ 💫点击关注🤩一起学习C语言💯💫 我们在前面学习了单链表,顺序表,栈和队列,小堆。 今天我们来学习链式二叉树 关注博主或是订阅专栏,掌握第一消息。 链式二叉树(Linked Binary Tree)是一种基于链表实现的二叉树结构。

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包