前言:

还是一如既往的欢迎大家啦!这一篇是为了简述本次实现队列的c语言操作,话不多说,我们直接入手吧!

队列的性质:

1.应用场景

队列是为了实现公平性或者合理性而存在的,实际的应用场景比如:排队 保持绝对公平性 和广度优先遍历 BFS

2.特点

队列的机制是先进先出,后进后出。可以说和栈完全相反的机制,那么根据这个机制,我们同样可以用数组或者链表来实现这个数据结构,但是由于我们要取头,相对于数组要扩展内存来说链表会更加适合一点,所以这次我用单链表来实现这个队列。

队列的实现:

1.队列函数的声明:

(下面的使用场景在vs2022)

//QListNode.h

#pragma once

#define _CRT_SECURE_NO_WARNINGS 1

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

//队列的实现 先进先出 后进后出

typedef int QDataType;
//使用链表进行实现 如果用数组的话不方便出列
typedef struct QListNode {

//首先创建一个类似于单链表的结构
    struct QlisNode* next;
    QDataType x;

}QNode;

//下面在定义一个结构体用来表示队列的结构 即队头和队尾
typedef struct Queue{
    QNode* head;
    QNode* tail;
}Queue;

// 初始化队列 
void QueueInit(Queue* q);

// 队尾入队列 
void QueuePush(Queue* q, QDataType data);

// 队头出队列 
void QueuePop(Queue* q);

// 获取队列头部元素 
QDataType QueueFront(Queue* q);

// 获取队列队尾元素 
QDataType QueueBack(Queue* q);

// 获取队列中有效元素个数 
int QueueSize(Queue* q);

// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
bool QueueEmpty(Queue* q);

// 销毁队列 
void QueueDestroy(Queue* q);

2.功能的实现:

//QListNode.c

#include"QListNode.h"

void QueueInit(Queue* q)
{
    assert(q);
    q->head = q->tail = NULL;

}

void QueuePush(Queue* q, QDataType data)
{
    assert(q);

// 尾插 先创建一个节点
    QNode* node = (QNode*)malloc(sizeof(QNode));
    if (node == NULL)
    {
        printf("node :: malloc ┭┮﹏┭┮ 没有申请到内存哦~");
        exit(-1);
    }
    node->next = NULL;
    node->x = data;

//第一次添加
    if (q->tail == NULL)
    {
        q->head = q->tail = node;
    }
    else//正常尾插
    {
        q->tail->next = node;
        q->tail = node;
    }
}

void QueuePop(Queue* q)
{
    assert(q);
    //判断数据是否是空
    assert(!QueueEmpty(q));

//第一种情况 只剩一个数据了
    if (q->head == q->tail)
    {
        free(q->head);
        q->head = q->tail = NULL;
    }
    else//第二种情况 正常弹出
    {
        QNode* next = q->head;
        q->head = next->next;
        free(next);
        next = NULL;
    }
}

//输出头元素 即出列
QDataType QueueFront(Queue* q)
{
    assert(q);
    assert(!QueueEmpty(q));

return q->head->x;

}

//输出尾元素 
QDataType QueueBack(Queue* q)
{
    assert(q);
    assert(!QueueEmpty(q));

return q->tail->x;
}

//计算队列里的有效数据
int QueueSize(Queue* q)
{
    int n = 0;
    assert(q);

QNode* p = q->head;
    while (p != NULL)
    {
        p = p->next;
        n++;
    }

return n;
}

//判断数据是否为空
bool QueueEmpty(Queue* q)
{
    assert(q);

return q->head == NULL;
}

//摧毁队列
void QueueDestroy(Queue* q)
{
    assert(q);

QNode* p = q->head;
    while (p)
    {
        QNode* tmp = p;
        p = p->next;
        free(tmp);

}
    q->head = q->tail = NULL;

}

好啦,以上就是队列的简易实现啦!谢谢!

