当前位置: 首页 > article >正文

考研篇——数据结构王道3.2.3_队列的链式实现

目录

  • 1.链队列
  • 2.代码实现
    • 2.1 带头结点
    • 2.2 不带头结点
  • 总结

1.链队列

队列是一种线性结构,线性是指其在逻辑结构,上一节我们顺序存储实现队列,这次链式存储实现队列。与单链表的实现不同的是,只能在表头删除,表尾插入。

2.代码实现

2.1 带头结点

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LinkNode {
	ElemType data;
	struct LinkNode* next;
}LinkNode;
typedef struct {
	LinkNode* front, * rear;
	//int size;//如果频繁使用队列长度的话,考虑增加变量size记录,否则每遍历的时间复杂度是O(n)
}LinkQueue;
//带头结点
void InitQueue(LinkQueue& Q)
{
	Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
	if (Q.front == NULL)
		return;
	Q.front->next = NULL;
}
bool IsEmpty(LinkQueue Q)
{
	if (Q.front == Q.rear)//Q.front->next==NULL
		return true;
	else
		return false;
}
void EnQueue(LinkQueue& Q, ElemType x)
{
	LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
	if (s == NULL)
		return;
	s->next = NULL;
	s->data = x;
	Q.rear->next = s;
	Q.rear = s;
}
bool DeQueue(LinkQueue& Q, ElemType& x) {
	if (Q.front == Q.rear)
		return false;
	LinkNode* s = Q.front->next;
	x = s->data;
	Q.front->next = s->next;
	if (Q.rear == s)
		Q.rear = Q.front;
	free(s);
	return true;
}

2.2 不带头结点

与代码2.1相同的部分省略

//不带头结点
void InitQueue1(LinkQueue &Q)
{
	Q.front = Q.rear = NULL;
}
bool IsEmpty1(LinkQueue Q)
{
	if (Q.front == NULL)//Q.rear==NULL
		return true;
	else
		return false;
}
void EnQueue1(LinkQueue& Q, ElemType x)
{
	LinkNode* s= (LinkNode*)malloc(sizeof(LinkNode));
	if (s == NULL)
		return;
	s->next = NULL;
	s->data = x;
	if (Q.rear == NULL)
		Q.front = Q.rear = s;//不带头结点,第一个元素入队时单独处理,与后续元素入队不同的是,要更改头指针的指向
	else {
		Q.rear->next = s;
		Q.rear = s;
	}
}
bool DeQueue1(LinkQueue& Q, ElemType& x) {
	if (Q.front == Q.rear)
		return false;
	LinkNode* p = Q.front;
	x = p->data;
	Q.front = p->next;
	if (Q.rear == p)
		Q.rear = Q.front=NULL;
	free(p);
	return true;
}

总结

链式存储实现的队列与顺序存储相比,好处在于,顺序存储的空间是预分配的,一旦满了就不能再插入。但链式存储一般不存在队满的情况,除非内存不足。
在书写代码时,思考不带头结点与带头节点在操作上的区别,是否单独处理要分情况。


http://www.kler.cn/news/363320.html

相关文章:

  • zh/FAQ/CentOSStream-CentOS Stream 常见问题
  • vue-element-admin顶部导航栏的修改
  • 后端C++
  • Qt中使用线程之QRunnable
  • 论当前的云计算
  • 【LLM之Agent】《Tool Learning with Large Language Models: A Survey》论文阅读笔记
  • 2025年考PMP大概需要多少钱?提前了解!
  • 【计算机网络 - 基础问题】每日 3 题(四十六)
  • MBI6665Q聚积升降压LED驱动芯片车规级AEC-Q100认证
  • 从0开始深度学习(15)——权重衰退法(L2正则化)
  • 5. AOP
  • 口含烟贴纸设计公司哪家好?
  • docker之redis安装(项目部署准备)
  • 从 0 开发一个系统
  • 渗透测试+oneforall+nmap+zenmap+7kbscan+dic+pkav+御剑+netcat
  • 吴伟仁《英国文学史及选读》第一二册课后答案PDF
  • 基于vue框架的的高校设备信息管理系统的设计与实现tx6d7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • Python | Leetcode Python题解之第496题下一个更大元素I
  • NCU-机器学习-作业4:基于XGboost的收入分类预测
  • 我记不住的那些表达式求值
  • 决策树与随机森林在分类问题中的应用
  • 【C++】——多态(上)
  • Java 监听器示例(非界面)
  • 华为ICT题库-大数据部分
  • 【国潮来袭】华为原生鸿蒙 HarmonyOS NEXT(5.0)正式发布:鸿蒙诞生以来最大升级,碰一碰、小艺圈选重磅上线
  • 大模型干货 | 提示词工程十大技巧:释放大模型潜力的最佳工具