C语言 详解链式存储队列

链式存储队列

什么使链式存储队列呢?说白了就是一个受到操作限制的链表,只能在链表的头结点进行删除结点,也只能在链表的尾结点进行插入结点,且不能在中间进行插入删除操作,你以为限制到此就结束了吗?但还差一样东西哦,它比不同的链表多了一个游标指针,且分别命名为头指针,尾指针如图:
在这里插入图片描述
Q.front=Q.rear时表示队列为空

如果对你有所帮助,点个赞呗

实现代码

结构体

typedef struct LinkNode
{
	int data;
 struct	LinkNode* next;//指向下一个结点
}LinkNode;//队列结点

typedef struct LinkQueue
{
	struct	LinkNode* front;//头指针
	struct	LinkNode* rear;//尾指针
}LinkQueue;

实现功能代码

初始化

int  InitQueue(LinkQueue *Q)
{
	/*
	参数:队列的首地址
	函数功能:初始化队列(带头结点的队列)
	*/
	Q->front = (LinkNode*)malloc(sizeof(LinkNode));//动态申请空间让Q.front与Q.reat指向同一个空间
	if (Q->front == NULL)
	{
		return -1;//如果初始化失败返回-1
	}
	Q->rear = Q->front;//使头指针和尾指针指向同一节点
	Q->rear->next = NULL;
	Q->front->next = NULL;
	return 0;
}
//初始化队列

让Q.front与Q.rear指向同一个结点如图
在这里插入图片描述

入队

int  EndQueue(LinkQueue *Q,int Value)
{
	/*
	第一个参数:队列首地址
	第二个参数:入队值
	函数功能:入队
	*/
	LinkNode *N;
	N = (LinkNode*)malloc(sizeof(LinkNode));
	N->data = Value;
	N->next = Q->rear->next;//利用尾插法使尾指针移动
	Q->rear->next = N;
	Q->rear = N;
	return ;
}

入队的时候我们让尾指针移动,头指针保持不变,让尾指针利用尾插法插入结点,如图
在这里插入图片描述

出队

int DeleteQueue(LinkQueue *Q)
{
	/*
	参数:队列首地址
	函数功能:出队
	*/
	if (Q->front == Q->rear)
	{
		return -1;//若链表为空则返回
	}
	LinkNode *N;
	int Value;
	N = Q->front->next;
	Q->front->next = N->next;
	if (Q->rear == N)//如果只剩一个结点则使尾结点和头节点指向同一个结点
	{
		Q->rear = Q->front;
	}
	Value = N->data;
	free(N);
	return Value;
}

我们在出队的时候让头指针移动,删除头结点如图所示
在这里插入图片描述

获取头结点

int GetHead(LinkQueue *Q)
{
	return Q->front->next->data;
}

运行截图

在这里插入图片描述

欢迎大家在评论区赐教,谢谢

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~搬~运~工~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值