数据结构 队列(C语言实现)

这篇具有很好参考价值的文章主要介绍了数据结构 队列(C语言实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


绪论

        任其事必图其效;欲责其效,必尽其方。——欧阳修;本篇文章主要写的是什么是队列、以及队列是由什么组成的和这些组成接口的代码实现过程。(大多细节的实现过程以注释的方式展示请注意查看

数据结构 队列(C语言实现)

 文章来源地址https://www.toymoban.com/news/detail-502748.html

 话不多说安全带系好,发车啦(建议电脑观看)


附:红色,部分为重点部分;蓝颜色为需要记忆的部分(不是死记硬背哈,多敲);黑色加粗或者其余颜色为次重点;黑色为描述需要


目录

队列

1.队列的实现​编辑

1.1队列的结构

1.2队列的初始化

1.3将数据放进队列中

1.4删除数据

1.5查看队列中是否有数据

1.6查看队列中的头尾数据

1.7查看队列中有几个元素

1.8队列的摧毁

2.队列的实现代码


队列

知识点:

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)

入队列:进行插入操作的一端称为队尾 、出队列:进行删除操作的一端称为队头数据结构 队列(C语言实现)

细节:

队列的基本结构框架:同样队列也是既能由顺序表也能由链表来实现的,下面将用链表来实现(因为链表相较于顺序表来说,其头删的效率比较高)

  1. 队列的结构
    1. 指向链表头的指针
    2. 指向链表尾的指针
    3. 记录链表元素个数的变量
  2. 队列所要实现的功能
    1. 队列的初始化
    2. 队列的摧毁
    3. 放入数据
    4. 删除数据
    5. 查看队列是否为空
    6. 获取头部、尾部的数据
    7. 查看队列中有几个元素

1.队列的实现

1.1队列的结构

因为队列是由链表来实现所以先要有一个链表,然后队列中的结构由指向链表的头和尾的指针以及一个记录链表中有多少数据的变量。

所以我们就分成两个结构体的形式:一个结构体实现单链表,一个结构体是队列的结构queue。

typedef int QDataType;

typedef struct QListNode
{
	struct QListNode* _pNext;//指向下一个
	QDataType _data;//数据
}QNode;

typedef struct Queue
{
	QNode * _front;//指向头
	QNode* _rear;//尾
	int _size;//记录有几个数据
}Queue;

1.2队列的初始化

初始化一下队列,把队列中的两个指针已经记录数据个数的变量初始化

void QueueInit(Queue* q)//用指针接收结构
{
	assert(q);//判空
	q->_front = q->_rear = NULL;//连续赋值将两个指针都先赋值成空指针
	q->_size = 0;//一开始元素个数为0
}

1.3将数据放进队列中

将数据放进队列中,其实原理类似实现链表的尾插,不同于主要是通过rear来找到尾,然后直接进行数据的插入(当rear为NULL时表示队列中是没有数据的)

void QueuePush(Queue* q, QDataType data)
{
	assert(q);
	QNode* pf = (QNode*)malloc(sizeof(QNode));//先申请一个链表节点空间
	if (pf == NULL)//判断是否申请成功
	{
		perror("malloc");
		return;
	}
	//判断第一个节点是否存在(队列中没有数据的时候rear是NULL)
	if (q->_rear)//若不为NULL
	{
		q->_rear->_pNext = pf;//进行尾插,也就是在最后一个节点后面插入新生成的节点pf
		q->_rear = pf;//再把尾部修改一下
	}
	else//当队列中没有数据的时候
	{
		//此时把头和尾指针都指向pf这样就创建好链表的开始了
		q->_rear = pf;
		q->_front = pf;
	}
	q->_rear->_data = data;//将rear指向后,将尾部的数据填充为所给的data
	q->_rear->_pNext = NULL;//再将尾部指针的下一个位置置成NULL
	q->_size++;//元素个数++
}

1.4删除数据

删除数据就相当于链表的头删,通过front找到头进行释放,然后再改变一下front头,注意队列中是否有数据

void QueuePop(Queue* q)
{
	assert(q);//判空
	assert(!QueueEmpty(q));//查看队列中是否有数据
	QNode* tmp = q->_front->_pNext;//用tmp记录一下第二个位置的数据的地址
	if (q->_front == q->_rear)//判断一下是否为最后一个元素
	{
		free(q->_front);//释放头指向的空间
		//若是则直接吧rear和front都置为NULL
		q->_front = q->_rear = NULL;
	}
	else//反之当不止只有一个数据时
	{
		free(q->_front);//同样是否头位置的空间

		q->_front = tmp;//改变一下头位置然其指向第二个数据的位置也就是新头
	}
	q->_size--;//元素减少一位
}

1.5查看队列中是否有数据

直接查看一下size即可

bool QueueEmpty(Queue* q)
{
	assert(q);//判空
	return q->_size == 0;//查看size是否为0,若为则返回真(1)反之则为假(0)
}

1.6查看队列中的头尾数据

直接返回各指针指向空间的数据,注意要判断一下是否为空(否则可能会访问到NULL)

QDataType QueueFront(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));//判断队列是否有数据
	return q->_front->_data;//返回头位置的数据
}

