首页 > 其他分享 >单向链式队列

单向链式队列

时间:2024-04-26 20:44:06浏览次数:19  
标签:Head 队列 单向 LinkQueue 结点 next Phead 链式 NULL

目录

目录

单向链式队列

/**

  • @file name: main.c
  • @brief 单向链式队列
  • @author [email protected]
  • @date 2024/04/23
  • @version 1.0 :版本
  • @property :属性介绍
  • @note 补充 注意 说明
  • CopyRight (c) 2023-2024 [email protected] All Right Reseverd
    */
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

// 指的是循环队列中的元素的数据类型,用户可以根据需要进行修改
typedef int DataType_t;

// 构造记录循环队列CircularQueue各项参数(循环队列的首地址 + 循环队列的容量 + 循环队列队尾下标+队首下标)的结构体
typedef struct LinkQueue
{
    DataType_t data;        // 结点的数据域
    struct LinkQueue *next; // 结点的指针域
    struct LinkQueue *Rear;
    struct LinkQueue *Front;

} LinkQueue_t;

创建空链表

// 创建一个空链表,空链表应该有一个头结点,对链表进行初始化
/**
 * @function name:	LList_Create
 * @brief  创建一个空链表,空链表应该有一个头结点,对链表进行初始化
 * @param  介绍函数参数 void
 * @retval void
 * @date 2024/04/26
 * @version 1.0 :版本
 * @note   补充 注意 说明
 */
