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

链式队列

时间:2024-04-26 22:24:35浏览次数:24  
标签:结点 队列 Head next LinkQueu Phead 链式 NULL

以链表为基础实现链式队列


/********************************************************************************
 *
 *  file name:  Linked_Queues
 *  author   :  [email protected]
 *  date     :  2024/04/26
 *  function :  以链表为基础实现链式队列,一般把链表头部作为队头,可以实现头删,
 *              把链表尾部作为队尾,可以实现尾插。
 *
 *  note     :  None
 *  CopyRight  (c)  2023-2024   [email protected]    All  Right  Reseverd
 *   ****************************************************************************/

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

// 指的是顺序栈中的元素的数据类型,用户可以根据需要进行修改
typedef int DataType_t;

// 构造链表的结点,链表中所有结点的数据类型应该是相同的
typedef struct Linked_Queues
{
    struct Linked_Queues *next; // 创建一个指针域
    DataType_t data;            // 创建数据域
} LinkQueu_t;

/*******************************************************************************
 *  name     :  LinkQueu_Create
 *  function :  创建一个空链式对列,空链表应该有一个头结点,对链表进行初始化
 *  argument :  None
 *
 *
 *  retval   :  返回管理顺序栈的地址
 *  author   :  [email protected]
 *  date     :  2024/04/26
 *  note     :  None
 *   ***************************************************************************/
LinkQueu_t *LinkQueu_Create(void)
{
    // 创建一个头结点并对头结点申请堆内存
    LinkQueu_t *Head = (LinkQueu_t *)calloc(1, sizeof(LinkQueu_t));
    // 判断申请的堆内存是否成功如果失败直接结束程序
    if (NULL == Head)
    {
        perror("calloc memroy for Head is failed \n");
        exit(-1);
    }

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

    // 返回头结点的地址
    return Head;
}

/*******************************************************************************
 *  name     :  LinkQueu_NewNode
 *  function :  创建一个新的结点并对数据域与指针域进行初始化
 *  argument :
 *              @Data :传入的数据值
 *
 *  retval   :  返回管理顺序栈的地址
 *  author   :  [email protected]
 *  date     :  2024/04/26
 *  note     :  None
 *   ***************************************************************************/

LinkQueu_t *LinkQueu_NewNode(DataType_t Data)
{
    // 创建一个新结点并申请堆内存
    LinkQueu_t *New = (LinkQueu_t *)calloc(1, sizeof(LinkQueu_t));
    // 判断堆内存是否申请成功如果申请失败则直接退出程序
    if (NULL == New)
    {
        perror("calloc memroy for NewNode is failed \n");
        exit(-1);
    }

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

    // 返回新结点的地址
    return New;
}

/*******************************************************************************
 *  name     :  LinkQueu_Front
 *  function :  链式队列的入列
 *  argument :
 *              @Head :头结点的地址
 *              @Data :传入的数据值
 *  retval   :  true and false
 *  author   :  [email protected]
 *  date     :  2024/04/26
 *  note     :  None
 *   ***************************************************************************/

bool LinkQueu_Rear(LinkQueu_t *Head, DataType_t Data)
{

    LinkQueu_t *Phead = Head; // 定义一个指针记录头结点
    // 创建一个新的结点,
    LinkQueu_t *New = LinkQueu_NewNode(Data);
    if (NULL == New)
    {
        printf("can not insert new node\n");
        return false;
    }
    // 判断链式队列是否为空
    if (NULL == Head->next)
    {
        Head->next = New; // 如果为空则头结点的next指针指向新结点
        return true;
    }

    // 遍历到尾结点
    while (Phead->next)
    {
        Phead = Phead->next;
    }

    // 链式队列为非空
    Phead->next = New; // 尾结点的next指针指向新结点
    return true;
}

/*******************************************************************************
 *  name     :  LinkQueu_Rear
 *  function :  链式队列的出列
 *  argument :
 *              @Head :头结点的地址
 *
 *  retval   :  返回删除结点数据域的值
 *  author   :  [email protected]
 *  date     :  2024/04/26
 *  note     :  None
 *   ***************************************************************************/
DataType_t LinkQueu_Front(LinkQueu_t *Head)
{

    LinkQueu_t *Phead = Head->next; // 定义一个指针记录首结点
    DataType_t temp;                // 备份首结点数据域的值
    // 判断链式队列是否为空
    if (Head->next == NULL)
    {
        printf("Linked Queues is empty \n");
        return 0;
    }
    else
    {
        // 链式队列不为空
        if (Phead->next)
        {
            Head->next = Phead->next; // 头结点的next指针指向首结点的直接后继
            Phead->next = NULL;       //// 首结点的next指针指向NULL
            temp = Phead->data; 
            free(Phead);        // 释放首结点的内存
        }
        else
        {
            Head->next = NULL;
            free(Phead);
        }
    }
    // 返回删除结点的值
    return temp;
}

