首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >动态开辟空间的单链表式队列的实现

动态开辟空间的单链表式队列的实现

作者头像
绝活蛋炒饭
发布2024-12-16 15:47:51
发布2024-12-16 15:47:51
1510
举报
文章被收录于专栏:绝活编程学习绝活编程学习

1.数据的封装

代码语言:javascript
复制
typedef int QDataType;
// 链式结构:表示队列
typedef struct QListNode
{
	struct QListNode* _next; // 下一个结点的指针
	QDataType _data; // 数据域
} QNode;

// 队列的结构
typedef struct Queue
{
	QNode* _front; // 队头
	QNode* _rear; // 队尾
	int sz; // 队列中元素的个数
} Queue;

2.初始化队列

代码语言:javascript
复制
// 初始化队列
void QueueInit(Queue* q)
{
	// 创建一个头结点
	QNode* headNode = (QNode*)malloc(sizeof(QNode));
	if (headNode == NULL)
	{
		perror("malloc");
		exit(-1);
	}
	q->_front = headNode; // 头指针指向头结点
	q->_rear = headNode; // 尾指针指向头结点
	q->sz = 0; // 队列中元素个数初始化为0
}

3.队尾入队列

代码语言:javascript
复制
// 队尾入队列
void QueuePush(Queue* q, QDataType data)
{
	// 创建一个新的结点
	QNode* newNode = (QNode*)malloc(sizeof(QNode));
	if (newNode == NULL)
	{
		perror("malloc");
		exit(-1);
	}
	newNode->_data = data; // 新结点的数据域赋值为传入的数据
	newNode->_next = NULL; // 新结点的指针域初始化为NULL

	q->_rear->_next = newNode; // 将新结点插入到队尾
	q->_rear = newNode; // 更新尾指针

	q->sz++; // 队列中元素个数加1
}

4.队头出队列

代码语言:javascript
复制
// 队头出队列
void QueuePop(Queue* q)
{
	if (q->_front->_next == NULL)
	{
		printf("队列为空");
		
	}
	else
	{
		QNode* cur = q->_front->_next; // 指向队头结点

		q->_front->_next = cur->_next; // 头结点的指针域指向队头结点的下一个结点

		if (q->_rear == NULL)//防止在删除了一个元素后队列变成空队列,导致尾指针_rear变成空指针导致野指针的出现
		{
			q->_rear = q->_front;
		}
		free(cur); // 释放队头结点的内存

		q->sz--; // 队列中元素个数减1

	}
}

5.获取队列头部元素

代码语言:javascript
复制
// 获取队列头部元素
QDataType QueueFront(Queue* q)
{
	return q->_front->_next->_data; // 返回队头元素的值
}

6.获取队列队尾元素

代码语言:javascript
复制
// 获取队列队尾元素
QDataType QueueBack(Queue* q)
{
	return q->_rear->_data; // 返回队尾元素的值
}

7.获取队列中有效元素个数

代码语言:javascript
复制
// 获取队列中有效元素个数
int QueueSize(Queue* q)
{
	return q->sz; // 返回队列中元素的个数
}

8.检测队列是否为空

代码语言:javascript
复制
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
int QueueEmpty(Queue* q)
{
	return q->sz == 0; // 如果队列为空,返回1;否则返回0
}

9.销毁队列

代码语言:javascript
复制
// 销毁队列
void QueueDestroy(Queue* q)
{
	QNode* cur = q->_front->_next; // 指向队头结点
	while (cur != NULL)
	{
		QNode* next = cur->_next; // 指向下一个结点
		free(cur); // 释放当前结点的内存
		cur = next; // 移动到下一个结点
	}
	q->sz = 0; // 元素个数置为0
	q->_front = NULL; // 头指针置空
	q->_rear = NULL; // 尾指针置空
}

10.打印队列

代码语言:javascript
复制
// 打印队列
void QueuePrint(Queue* q)
{
	QNode* cur = q->_front->_next; // 指向队头结点
	while (cur != NULL)
	{
		printf("%d->", cur->_data); // 打印当前结点的数据
		cur = cur->_next; // 移动到下一个结点
	}
	printf("NULL");
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.数据的封装
  • 2.初始化队列
  • 3.队尾入队列
  • 4.队头出队列
  • 5.获取队列头部元素
  • 6.获取队列队尾元素
  • 7.获取队列中有效元素个数
  • 8.检测队列是否为空
  • 9.销毁队列
  • 10.打印队列
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档