c语言实现队列的创建相关推荐

  1. c语言建立队列(顺序队列、循化队列和链式队列)

    c语言建立队列 一.顺序队列 队列的顺序存储结构 顺序队列的讨论 "下溢"现象 "真上溢"现象 "假上溢"现象 二.如何解决"假上 ...

  2. Swift3.0语言教程使用编码创建和初始化字符串

    Swift3.0语言教程使用编码创建和初始化字符串 使用编码创建和初始化字符串 创建和初始化字符串除了可以使用上文中提到的方法外,还可以使用init(coder:)方法,此方法一般不常使用,其语法形式 ...

  3. Swift3.0语言教程使用指针创建和初始化字符串

    Swift3.0语言教程使用指针创建和初始化字符串 Swift3.0语言教程使用指针创建和初始化字符串苹果的Swift团队花了不少功夫来支持C的一些基础特性.C语言中为我们提供了指针,Swift也不例 ...

  4. Swift3.0语言教程使用字符串创建和初始化字符串

    Swift3.0语言教程使用字符串创建和初始化字符串 Swift3.0语言教程使用字符串创建和初始化字符串,在编程语言中,字面值是很常见的数据描述形式.人们可以通过字面所表达的意思,获知其含义,尤其是 ...

  5. Linux下C语言编程-进程的创建

    Linux下C语言编程-进程的创建 作者:hoyt 1.进程的概念 Linux操作系统是面向多用户的.在同一时间可以有许多用户向操作系统发出各种命令.那么操作系统是怎么实现多用户的环境呢?在现代的操作 ...

  6. C语言实现队列ADT(Queue ADT)接口COMP2521(附完整源码)

    C语言实现队列ADT接口COMP2521 QueueRep结构体定义 node结构体定义 实现以下5个接口 完整头文件 完整源文件 QueueRep结构体定义 typedef struct Queue ...

  7. c语言二叉树的生成,C语言实现二叉树的创建以及遍历(递归)

    C语言实现二叉树的创建以及遍历 #include typedef char ElemType; typedef struct BiTNode { ElemType data; struct BiTNo ...

  8. C语言的特点与创建的基本步骤是什么

    C语言的特点与创建的基本步骤是: C 语言特点: 1.C语言是一种成功的系统描述语言,用C语言开发的UNIX操作系统就是一个成功的范例; 2.同时C语言又是一种通用的程序设计语言,在国际上广泛流行.世 ...

  9. 消息队列控制灯代码_代码实现RabbitMQ死信队列的创建

    ‍ ‍前言:‍ ‍ 之前有写过死信队列的使用场景以及通过管控台创建死信.这次就通过代码实现死信队列的创建,同时也分享一下RabbitMQ封装的类. 准备: 1. 先准备一个死信队列(最后用来消费)的参 ...

最新文章

  1. 重磅发布!Google语义分割新数据集来啦!又一个分割SOTA模型
  2. Dynamips和Vmware完成CCVP试验(4)
  3. 实现 Android 应用在开机时自启动
  4. CISCO交换机如何删除 Vlan
  5. 彻底理解宽带信号在频域分解为窄带信号
  6. WebRTC 音视频开发之路
  7. Linux无法解析hosts里面绑定域名的排查方法
  8. POI 导出文件以文件流形式返回
  9. 炸窝Vector简介
  10. Jquery getJSON方法分析(二)
  11. Linux命令之乐--iconv
  12. iphone怎么换手机铃声?原来方法这么简单,只需要一招 iRingg
  13. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
  14. [论文写作笔记] C11论文查重原理及降重
  15. DS1302时钟模块简单介绍
  16. 通达信版弘历软件指标_弘历主图指标详解 通达信指标
  17. hyper-v虚拟机驱动_如何在Hyper-V虚拟机中访问本地和USB硬盘驱动器
  18. url编码 java_java中的url 编码与解码
  19. 微信小程序实现tab切换
  20. 【Pytorch论文相关代码】使用SOLD2预训练好的模型检测与匹配线段(自己的数据集)

热门文章

  1. 话费充值接口文档接口版本:1.0
  2. nacos/nacos-server:v2.1.2-slim analysis
  3. (Java多线程常见面试题)ThreadLocal 是什么?有哪些使⽤场景?
  4. 苹果升级鸿蒙系统,华为正式官宣!首批鸿蒙系统正式版升级大名单出炉:这些用户有福了...
  5. WPS 批量替换word文字
  6. Android 面试经验 - 大厂 腾讯 面
  7. AutoCAD二次开发——框选
  8. iastora怎么改成ahci_系统重装|电脑硬盘IDE修改为AHCI模式教程
  9. 使用UnityWebRequest发送Post请求深度解析
  10. python调用java的方法