C语言数据结构之队列的定义与实现

 更新时间:2022年07月04日 09:23:15   作者:MT_125  
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(head)进行删除操作,而在表的后端(tail)进行插入操作。本文将详细讲讲C语言中队列的定义与实现,感兴趣的可以了解一下

一、队列的性质

上次我们学习栈,了解到栈储存释放数据的方式是:先进后出

而队列与其相反,队列是:先进先出,后进后出。

二、队列的结构

多个链表节点 + 头尾指针   (链表式队列)

链表节点负责存储数据;头节点 负责定位先进的起始数据,方便先出;

尾节点负责记录尾部数据,方便确定队列当前状态。

三、代码实现

头文件

这里方便统一调用,将头尾指针定义成一个结构体 。 

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
 
typedef int Quetype;          //定义队列的数据类型
 
typedef struct QueNode        //定义数据节点
{
    struct QueNode* Next;
    Quetype data;
}QueNode;
 
typedef struct Quetail        
{                         
    struct QueNode* head;     //定义头尾指针
    struct QueNode* tail;
}Quetail;
 
void Que_Init(Quetail* pq);                //队列的初始化
void Que_Destory(Quetail* pq);             //队列的销毁
void Que_push(Quetail* pq ,Quetype data);  //插入数据
void Que_pop(Quetail* pq);                 //删除数据
bool Que_Empty(Quetail* pq);               //判断队列是否为空
int Que_size(Quetail* pq);                 //统计队列长度
int Que_front(Quetail* pq);                //查找队列的头部数据

功能函数

1.队列的初始化:

将头尾指针置为NULL 方便后续使用。

void Que_Init(Quetail* pq)           //队列的初始化
{
    assert(pq);
    pq->head = pq->tail = NULL;
}

2.插入数据:

创建链表节点 >> 导入数据 >> 头部指针指向头节点 >> 尾部指针指向尾节点 

//插入数据
void Que_push(Quetail* pq,Quetype data)
{ 
    assert(pq);
    QueNode* NewNode = (QueNode*)malloc(sizeof(QueNode));//创建节点
    if (NewNode == NULL)
    {
        printf("Que_push->malloc");
        exit(-1);
    }
    NewNode->Next = NULL;          
    NewNode->data = data;
    if (pq->head == NULL)         //判断是否创建为头节点
    {
        pq->head = NewNode;       //更新头指针
    }
    else
    {
        pq->tail->Next = NewNode; //不为头节点,就正常链接在尾节点后
    }
    pq->tail = NewNode;           //更新尾指针
}

3.删除数据:

记录头节点的下一个位置 >> 判断是否为最后的数据 >> 更新头指针

细节点:如果队列中还剩多个节点时,删除头节点后,尾指针始终指向尾节点,不需要改动;

但是如果只剩一个数据节点的话,删除后需要将尾指针置空。

//删除数据
void Que_pop(Quetail* pq)
{
    assert(pq);                       
    assert(!Que_Empty(pq));         //判断队列是否为空
    QueNode* Next = pq->head->Next; //记录删除数据的
 
    if (pq->head == pq->tail)       //判断是否是最后的数据
    {
        free(pq->head);
        pq->tail = NULL;            //更新尾指针
    }
    else
    {
        free(pq->head);             
    }
    pq->head = Next;                //更新头指针
}

4.判断列表是否为空:

用bool 作为返回类型

//判断队列是否为空
bool Que_Empty(Quetail* pq)
{
    assert(pq);
    return pq->head == NULL;
}

5.查找队列的头部数据:

判断队列是否为空 >> 返回头部数据

//查找队列的头部数据
Quetype Que_front(Quetail* pq)
{
    assert(pq);
    assert(!Que_Empty(pq));    //判断队列是否为空
    return pq->head->data;     //返回头部数据
}

6. 统计队列的长度:

就是统计有多少个链表节点

int Que_size(Quetail* pq)
{
    assert(pq);
    int size;
    QueNode* pphead = pq->head;
    for (size = 0; pphead; pphead = pphead->Next, size++);
    return size;
}

7.队列的销毁:

依次删除数据 >> 将申请空间释放

细节点:这里可以进行复用:判断队列是否为空 、 删除数据

void Que_Destory(Quetail* pq)
{
    for (; !Que_Empty(pq); )  //判断队列是否为空
    {
        Que_pop(pq);          //删除数据
    }
}

以上就是C语言数据结构之队列的定义与实现的详细内容,更多关于C语言 队列的资料请关注脚本之家其它相关文章!

相关文章

  • 堆基本操作实现最大堆

    堆基本操作实现最大堆

    这篇文章主要介绍了堆基本操作实现最大堆,需要的朋友可以参考下
    2014-02-02
  • 深入了解C语言字符函数和字符串函数

    深入了解C语言字符函数和字符串函数

    这篇文章主要给大家介绍了关于C语言字符/字符串的相关函数,文中通过示例代码总结的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2021-07-07
  • Easyx实现窗口自动碰撞的小球

    Easyx实现窗口自动碰撞的小球

    这篇文章主要为大家详细介绍了Easyx实现窗口自动碰撞的小球,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C语言实现简单的扫雷小游戏

    C语言实现简单的扫雷小游戏

    这篇文章主要为大家详细介绍了C语言实现简单的扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • C++ 的三种访问权限与三种继承方式

    C++ 的三种访问权限与三种继承方式

    我们知道C++中的类,有三种访问权限(也称作访问控制),它们分别是public、protected、private,C++中继承的方式还有多种。下面通过本文给大家详细介绍,对c++中的访问权限和继承方式感兴趣的朋友一起看看吧
    2016-11-11
  • C语言 sizeof 函数详情

    C语言 sizeof 函数详情

    这篇文章主要介绍了C语言 sizeof 函数,在 C 语言中,char 字符串也是一种非常重要的数据类型,我们除了使用 sizeof 函数获取字符串长度之外,使用 sizeof 函数同样也可以完成字符串长度的获取,下面文章内容具体描述该内容,需要的朋友可以参考以下
    2021-10-10
  • C语言中指针 int *p=0;和int *p;*p=0;和”&“的关系和区别详解

    C语言中指针 int *p=0;和int *p;*p=0;和”&“的关系和区别详解

    这篇文章主要介绍了C语言中指针 int *p=0;和int *p;*p=0;和”&“有什么关系和区别,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • C++实现线性表链式存储(单链)

    C++实现线性表链式存储(单链)

    这篇文章主要为大家详细介绍了C++实现线性表链式存储,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C语言中sizeof 和 strlen的区别

    C语言中sizeof 和 strlen的区别

    sizeof 和 strlen 是两个常用于 C/C++ 语言中的函数或操作符,本文主要介绍了C语言中sizeof 和 strlen的区别,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • C语言实现的一个三子棋游戏详解流程

    C语言实现的一个三子棋游戏详解流程

    三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了
    2021-10-10

最新评论