LinkQueue_t *LList_Create(void)
{
    // 1.创建一个头结点并对头结点申请内存
    LinkQueue_t *Head = (LinkQueue_t *)calloc(1, sizeof(LinkQueue_t));
    if (NULL == Head)
    {
        perror("Calloc memory for Head is Failed");
        exit(-1);
    }

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

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

创建新结点

// 创建新的结点,并对新结点进行初始化(数据域 + 指针域)
/**
 * @function name:	LList_Create
 * @brief  创建新的结点,并对新结点进行初始化
 * @param  介绍函数参数 @data:新结点数据
 * @retval 新结点地址
 * @date 2024/04/26
 * @version 1.0 :版本
 * @note   补充 注意 说明
 */
LinkQueue_t *LList_NewNode(DataType_t data)
{
    // 1.创建一个新结点并对新结点申请内存
    LinkQueue_t *New = (LinkQueue_t *)calloc(1, sizeof(LinkQueue_t));
    if (NULL == New)
    {
        perror("Calloc memory for NewNode is Failed");
        return NULL;
    }

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

    return New;
}

入队

// 入队

/**
 * @function name:	LList_Create
 * @brief  入队
 * @param  介绍函数参数 @Head:头结点地址  @data:新结点数据
 * @retval bool
 * @date 2024/04/26
 * @version 1.0 :版本
 * @note   补充 注意 说明
 */
bool LinkQueue_Enqueue(LinkQueue_t *Head, DataType_t data)
{
    LinkQueue_t *New = LList_NewNode(data);
    LinkQueue_t *Phead = Head;
    // 判断新节点是否创建成功
    if (NULL == New)
    {
        printf("can not insert new node\n");
        return false;
    }
    // 判段链表是否为空,为空则可以直接插入
    if (Head->next == NULL)
    {
        Head->next = New;
        Head->Front = New;
        Head->Rear = New;
        return true;
    }
    // 遍历找到尾结点
    while (Phead->next)
    {
        Phead = Phead->next;
    }
    // 进行入队操作
    Head->Front = Head->next;
    Phead->next = New;
    Head->Rear = New;
    return true;
}

判断链表是否为空

/**
 * @function name:	LList_Create
 * @brief  判断循环队列是否为空
 * @param  介绍函数参数 @Head:头结点地址
 * @retval bool
 * @date 2024/04/26
 * @version 1.0 :版本
 * @note   补充 注意 说明
 */
// 判断循环队列是否为空
bool LinkQueue_IsEmpty(LinkQueue_t *Head)
{
    return (Head->next == NULL) ? true : false;
}

出队

// 出队
/**
 * @function name:	LList_Create
 * @brief  出队
 * @param  介绍函数参数 @Head:头结点地址
 * @retval 出队数据
 * @date 2024/04/26
 * @version 1.0 :版本
 * @note   补充 注意 说明
 */
// 判断循环队列是否为空
DataType_t LinkQueue_Dequeue(LinkQueue_t *Head)
{
    DataType_t temp = 0;
    LinkQueue_t *Phead = Head->next;
    // 1.判断循环队列是否为空
    if (LinkQueue_IsEmpty(Head))
    {
        return -1;
    }
    // 判断链表是否只有一个结点
    else if (Head->next->next == NULL)
    {
        temp = Phead->data;
        Head->next = NULL;
        Phead->next = NULL;
        free(Phead);
        return temp;
    }
    temp = Phead->data;
    Head->next = Head->next->next;
    Head->Front = Head->next->next;
    Phead->next = NULL;
    free(Phead);
    return temp;
}

遍历

/**
 * @function name:	LList_Create
 * @brief  遍历
 * @param  介绍函数参数 @Head:头结点地址
 * @retval 出队数据
 * @date 2024/04/26
 * @version 1.0 :版本
 * @note   补充 注意 说明
 */
// 判断循环队列是否为空
void LinkQueue(LinkQueue_t *Head)
{
    // 对链表的头文件的地址进行备份
    LinkQueue_t *Phead = Head;

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

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

代码验证

int main(int argc, char const *argv[])
{
    struct LinkQueue *Manager = LList_Create();

    LinkQueue_Enqueue(Manager, 1);
    LinkQueue_Dequeue(Manager);
    LinkQueue_Enqueue(Manager, 2);
    LinkQueue_Enqueue(Manager, 3);
    LinkQueue_Enqueue(Manager, 4);
    LinkQueue_Dequeue(Manager);
    LinkQueue(Manager);
    return 0;
}

标签:Head,队列,单向,LinkQueue,结点,next,Phead,链式,NULL
From: https://www.cnblogs.com/zeratul/p/18160847

相关文章

  • 以链表为基础实现链式队列
    数据结构链式队列以链表为基础实现链式队列1.思路:如果打算以链表作为基础来实现队列的操作,可以避免内存浪费以及避免内存成片移动,只需要确定队头和队尾即可,一般把链表头部作为队头,可以实现头删,把链表尾部作为队尾,可以实现尾插。2.图示:3.代码:/****************************......
  • 单链表队列
    单链表队列队列:遵循先进先出1.创建初始化队列/******************************************************************************函数名称:LinQue_Create*函数功能:创建头结点*函数参数:NONE*......
  • 链式栈接口程序
    链式栈接口程序目录链式栈接口程序以链表作为基础实现栈空间(链式栈)头文件链式栈的创建创建一个空的链式栈节点入栈出栈验证输出结果以链表作为基础实现栈空间(链式栈)图解头文件/********************************************************************* filename: 链式......
  • 数据结构—单链表队列头删尾插
    单链表队列的头删尾插/*************************************************/***@filename: 单链表队列的头删尾插.md*@brief实现对单链表队列的头删尾插*@[email protected]*@date2024/04/26*@version1.0:在下坂本,有何贵干*@property:no......
  • 循环队列
    /***********************************************************************************************************该程序实现循环队列元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以循环队列中元素*的数据类型为DataType_t,用户可以根据实际情况修改......
  • 两个栈模拟一个队列(Stacks Imitate Queue)
    /****************************************************************************@filename: :StacksSimulateQueue*@brief :两个栈实现队列的功能*@author :[email protected]*@date :2024/04/26*@version1.0 :V1.0*@property :None*@not......
  • C语言数据结构:链式队列的创建及其出入队操作
    /**********************************************************************************************************该程序实现链式队列元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以链式队列中元素*的数据类型为DataType_t,用户可以根据实际情况修改......
  • 顺序循环队列的接口设计
    /***********************************************************************************************************该程序实现循环队列元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以循环队列中元素*的数据类型为DataType_t,用户可以根据实际情况......
  • 双向循环链表队列的接口设计
    /***********************************************************************************************************该程序实现循环队列元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以循环队列中元素*的数据类型为DataType_t,用户可以根据实际情况......
  • 环形队列
    【简介】ringbuffer/circularbuffer又名环形队列/环形缓冲区,其通过开辟固定尺寸的内存来实现反复复用同一块内存的目的。由于预先开辟了固定尺寸的内容,所以当数据满的时候,可以有两种处理方式,具体使用哪一种按照实际需求,具体如下:1)当队列满的时候,新来的数据会覆盖最古老的......