因为队列比较简单,关于队列概念就不过多赘述了,本文只讲链队的基本操作实现

队列定义

定义队列结点结构

typedef int QDataType;

//对列中每个结点结构
typedef struct QListNode
{
	QDataType data;				//数据
	struct QListNode* next;		//指针
}QNode;

定义队列

// 队列的结构 
typedef struct Queue
{
	int size;		//元素个数
	QNode* head;	//队头指针
	QNode* tail;	//队尾指针
}Queue;

初始化队列

// 初始化队列 
void QueueInit(Queue* q)
{
	assert(q);

	q->head = q->tail = NULL;	//队头尾指针都置空
	q->size = 0;				//队内元素个数置空
}

队尾入队列

链队在入队时有两种情况

  1. 队列内无元素:同时让队头和队尾指针指向结点
  2. 队列内有元素:让队尾结点指针存储结点地址,将新插入结点更新为尾结点。

在这里插入图片描述

// 队尾入队列 
void QueuePush(Queue* q, QDataType data)
{
	assert(q);

	//创建新结点
	QNode* newnode = (QNode*)malloc(sizeof(QNode));

	if (NULL == newnode)
	{
		perror("malloc");
		exit(-1);
	}

	newnode->data = data;				//将数据插入新结点数据域
	newnode->next = NULL;				//将新结点指针域置空

	if (NULL == q->tail)				//当前队列没有结点
	{
		q->head = q->tail = newnode;	//队头队尾的指针域同时指针新结点
	}
	else								//当前队列中有结点
	{
		q->tail->next = newnode;		//队尾结点指针域指向新结点
		q->tail = newnode;				//将插入的结点更新为尾结点
	}

	q->size++;							//队列内有效元素个数 + 1
}

队头出队

队头出队列就是删除队头元素,在删除队头元素时有两种情况。

  1. 删除的是最后一个元素删除该结点时头指针会往后走到 NULL 的位置,此时必须也将队尾指针也置空,否则队尾指针就成野指针了。

在这里插入图片描述

  1. 删除的非最后一个元素保存队头的地址然后将队头指针指向下一个结点,最后释放队头。

在这里插入图片描述

// 队头出队
void QueuePop(Queue* q)
{
	assert(q);
	assert(q->head);			//队列不为空

	QNode* delete = q->head;	//保存删除的队头结点的地址
	q->head = q->head->next;	//头指针走向下一个结点
	free(delete);				//删除队头结点
	delete = NULL;	

	if (NULL == q->head)		//前面删除的是最后一个元素
	{
		q->tail = NULL;			//尾指针也置空
	}

	q->size--;					//队内元有效元素个数 -1
}

取队头元素

// 获取队列头部元素 
QDataType QueueFront(Queue* q)
{
	assert(q);
	assert(q->head);

	return q->head->data;	//返回队头结点的数据域内容
}

取队尾元素

// 获取队列队尾元素 
QDataType QueueBack(Queue* q)
{
	assert(q);
	assert(q->tail);		//队列不为空

	return q->tail->data;	//返回队尾结点的数据域内容
}

获取队列有效元素个数

// 获取队列中有效元素个数 
int QueueSize(Queue* q)
{
	assert(q);

	return q->size;
}

判断队空

int QueueEmpty(Queue* q)
{
	assert(q);

	return 0 == q->size;	//表达式成立则结果为真,反之为假
}

销毁队列


// 销毁队列 
void QueueDestroy(Queue* q)
{
	assert(q);

	QNode* cur = q->head;			//cur 先指向队头

	while (NULL != cur)
	{
		QNode* next = cur->next;	//保存下一个结点
		free(cur);					//删除当前结点
		cur = next;					//指向下一个结点
	}

	q->head = q->tail = NULL;		//队头尾指针都置空
	q->size = 0;
}

原文地址:https://blog.csdn.net/shangguanxiu/article/details/134645987

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_17027.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注