【C语言数据结构】06.队列

本文介绍了如何使用C语言中的单链表来实现队列数据结构。包括队列的基本概念、初始化队列、入队和出队操作的具体实现。

前言

  • 本节主要进行C语言数据结构队列的学习。
    在这里插入图片描述

“Stay hungry,Stay foolish.” (求知若饥,虚心若愚。) ——史蒂夫·乔布斯



1.队列的介绍

  • 队列是一种先进先出(First In First Out)的线性表,简称FIFO。
  • FIFO,这同FPGA里数据缓冲器FIFOip的使用原理与功能类似,不过那是以“硬核”的形式存在的,其本质是一种存储设备,而在数据结构里是程序在内存中开辟区域,是内存里的空间。
  • 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
  • 允许插入的一端称为队尾,允许删除的一端称为队头。
    在这里插入图片描述
  • 队头(Front):允许删除的一端,又称队首。
  • 队尾(Rear):允许插入的一端。
  • 空队列:不包含任何元素的空表。

FIFO与buffer的区别:

  • 1.FIFO可以说一块具体的硬件存储设备,也可以说程序在内存中开辟的一段内存区域。而buffer往往就是一段缓冲的数据区域
  • 2.FIFO的数据是先进先出的,而buffer没有这个限制,可以全局访问
  • 3.buffer往往就是一段累积的存储空间,而fifo有时候还可以帮助系统解决时钟域不同步或者数据宽度不一样的情况
  • 链表实现队列过程:
    在这里插入图片描述

2.单链表实现队列

  • 实现内容与前章相同,1.初始化队列;2.入队;3.出队。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef struct Node//定义数据结构,包含数据域域next域
{
    int data;//data域
    struct Node* next;//next指针域
}Node;

Node* initList()//初始化头节点
{
    Node* Queue=(Node*)malloc(sizeof(Node));//开辟空间,新建节点
    Queue->data=0;//队列默认个数为0
    Queue->next=NULL;//队列为空,故头节点next域指向空
    return Queue;
}

bool isEmpty(Node* Queue)//检查队列是否为空
{
    if(Queue->data==0||Queue->next==NULL)    return 0;//为空返回0
    else                                     return 1;//不为空返回1
}

void enQueue(Node* Queue,int data)//入队
{
    Node* Q=Queue;
    Node* node = (Node*)malloc(sizeof(Node));//开辟空间,新建节点
    node->data = data;//data给到新建节点的数据域
    for(int i=0;i<Queue->data;i++)
    {
        Q=Q->next;
    } 
    node->next=Q->next;//NULL
    Q->next=node;
    Queue->data++;//入队导致队元素个数加一
}

int deQueue(Node* Queue)//出队
{
    if(isEmpty(Queue)==0)   return -1;//队空,出队错误
    else
    {
        Queue->data--;//出队导致队元素个数减一
        Node* node=Queue->next;//新建结点存队头,用于调整队表顺序后释放使用
        int n=Queue->next->data;//新建遍历存储队头,用于输出使用
        Queue->next=Queue->next->next;//调整链表顺序,删除队头
        free(node);//释放旧队头节点
        return n;//出队
    }
}

void printList(Node* Queue)//遍历操作
{
    Node* node=Queue->next;//队头给到新建节点node,即头节点的下一个
    while(node!=NULL)//未到队尾
    {
        printf("%d->",node->data);
        node=node->next;        
    }
    printf("NULL\n");
}

int main()
{
    Node* Queue= initList();//初始化头节点,创捷队列
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    enQueue(Queue,1);
    printList(Queue);
    enQueue(Queue,2);
    printList(Queue);
    enQueue(Queue,3);
    printList(Queue);
    enQueue(Queue,4);
    printList(Queue);
    enQueue(Queue,5);
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    system("pause");
}

在这里插入图片描述

参考资料:
链接: UP从0到1带你手撕数据结构全集(C语言版)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不僈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值