队列 c语言实现_c#清除队列指定数量-程序员宅基地

技术标签: 详解注解  数据结构和算法  队列  c代码  FIFO  

1.导言

栈和队列是两种常见的线性表,栈因为只能在表的一端进行插入和删除,这种结构决定了栈后进先出的特性,队列也是一种受限的线性表,队列只能在表的一端进行插入,在表的另一端进行删除。允许插入的一端叫做队尾(rear),允许删除的一端被称之为队头(front)。这种结构决定了队列具有先进先出(FIFO)的特性.对队列来说,在我们日常生活中,随处可见。去食堂排队打饭,最早排队的人,最先拿着饭菜离开,典型的先进先出(当然了,对于插队这种事情,我也就呵呵了)、队列在程序设计中也经常出现,如实时系统中的事件处理,操作系统中的作业排队等。在我们学习数据结构过程中,对于任何一种数据结构我们必须从以下角度去考虑:数据与数据之间的逻辑关系,数据间的关系怎么表示,数据和数据间的关系怎么在计算机中表示。这也就是数据结构的逻辑结构,和物理结构(也叫数据的存储结构)。队列(queue)就逻辑结构而言,是一种一对一的线性关系,是受限的线性表,只能在表尾进行插入,在表头进行删除。而数据在计算机中存储,总共用两种方式,一种是顺序表,用一块连续的内存单位,来保存数据。这里数据间的关系是:逻辑结构相邻的数据,物理存储位置也相邻。另一种是链式存储,链式存储是把数据和指向数据关系的指针封装成一个节点,保存数据的叫做数据域,能体现数据间的关系的叫做指针域。


2.队列的定义
队列(queue)是一种先进先出(first in first out)(FIFO)的线性表。它只允许在表的一端进行插入,在表的另一端、进行删除.允许插入的一端称之为队尾(rear),允许删除的一端称之为队头(front).


3.队列的性质
队列只允许在表尾进行插入,在表头进行删除,所以,队列的这种结构决定了队列具有先进先出的性质,凡是具有先进先出特性的可以考虑用队列来实现。


4.队列的链式表示
队列是一种受限的线性表,所以队列在计算机中也有两种表示和存储方式:(1)顺序表示(2)链式表示,这里用链式表示来存储。用链表表示的队列称为链队列。因为队列在表尾进行插入 ,在队头进行删除,所以一个队列显然需要一个指向队尾和队头的指针(分别称之为队尾指针,和队头指针)才能唯一确定。和单链表一样,为了操作方便,我们给链队列设置一个头节点,并令头指针指向了头节点,所以链队为空的判断条件是头指针和尾指针都指向了头节点。队列的插入和删除就是线性表的插入和删除的特需情况,只允许在表头进行删除,在表尾进行插入。


5.实现代码

//Queue.h
#ifndef QUEUE_H
#define QUEUE_H
typedef int DataType;

//-----------------------单链表队列节点(QNode)------------------------------//

typedef struct QNode{
	
	DataType data;//存放数据的数据域
	QNode *next;//存放数据间关系的指针域next 指向下一节点

}QNode;

//-----------------------单链表队列--------队列的链式存储结构----------------//
typedef struct LinkQueue{
	QNode *front;//队头指针指向队头
	QNode *rear;//队尾指针,指向队尾
	QNode *head;//队列头节点指针,数据域为空,指针域指向数据的第一个数据元素节点(首元节点),当队列为空时(front == rear == head)设置此节点为了方便队列的各种操作

}LinkQueue;

//-----------------------单链表队列的基本操作-----------为了插入方便设置了头节点------//
//构造队列:init_queue(LinkQueue *queue):分配内存,初始化队列
bool  init_queue(LinkQueue *queue);

//队列判空:is_queue_empty(const LinkQueue * const queue):判断队列是否为空,front == rear == head;
bool is_queue_empty(const LinkQueue * const queue);

//队列长度:queue_length( const LinkQueue * const queue);
int queue_length( const LinkQueue * const queue);

//从队尾进行插入; queue_insert( LinkQueue *queue , const DataType data)
bool queue_insert( LinkQueue *queue, const DataType data);

//遍历队列,访问队列中的所有节点的数据域: bool queue_traverse(const LinkQueue * const queue)
bool queue_traverse(const LinkQueue * const queue);


//获取队头数据元素  front_data( const LinkQueue * const queue, DataType *data )
DataType front_data( const  LinkQueue* const queue);

