//Queue.h#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>typedef int QueueDataType;
//注意这里的两个结构体
typedef struct QueueNode
{QueueDataType x;struct QueueNode* next;
}QNode;
//先进先出的特点,所以设置头尾指针较好
typedef struct Queue
{QNode* head;QNode* tail;int size;
}Queue;void QueueInit(Queue* ps);
void QueueDestroy(Queue* ps);
void QueuePush(Queue* ps, QueueDataType x);
void QueuePop(Queue* ps);bool QueueEmpty(Queue* ps);
QueueDataType QueueHead(Queue* ps);
QueueDataType QueueTail(Queue* ps);
int QueueSize(Queue* ps);
//Stack.c
#include"Queue.h"void QueueInit(Queue* ps)
{assert(ps);ps->head = ps->tail = NULL;ps->size = 0;
}void QueueDestroy(Queue* ps)
{assert(ps);QNode* cur = ps->head;while (cur){QNode* tmp = cur;free(cur);cur = tmp->next;}//注意,当删到最后时,head在tail的后面一个位置//tail所指向的空间已经被释放,此时tail为野指针//所以要记得把tail和head都置为NULLps->head = ps->tail = NULL;
}void QueuePush(Queue* ps, QueueDataType x)
{assert(ps);QNode* newNode = (QNode*)malloc(sizeof(QNode));if (newNode == NULL){perror("malloc fail");exit(-1);}newNode->x = x;newNode->next = NULL;//如果队列为空if (ps->head ==NULL && ps->tail==NULL){ps->head = ps->tail = newNode;}else{ps->tail->next = newNode;ps->tail = newNode;}++ps->size;
}void QueuePop(Queue* ps)
{assert(ps);assert(!QueueEmpty(ps));//注意,当删到最后时,head在tail的后面一个位置//tail所指向的空间已经被释放,此时tail为野指针//所以要记得把tail和head都置为NULL//这里需要分类讨论if (ps->head->next == NULL){free(ps->head);ps->head = ps->tail = NULL;}else{QNode* cur = ps->head;ps->head = ps->head->next;free(cur);cur = NULL;}--ps->size;
}bool QueueEmpty(Queue* ps)
{assert(ps);return ps->size == 0;
}QueueDataType QueueHead(Queue* ps)
{assert(ps);assert(!QueueEmpty(ps));return ps->head->x;
}QueueDataType QueueTail(Queue* ps)
{assert(ps);assert(!QueueEmpty(ps));return ps->tail->x;
}int QueueSize(Queue* ps)
{assert(ps);return ps->size;
}

C语言 队列的实现(链表实现)相关推荐

  1. 梓益C语言学习笔记之链表&动态内存&文件

    梓益C语言学习笔记之链表&动态内存&文件 一.定义: 链表是一种物理存储上非连续,通过指针链接次序,实现的一种线性存储结构. 二.特点: 链表由一系列节点(链表中每一个元素称为节点)组 ...

  2. C语言求两个链表的合并点的算法(附完整源码)

    C语言求两个链表的合并点的算法 C语言求两个链表的合并点的算法完整源码(定义,实现,main函数测试) C语言求两个链表的合并点的算法完整源码(定义,实现,main函数测试) #include < ...

  3. c语言链表查找的代码与题目,链表的C语言实现之单链表的查找运算_c语言

    建立了一个单链表之后,如果要进行一些如插入.删除等操作该怎么办?所以还须掌握一些单链表的基本算法,来实现这些操作.单链表的基本运算包括:查找.插入和删除.下面我们就一一介绍这三种基本运算的算法,并结合 ...

  4. 基于C语言Ncurse库和链表的简单贪吃蛇小游戏

    参考:基于C语言Ncurse库和链表的简单贪吃蛇小游戏 作者:三速何时sub20 发布时间:2020-09-29 10:23:51 网址:https://blog.csdn.net/weixin_44 ...

  5. c语言队列原理的实现,c印记(十二):队列queue原理与实现

    一.简而言之 在百度百科里面摘取了一段关于队列(queue)的介绍: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样, ...

  6. c语言队列作用,队列(C语言)

    一.定义 一种可以实现"先进先出"的存储结构. 二.分类 1.链式队列:用链表实现. 2.静态队列:用数组实现. 静态队列通常都必须是循环队列. 3.循环队列 (1)循环队列需要几 ...

  7. C语言中用链表构建栈讲解,C语言数据结构之使用链表模拟栈的实例

    C语言数据结构之使用链表模拟栈的实例 以下是"使用链表模拟栈"的简单示例: 1. 用C语言实现的版本 #include #include typedef char datatype ...

  8. 关于C语言的指针、链表的原理和各类操作

    今天课上我们老师为我们讲述了c语言的指针.链表的原理以及各类操作. 一.指针 1.指针 指针是一个存储计算机内存地址的变量.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具体类型的变量地址, ...

  9. C语言 队列(循环队列和链队初始化进出队等基本操作)

    目录 一.队列的定义 二.循环队列 1. 循环队列的储存结构 2.初始化 3.输出队列元素 4.入队 5.出队 6.取队头元素 7.求队列长度 8.源代码 三.链式队列 1.队列的链式存储结构表示 2 ...

  10. C语言结构体和链表结合,C语言结构体与链表

    C语言结构体与链表 第 10章 CHAPTER 10 结构体与共用体 学习目标 本章主要介绍结构体的定义和使用方法,然后介绍链表的概念和相关操作,最后介绍两种新的数据类型--共用体和枚举.通过本章的学 ...

最新文章

  1. Linux下/dev/null 21 相关知识说明
  2. java8 新特性 lambda过滤
  3. Arrays.copyOf()、Arrays.copyOfRange()与System.arraycopy()用法
  4. 使用Backtrace函数打印调用栈 - Debug居家必备
  5. linux图形驱动安装失败,红旗Linux 下NVIDIA的驱动安装问题
  6. 关于使用yum“The program package-cleanup is...”的解决办法
  7. Android计算器输入错误纠正,Android计算器低级错误?都是二进制惹的祸!
  8. 调用发票管理系统的方法2
  9. 保持积极向上的人生格言
  10. 他们做的通用人工智能,要让所有产品都具备“智能”大脑
  11. Autovue v21.0.2的新功能
  12. 如何在网页中加入图片
  13. 基于python的学生信息管理系统文献综述_学生信息管理系统的文献综述
  14. Java中正负数二进制表示
  15. golang数据结构初探之动态数组slice
  16. k30pro杀进程严重怎么解决_狗狗总是不吃饭,严重挑食怎么办?学会这三招,快速解决不吃饭...
  17. STM32驱动硬件MG90S舵机
  18. 提示错误信息:ZeroDivisionError: division by zero的解决方法
  19. cs1.6服务器修改游戏类型,《cs1.6》3266版本服务器
  20. 仙剑五手游服务器维护,新仙剑奇侠传游戏进不去怎么办 游戏进不去解决方法...

热门文章

  1. 伍德里奇计量经济学导论之计算机操作题的R语言实现(多元回归:估计)
  2. MAC 终端git提交代码步骤
  3. 深度学习CNN算法原理
  4. R-CNN算法优化策略
  5. 基于Python/PYQT5的动物识别专家系统(人工智能实验)
  6. SIYI AK28 遥控器接收机的SBUS口与STM32通讯
  7. nodejs下载与安装
  8. 我们常用的软件测试工具有哪些?
  9. Scala下载及安装(Windows)以及Idea中Scala项目的创建
  10. matlab手眼标定