数据结构之队列的实现

1.初始化

同之前文章,在这里不对前置操作进行说明,比如头文件,源文件等等,在此只说明代码功能的实现逻辑。

c 复制代码
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

不过在这里还要说明一点,由于在这里我们要修改指针,所以如果正常传参应该要传二级指针,不过我们在这里在此定义一个结构体用来存放我们要用的东西,这样既不用传二级指针使得代码繁琐,也更加方便操作,如下:

c 复制代码
typedef int	QDataType;
typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType val;
}QNode;

typedef struct Queue
{
	QNode* head;
	QNode* tail;
	int size;
}Queue;

初始化没什么好说的,过

2.销毁

c 复制代码
void QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* curr = pq->head;
	while (curr)
	{
		QNode* next = curr->next;
		free(curr);
		curr = next;
	}
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

这里的逻辑较为简单:

  • 用next来保存下一个节点
  • free掉当前节点
  • curr置为下一个节点依次循环

最后把头尾指针置为空即可。

3.插入

c 复制代码
void QueuePush(Queue* pq, QDataType data)
{
	assert(pq);
	QNode* newhead = (QNode*)malloc(sizeof(QNode));
	if (newhead == NULL)
	{
		perror("malloc fail");
		return;
	}
	newhead->next = NULL;
	newhead->val = data;
	//无节点
	if (pq->tail == NULL)
	{
		pq->head = pq->tail = newhead;
	}
	else
	{
		pq->tail->next = newhead;
		pq->tail = newhead;
	}
	pq->size++;
}
  • 首先判断新生成的节点是否有效
  • 接下来把数据的值插入到新生成节点中
  • 如果无节点,那么让头尾指针指向新节点
  • else,让尾指针连着新节点,让尾指针置为指向newhead
  • 最后size++即可

4.删除

c 复制代码
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->size != 0);
	QNode* next = pq->head->next;
	free(pq->head);
	pq->head = next;
	if (pq->head == NULL)
	{
		pq->tail = NULL;
	}
	pq->size--;
}
  • 用next指针保存下一个节点
  • free当前节点
  • 指向下一个节点
  • size--

5.获取队尾和对头数据

c 复制代码
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(pq->size != 0);
	return pq->head->val;
}

QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(pq->size != 0);
	return pq->tail->val;
}

很简单,没什么好说的。

6.获取元素个数

c 复制代码
int QueueSize(Queue* pq)
{
	assert(pq);
	return pq->size;
}

很简单。

7.判空

c 复制代码
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->size == 0;
}

同样没什么好说的。

相关推荐
小师兄吃牛肉9 小时前
C语言篇:内联函数
c语言·开发语言
嘎嘎风9 小时前
MiniMind 学习笔记之 07 模型怎么学会猜词(旋钮是怎么被拧动的)
算法·源码阅读
和裕10 小时前
定制纸箱刀模费全解析:费用定义与可减免合作场景
大数据·运维·网络·人工智能·算法
白山编程大哥10 小时前
C语言篇:语法进阶
c语言·数据结构·算法
Doubbbbbbble云10 小时前
基于流处理框架的实时算法实现策略4
算法
2601_9628857210 小时前
如何用 Python 计算 ROC 变动率指标做动量分析?
开发语言·python·算法
Logic10111 小时前
C语言/数据结构动态规划题解:爬楼梯(含坏台阶)——避开障碍物的路径计数
c语言·数据结构·动态规划·时间复杂度·空间复杂度·算法题·爬楼梯
胡家伟++11 小时前
我用 48 轮 AI 思维链做了一次研究战略推演:从“验证信号危机“到“验证栈“统一框架
人工智能·算法
山下梅子酒22511 小时前
洛谷-入门-B2081
c语言
朝朝辞暮i11 小时前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2