//从队列中删除队头 delete_queue_front( LinkQueue *queue);
bool delete_queue_front( LinkQueue *queue);

//将队列清空 clear_queue( LinkQueue *queue);将队列中所有数据元素都清除,直到队列为空
bool clear_queue( LinkQueue *queue);

//销毁队列:destroy_queue(LinkQueue *queue);队列将不存在,从头到尾删除队列中的节点释放队列所指的内存
//bool destroy_queue(LinkQueue *queue);
 bool destroy_queue(LinkQueue *queue);

#endif




//---------------------------队列基本操作算法描述(c语言实现)------------------//
#include"Queue.h"
#include<stdlib.h>
#include<stdio.h>

//--------------构造队列:init_queue(LinkQueue *queue):分配内存,初始化队列--------------//
//功能:构造一个空队列queue
//函数参数:queue 为指向队列的指针
//返回值:构造成功 返回true(1),构造失败 返回false(0)
//时间复杂度:O(1)
//测试用例{queue == NULL ,queuef != NULL}

bool  init_queue(LinkQueue *queue){

	if( queue == NULL)//当参数为指针时要判空
		exit(-1);//为空,进程结束,异常退出

	//生成一个QNode 类型的头节点(此节点数据域data不包含任何数据,指针域next指向队列的第一个节点,
	//当队列为空时(是指队列任何已经存在,但队列中没有任何数据)queue->rear == queue->front == head;
	
	queue->head =(QNode*)malloc(sizeof(QNode));//为队列生成一个头节点(方便插入和删除)
	queue->head->data = 0;
	queue->head->next = NULL;//节点必须初始化 

	if( queue->head == NULL )//内存分配失败,进程异常退出
		exit(-1);

	else{
		queue->front = queue->rear = queue -> head;//构造了一个空队列
		return true;
	}

}



//------------------队列判空:is_queue_empty(const LinkQueue * const queue):判断队列是否为空,front == rear == head;----------//
//算法说明:判断队列是否为空,为空的条件是( queue->front == queue->head) && (queue->rear == queue ->head)
//参数说明:queue 为LinkQueue类型的常指针,因为在判断过程中 ,不会修改队列
//返回值:true(1)队列为空,false(0)队列不为空
//时间复杂度:O(1)
//测试用例,1.{qu
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tianxiaolu1175/article/details/47905205

智能推荐