QDataType QueueBack(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));//判断队列是否有数据
	return q->_rear->_data;//返回尾位置的数据
}

1.7查看队列中有几个元素

直接返回队列结构体中的size即可


int QueueSize(Queue* q)
{
	return q->_size;//返回size即可
}

1.8队列的摧毁

队列的摧毁和链表的摧毁几乎一样

void QueueDestroy(Queue* q)
{
	assert(q);
	//从前往后的进行各链表节点释放
	while (q->_front)//判断头是否为空
	{
		QNode* next = q->_front->_pNext;//用next记录下一个位置的地址(防止找不到)
		free(q->_front);//释放当前位置
		q->_front = next;//让front指向下一个位置
	}
	q->_front = q->_rear = NULL;//链表数据全部释放完后把front/rear也置为NULL
	q->_size = 0;//把size置为0
}

2.队列的实现代码

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


typedef int QDataType;

typedef struct QListNode
{
	struct QListNode* _pNext;//指向下一个
	QDataType _data;//数据
}QNode;

typedef struct Queue
{
	QNode * _front;//头
	QNode* _rear;//尾
	int _size;
}Queue;




void QueueInit(Queue* q)
{
	assert(q);
	q->_front = q->_rear = NULL;
	q->_size = 0;
}

void QueuePush(Queue* q, QDataType data)
{
	assert(q);
	QNode* pf = (QNode*)malloc(sizeof(QNode));//先申请一个链表节点空间
	if (pf == NULL)//判断是否申请成功
	{
		perror("malloc");
		return;
	}
	//判断第一个节点是否存在(队列中没有数据的时候rear是NULL)
	if (q->_rear)//若不为NULL
	{
		q->_rear->_pNext = pf;//进行尾插,也就是在最后一个节点后面插入新生成的节点pf
		q->_rear = pf;//再把尾部修改一下
	}
	else//当队列中没有数据的时候
	{
		//此时把头和尾指针都指向pf这样就创建好链表的开始了
		q->_rear = pf;
		q->_front = pf;
	}
	q->_rear->_data = data;//将rear指向后,将尾部的数据填充为所给的data
	q->_rear->_pNext = NULL;//再将尾部指针的下一个位置置成NULL
	q->_size++;//元素个数++
}

bool QueueEmpty(Queue* q)
{
	assert(q);
	return q->_size == 0;//查看size是否为0,若为则返回真(1)反之则为假(0)
}
void QueuePop(Queue* q)
{
	assert(q);//判空
	assert(!QueueEmpty(q));//查看队列中是否有数据
	QNode* tmp = q->_front->_pNext;//用tmp记录一下第二个位置的数据的地址
	if (q->_front == q->_rear)//判断一下是否为最后一个元素
	{
		free(q->_front);//释放头指向的空间
		//若是则直接吧rear和front都置为NULL
		q->_front = q->_rear = NULL;
	}
	else//反之当不止只有一个数据时
	{
		free(q->_front);//同样是否头位置的空间

		q->_front = tmp;//改变一下头位置然其指向第二个数据的位置也就是新头
	}
	q->_size--;//元素减少一位
}

QDataType QueueFront(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));//判断队列是否有数据
	return q->_front->_data;//返回头位置的数据
}

QDataType QueueBack(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));//判断队列是否有数据
	return q->_rear->_data;//返回尾位置的数据
}

int QueueSize(Queue* q)
{
	return q->_size;//返回size即可
}