/*******************************************************************************
 *  name     :  LinkQueu_Rear
 *  function :  遍历结点,并输出结点的数据域的值
 *  argument :
 *              @Head :头结点的地址
 *
 *  retval   :  None
 *  author   :  [email protected]
 *  date     :  2024/04/26
 *  note     :  None
 *   ***************************************************************************/
void LinkQueu_Print(LinkQueu_t *Head)
{
    LinkQueu_t *Phead = Head; // 备份头结点
    while (Phead->next)
    {
        Phead = Phead->next;
        printf("%d\n", Phead->data);
    }
}

int main(void)
{
    LinkQueu_t *Head = LinkQueu_Create();
    LinkQueu_Rear(Head, 1);

    LinkQueu_Rear(Head, 2);
    LinkQueu_Rear(Head, 3);
    LinkQueu_Print(Head);

    LinkQueu_Front(Head);
    LinkQueu_Front(Head);
    LinkQueu_Front(Head);
    LinkQueu_Front(Head);

    LinkQueu_Rear(Head, 3);
    LinkQueu_Print(Head);

    return 0;
}

标签:结点,队列,Head,next,LinkQueu,Phead,链式,NULL
From: https://www.cnblogs.com/Yxwwant/p/18160978

相关文章

  • 习题---利用两个栈实现队列的“入队”和“出队”
    利用两个栈进行实现队列的入队和出队操作题目:解题分析:​ 该题目需要借助两个栈来实现队列的“入队”和“出队”,并封装好了三个对应的函数。我们需要注意的是栈的特点是“先进后出",与队列的”先进先出“的输出并不一致。所以,我们要利用栈来输出正常排序的序列,需要借助类似取反......
  • 队列
    数据结构队列使用链表实现队列/***************************************************************************************filename:1.c*author: [email protected]*date:2024/04/26*function: 队*note :none*CopyRight......
  • 以链表为基础实现链式队列
    以链表为基础实现链式队列如果打算以链表作为基础来实现队列的操作,可以避免内存浪费以及避免内存成片移动,只需要确定队头和队尾即可,一般把链表头部作为队头,可以实现头删,把链表尾部作为队尾,可以实现尾插。#include<stdio.h>#include<stdbool.h>#include<stdlib.h>//对输入......
  • 数据结构——链式栈
    二、链式栈构造链式栈//链式栈的有效数据类型,用户可以根据需要进行修改typedefintDataType_t;//构造单链式栈的结点typedefstructLinkedStack{DataType_tdata;//结点的数据域structLinkedStack*next;//结点的的指针域}LinStack_t......
  • 自定义单链表队列的基本接口函数(非循环队列)
    单链表构建队列的接口函数/********************************************************************文件名称: 单链表构建队列的接口函数文件作者:[email protected]创建日期:2024/04/26文件功能:对单链表循环队列的增删改查功能的定义注意事项:NoneCop......
  • 队列_单向链表
    利用单向链表设计一个队列,实现“先进先出”的功能​ 队列的两端都允许操作,只不过要求数据只能从队列的一端插入,从队列的另一端删除,可以把队列理解为一根水管,水管有进水口和出水口。​ 一般把允许数据插入的一端称为队尾(Tail或者Rear),一般把允许删除数据的一端称为队头队首(Head或......
  • 利用两个栈实现队列的入队出队以及判断队列是否为空
    boolenQueue(SeqStack_t*S1,SeqStack_t*S2,intx){DataType_ttemp=x;//判断S1是否满if(SeqStack_IsFull(S1)){//判断S2是空if(SeqStack_IsEmpty(S2))![image](uploading...){while(!SeqStack_IsEmpty......
  • 链式队列
    队列原理介绍:​ 队列(Queue)和栈类似,相同点是都属于线性结构,不同点是栈遵循“后进先出”原则,而队列遵循“*先进先出*”的原则,也被称为“FIFO”结构,就是“FirstInputFirstOutput”​ 数据结构中的队列的两端都允许操作,只不过要求数据只能从队列的一端插入,从队列的另一端删除,可......
  • 单向链式队列
    目录目录单向链式队列创建空链表创建新结点入队判断链表是否为空出队遍历代码验证单向链式队列/**@filename: main.c@brief单向链式队列@[email protected]@date2024/04/[email protected]:版本@property:属性介绍@note补充注意说明CopyRight(c)2023......
  • 以链表为基础实现链式队列
    数据结构链式队列以链表为基础实现链式队列1.思路:如果打算以链表作为基础来实现队列的操作,可以避免内存浪费以及避免内存成片移动,只需要确定队头和队尾即可,一般把链表头部作为队头,可以实现头删,把链表尾部作为队尾,可以实现尾插。2.图示:3.代码:/****************************......