tc275单片机的内核_英飞凌TC275_bootloader源码 TC275单片机基于autosar的bootloader工程代码(Bootloader engineering code of tc...-程序员宅基地

文章浏览阅读1.4k次。压缩包 : f9a27655e546fd0d4bf5ed97eda6479f.zip 列表英飞凌TC275_bootloader源码/英飞凌TC275_bootloader源码/.cproject英飞凌TC275_bootloader源码/.htcproject英飞凌TC275_bootloader源码/.project英飞凌TC275_bootloader源码/.settings/英飞凌TC27..._英飞凌tc275芯片bootloader开发

SimpleFOC(三)—— AS5600角度读取_as5600磁编码器中文手册-程序员宅基地

文章浏览阅读3.2w次,点赞25次,收藏137次。目录一、硬件介绍1、磁编码器说明:2、硬件连接二、程序演示1、模拟电压获取角度2、I2C通信获取角度三、程序拓展一、硬件介绍1、磁编码器说明:  ◆AS5600与两极磁铁配对,可以输出12位分辨率的磁性旋转位置,支持IIC通信,还可以输出模拟电压和PWM信号。官方例程中主要演示了模拟电压和IIC通信两种角度获取方式。  ◆模拟电压模式,Aout引脚输出0—5V对应0°—360°,  ◆I2C模式,读取0x0C/0x0D两个寄存器,获取12bits的角度值,0—4096对应0°—360°,2_as5600磁编码器中文手册

Windows恢复Grub引导,用grub安装ubuntu-程序员宅基地

文章浏览阅读86次。http://www.linuxidc.com/wap.aspx?nid=18027&p=&cp=&cid=http://m.blog.chinaunix.net/uid-22197900-id-359250.htmlhttp://zhidao.baidu.com/question/147900468.html?fr=ala&word=Grub%20%E5%AE..._在windowa 修复grub 引导

lua游戏代码_在游戏中如何使用LUA脚本语言_lua如何用一段代码在游戏屏幕上添加一个按钮-程序员宅基地

文章浏览阅读3.6k次。当你希望在你的游戏开始的时候读取一些信息,以配置你的游戏,这些信息通常都是放到一个文本文件中,在你的游戏启动的时候,你需要打开这个文件,然后解析字符串,找到所需要的信息。或许你认为这样就足够了,为什么还要使用Lua呢?应用于“配置”这个目的,Lua提供给你更为强大,也更为灵活的表达方式,在上一种方式中,你无法根据某些条件来配置你的游戏,Lua提供给你灵活的表达方式,你可以类似于这样来配置你的游戏:ifplayer:is_dead()then_lua如何用一段代码在游戏屏幕上添加一个按钮

LINUX下MATLAB MEX编译的问题_matlab mex编译linux-程序员宅基地

文章浏览阅读3.8k次。最近跑一个程序,是matlab和c混合编程的,而且调用了一些Linux下特有的库文件,所以只能在linux下运行。但是ubuntu里安装的Matlab r2013a 出现了gcc版本问题。matlab r2013a只支持gcc4.4, 而ubuntu的gcc已经更新到4.8.2所以为了方便,只好安装4.4版的编译器, 包括gcc, g++, gfortran安装命令_matlab mex编译linux

序列化和反序列化_使用反序列化的 readobject() 方法-程序员宅基地

文章浏览阅读348次。1.概念:序列化: 将数据结构或对象转换成二进制串的过程。反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。只有实现了Serializable或Externalizable接口的类的对象才能被序列化,否则抛出异常2:为什么要序列化和反序列化我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二_使用反序列化的 readobject() 方法

随便推点

十大实用的办公工具网站,可以解决你日常100%的问题_办公网站导航-程序员宅基地

文章浏览阅读1.5k次。1.快捷键查询(这是个英文网站,推荐使用谷歌浏览器访问,再使用谷歌翻译)网站地址:https://usethekeyboard.com/Use The Keyboard是一个提供快捷键查询的网站的,你通过它可以查询苹果APP,windows系统,以及一些网站的快捷键操作,你知道熟练的掌握一些快捷键能够大大的提高工作或者学习的效率,当然,也不是特意的去记忆,而是在使用的过程中逐渐熟悉,前期就可以借助这种工具进行查询。2,MikuTools网站地址:https://miku.toolsM_办公网站导航

51单片机之数码管_0x3f,0x06-程序员宅基地

文章浏览阅读5k次,点赞4次,收藏13次。1.静态数码管原理图LED数码管根据LED的不同接法分为两类:共阴和共阳_0x3f,0x06

计算机组成原理脱机运算器实验数据,实验三:脱机运算器实验报告.pdf-程序员宅基地

文章浏览阅读841次。大连理工大学大连理工大学 本科实验报告本科实验报告 课程名称 计算机组成原理实验 学院 系 软件学院 专 业 软件工程 班 级 0907 英 学 号 200892497 学生姓名 刘云伟 2011 年 3 月 31 日 大连理工大学实验报告大连理工大学实验报告 学院 系 软件学院 专业 软件工程 班级 0907 英 姓 名 刘云伟 学号 200892497 实验台 21 实验时间 2011 3 3..._脱机运算器实验结果表格

自适应大邻域算法(ALNS)求解TSP问题,golang实现_alns tsp-程序员宅基地

文章浏览阅读489次,点赞12次,收藏6次。自适应大邻域搜索算法(Adaptive Large Neighborhood Search , ALNS)_alns tsp

form做表单验证时,填写了正确的数值但是依旧一直提示为空。_form.validate( 输入的值会被设置为空-程序员宅基地

文章浏览阅读2.6k次。定义验证规则时,rule和model绑定的属性值必须是一样的_form.validate( 输入的值会被设置为空

2022-2028年中国甘油磷脂酰胆碱(GPC)行业市场发展模式及投资规划分析报告-程序员宅基地

文章浏览阅读170次。报告类型:产业研究报告格式:电子版、纸介版、电子+纸介出品单位:智研咨询-产业信息网智研咨询发布的《2022-2028年中国甘油磷脂酰胆碱(GPC)行业市场发展模式及投资规划分析报告》共十五章。首先介绍了甘油磷脂酰胆碱(GPC)行业市场发展环境、甘油磷脂酰胆碱(GPC)整体运行态势等,接着分析了甘油磷脂酰胆碱(GPC)行业市场运行的现状,然后介绍了甘油磷脂酰胆碱(GPC)市场竞争格局。随后,报告对甘油磷脂酰胆碱(GPC)做了重点企业经营状况分析,最后分析了甘油磷脂酰胆碱(GPC)行业发展趋...