void QueueDestroy(Queue* q)
{
	assert(q);
	//从前往后的进行各链表节点释放
	while (q->_front)//判断头是否为空
	{
		QNode* next = q->_front->_pNext;//用next记录下一个位置的地址(防止找不到)
		free(q->_front);//释放当前位置
		q->_front = next;//让front指向下一个位置
	}
	q->_front = q->_rear = NULL;//链表数据全部释放完后把front/rear也置为NULL
	q->_size = 0;//把size置为0
}

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量数据结构细致内容,早关注不迷路。

 

 

到了这里,关于数据结构 队列(C语言实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构 队列(C语言实现)

            任其事必图其效;欲责其效,必尽其方。——欧阳修;本篇文章主要写的是什么是队列、以及队列是由什么组成的和这些组成接口的代码实现过程。( 大多细节的实现过程以注释的方式展示请注意查看 )    话不多说安全带系好,发车啦 (建议电脑观看) 。 附

    2024年02月11日
    浏览(48)
  • 数据结构-队列(C语言的简单实现)

    队列也是一种数据结构,队列也可以用来存放数字 每次只能向队列里将入一个数字,每次只能从队列里获得一个数字 在队列中,允许插入的一段称为入队口,允许删除的一段称为出队口 它的原则是先进先出(FIFO: first in first out),先进入队列的数据先出去,后进入的后出去。

    2024年02月13日
    浏览(42)
  • 数据结构-队列的实现(C语言版)

    前言         队列是一种特殊的线性表,它只允许在一端对数据进行插入操作,在另一端对数据进行删除操作的特殊线性表,队列具有先进先出的(FIFO)的 特性,进行插入操作的一端称为队尾,进行删除操作的一端称为队头。         队尾:元素在队尾入队。插入操作。

    2024年02月13日
    浏览(44)
  • 【数据结构初阶】六、线性表中的队列(C语言 -- 链式结构实现队列)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【数据结构初阶】五、线性表中的栈(C语言 -- 顺序表实现栈)_高高的胖子的博客-CSDN博客  

    2024年02月08日
    浏览(38)
  • 数据结构初阶(用C语言实现简单数据结构)--栈和队列

    ✨✨欢迎来到T_X_Parallel的博客!!       🛰️博客主页:T_X_Parallel       🛰️专栏 : 数据结构初阶       🛰️欢迎关注:👍点赞🙌收藏✍️留言 这小猫真好看 言归正传,通过上篇有关顺序表和链表的博客,可以了解到线性表的一些大致特征,这篇博

    2024年02月08日
    浏览(37)
  • (详解)数据结构-----------栈与队列 c语言实现

    本章将会详细讲解以下知识点: 目录 一:栈         1:栈的定义,栈的特点         2:用什么结构来实现栈与原因的分析?         3:  (超详解)栈的常用接口并且附上测试用例 二:队列         1:队列的定义,队列的特点         2:用什么结构来实现队列与原因的分析

    2024年02月11日
    浏览(40)
  • 入门数据结构,c语言实现循环队列实现(详细篇)。

    目录 一、前言 二、循环队列的概念 三、实现循环队列 1、头文件与特殊函数介绍 2、循环队列的结构体 3、队列的初始化 4、判断队列是否为空 5、队列的进队操作 6、队列的出队操作 7、返回队头 8、返回队列长度 9、放回队列容量大小 10、销毁队列 四、完成队列(队列完整代

    2024年02月06日
    浏览(40)
  • 【数据结构】队列基本操作的实现(C语言)

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🐌 个人主页:蜗牛牛啊 🔥 系列专栏:🛹数据结构、🛴C++ 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与

    2024年02月16日
    浏览(46)
  • 数据结构入门(C语言版)栈和队列之队列的介绍及实现

    什么是队列呢?我们先看下面的图: 我们可以理解成高速公路上的隧道,根据这个图的描述 我们把需入队的元素看作一辆车,把队列看作隧道,由此我们可以看出 队列的特点是 只允许从一端进入,从另一端离开。 队列就是只允许在一端进行插入数据操作,在另一端进行删

    2023年04月15日
    浏览(34)
  • 【算法与数据结构】 C语言实现单链表队列详解

    前面我们学习了队列的顺序表的实现,本节将用单链表实现队列。 队列也可以数组和链表的结构实现, 使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低 。下面我们先复习一下队列的基本概念: 队列:只允许在一端进行插入

    2024年04月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包