以链表为基础实现链式队列

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

数据结构

链式队列

以链表为基础实现链式队列

1.思路:

如果打算以链表作为基础来实现队列的操作,可以避免内存浪费以及避免内存成片移动,只需要确定队头和队尾即可,一般把链表头部作为队头,可以实现头删,把链表尾部作为队尾,可以实现尾插。

2.图示:

以链表为基础实现链式队列

3.代码:

/*****************************************************************************************************************
*	
*	file name	:	LinkedQueue.c
*	author	 	:	cnzycwp@126.com
*	data  	 	:	2024/04/26
*	function	:	以链表为基础实现链式队列的接口程序
*	note	 	:	None
* 	
*  	CopyRight (c)	2024	cnzycwp@126.com 	All Right Reseverd
*
* ****************************************************************************************************************/

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

//指的是链式队列中的元素的数据类型,用户可以根据需要进行修改
typedef int  DataType_t;

//构造记录链式队列LinkedQueue的结点,链表中所有结点的数据类型应该是相同的
typedef struct LinkedQueue
{
	
    DataType_t  		 data;    //结点的数据域
	struct LinkedQueue	*next;    //结点的指针域	

}LQueue_t;

/*****************************************************************************************************************
*	
*	func name	:	LQueue_Create
*	function	:	创建一个空链式队列,空链式队列应该有一个队列头结点,对链式队列进行初始化
*	argument	:	None
*	retval		:	LQueue_t
*	note		:	None
*	author	 	:	cnzycwp@126.com
*	data  	 	:	2024/04/26
* 	
*
* ****************************************************************************************************************/
//创建一个空链式队列,空链式队列应该有一个队列头结点,对链式队列进行初始化
LQueue_t * LQueue_Create(void)
{
	//1.创建一个队列头结点并对队列头结点申请内存
	LQueue_t *Head = (LQueue_t *)calloc(1,sizeof(LQueue_t));
	if (NULL == Head)
	{
		perror("Calloc memory for HeadQueue is Failed");
		exit(-1);
	}

	//2.对队列头结点进行初始化,队列头结点是不存储有效内容的!!!
	Head->next = NULL;

	//3.把队列头结点的地址返回即可
	return Head;
}

/*****************************************************************************************************************
*	
*	func name	:	LQueue_NewNode
*	function	:	创建新的队列结点,并对新队列结点进行初始化
*	argument	:	
*					@data
*	retval		:	LQueue_t
*	note		:	None
*	author	 	:	cnzycwp@126.com
*	data  	 	:	2024/04/26
* 	
*
* ****************************************************************************************************************/
//创建新的队列结点,并对新队列结点进行初始化
LQueue_t * LQueue_NewNode(DataType_t data)
{
	//1.创建一个新队列结点并对新队列结点申请内存
	LQueue_t *New = (LQueue_t *)calloc(1,sizeof(LQueue_t));
	if (NULL == New)
	{
		perror("Calloc memory for NewNodeQueue is Failed");
		return NULL;
	}

	//2.对新结点的数据域和指针域进行初始化
	New->data = data;
	New->next = NULL;

	return New;
}

/*****************************************************************************************************************
*	
*	func name	:	LQueue_Enqueue
*	function	:	对链式队列进行尾部插入操作,称为入队
*	argument	:	
*					@data
*					@Head
*	retval		:	bool
*	note		:	None
*	author	 	:	cnzycwp@126.com
*	data  	 	:	2024/04/26
* 	
*
* ****************************************************************************************************************/
//入队(尾插)
bool LQueue_Enqueue(LQueue_t *Head,DataType_t data)
{
	//1.创建新的结点,并对新结点进行初始化
	LQueue_t *New = LQueue_NewNode(data);
	if (NULL == New)
	{
		printf("can not insert new node for Queue\n");
		return false;
	}
	//2.判断链表是否为空,如果为空,则直接插入即可
	if (NULL == Head->next)
	{
		Head->next = New;
		return true;
	}

	//3.如果链表为非空,则把新结点插入到链表的尾部
    while (Head->next)
    {
        Head = Head->next;
    }
    Head->next = New;			//把尾结点的next指针指向新节点

	return true;
}

/*****************************************************************************************************************
*	
*	func name	:	LQueue_Dequeue
*	function	:	对链式队列进行头部删除操作,称为出队
*	argument	:	
*					@Head
*	retval		:	DataType_t
*	note		:	None
*	author	 	:	cnzycwp@126.com
*	data  	 	:	2024/04/26
* 	
*
* ****************************************************************************************************************/
//出队(头删)
DataType_t LQueue_Dequeue(LQueue_t *Head)
{
    DataType_t temp = 0;

    //1.判断当前链式队列是否为空,为空则直接退出
	if (Head->next == NULL)
	{
		printf("current linkedqueue is empty!\n");
		return -1;
	}

    //2.如果当前链式队列为非空,则删除当前链式队列的头结点
    LQueue_t *Phead = Head->next;       //备份头结点地址

    Head->next = Head->next->next;      //把头结点的next指针指向首结点的直接后继

    Phead->next = NULL;                 //把首结点的next指针指向NULL

    temp = Phead->data;                 //出队首结点的数据域

    return temp;
}

/*****************************************************************************************************************
*	
*	func name	:	LQueue_Print
*	function	:	遍历链式队列的元素
*	argument	:	
*					@Head
*	retval		:	void
*	note		:	None
*	author	 	:	cnzycwp@126.com
*	data  	 	:	2024/04/26
* 	
*
* ****************************************************************************************************************/
//遍历链式队列的元素
void LQueue_Print(LQueue_t *Head)
{
	//对链式队列的头文件的地址进行备份
	LQueue_t *Phead = Head;
	
	//判断头结点的next指针是否指向NULL,若next指针指向NULL则退出
	while(Phead->next)
	{
		//把队列头结点的直接后继作为新的队列头结点
		Phead = Phead->next;

		//输出队列现在头结点的数据域
		printf("%d->",Phead->data);
	}

}


int main(int argc, char const *argv[])
{
	LQueue_t *Head = LQueue_Create();

    //入队
    LQueue_Enqueue(Head,1);
    LQueue_Enqueue(Head,20);
    LQueue_Enqueue(Head,3);
    LQueue_Enqueue(Head,5);
    LQueue_Enqueue(Head,85);
    LQueue_Print(Head);
    printf("\n");
	printf("\n");

    //出队
    printf("%d\n",LQueue_Dequeue(Head));
    printf("%d\n",LQueue_Dequeue(Head));
    printf("\n");

    //遍历
    LQueue_Print(Head);
    printf("\n");


	return 0;
}

4.结果验证:

以链表为基础实现链式队列文章来源地址https://www.toymoban.com/news/detail-859145.html

到了这里,关于以链表为基础实现链式队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Java 数据结构篇-用链表、数组实现队列(数组实现:循环队列)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍   文章目录         1.0 队列的说明         1.1 队列的几种常用操作         2.0 使用链表实现队列说明         2.1 链表实现队列         2.2 链表实现队列 - 入栈操作         2.3 链表实现队

    2024年02月05日
    浏览(40)
  • AcWing 算法基础课二 数据结构 链表 栈 队列 并查集 哈希表

    链表题目:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 AcWing. 826.单链表 双链表 AcWing 827.双链表 AcWing 828.模拟栈 AcWing 3302.表达式求值 AcWing 829. 模拟队列 AcWing 830.单调栈 AcWing 154.滑动窗口 AcWing 831. KMP字符串 AcWing 835. Trie字符串统计 AcWing 143. 最大异或对 AcWing 836.合并集合

    2024年02月15日
    浏览(50)
  • 数据结构--队列的链表实现

    初始化 判断队列是否为空 入队 初始化 判断队列是否为空 入队 队满 链式存储――一般不会队满,除非内存不足

    2024年02月11日
    浏览(48)
  • 数据结构:队列(链表和数组模拟实现)

    目录 1.何为队列 2.链表模拟实现 2.1 节点和队列创建 2.2 初始化队列 2.3 入队操作 2.4 出队操作 2.5 遍历队列 2.6 获取队首和队尾元素 2.7 判断队列是否为空 2.8 完整实现 3. 数组模拟实现 3.1 创建队列 3.2 入队和出队操作 3.3 遍历队列 3.4 获取队首和队尾元素  3.5 判断队列是否为空

    2024年02月03日
    浏览(54)
  • 数据结构(4) 链表(链式存储)

    顺序表优点:可随机存取,存储密度高,缺点:要求大片连续空间,改变容量不方便。 单链表优点:不要求大片连续空间,改变容量方便,缺点:不可随机存取,要耗费一定空间存放指针。 定义单链表的代码: 定义数据领和指针域 定义一个新节点 定义typedef来缩短函数书写

    2024年02月22日
    浏览(43)
  • 十、数据结构——链式队列

    一、链式队列的定义 二、链式队列的实现 三、链式队列的基本操作 ①初始化 ②判空 ③入队 ④出队 ⑤获取长度 ⑥打印 四、循环队列的应用 五、总结 六、全部代码 七、结果 在数据结构中,队列(Queue)是一种常见的线性数据结构,遵循先进先出(First In First Out,FIFO)的原

    2024年02月07日
    浏览(33)
  • 【脚踢数据结构】队列(顺序和链式)

    (꒪ꇴ꒪ ),Hello我是 祐言QAQ 我的博客主页:C/C++语言,Linux基础,ARM开发板,软件配置等领域博主🌍 快上🚘,一起学习,让我们成为一个强大的攻城狮! 送给自己和读者的一句鸡汤🤔: 集中起来的意志可以击穿顽石! 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏

    2024年02月12日
    浏览(38)
  • C++数据结构与算法详解:链表、栈、队列、树、二叉树和图结构的实现与应用

    链表是一种常见的数据结构由一系列节点按顺序连接而成,一般每个节点包含一个数据元素和一个指向下一个节点的引用。 链表有多种类型: 单向链表:每个节点只有一个指向下一个节点的引用 双向链表:每个节点有一个指向前一个节点和一个指向后一个节点的引用 循环链

    2024年02月04日
    浏览(52)
  • 【玩转408数据结构】线性表——双链表、循环链表和静态链表(线性表的链式表示 下)

            在前面的学习中,我们已经了解到了链表(线性表的链式存储)的一些基本特点,并且深入的研究探讨了单链表的一些特性,我们知道,单链表在实现插入删除上,是要比顺序表方便的,但是,单链表中每个结点仅存在一个指针指向其后续结点,那么如果我们想要找

    2024年04月10日
    浏览(61)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包