其他分享
首页 > 其他分享> > 数据结构第六篇:线性表之链式队列

数据结构第六篇:线性表之链式队列

作者:互联网

文章目录

前言

今天就来盘它,队列。

一 什么是队列

队列不难,也是线性表之中的一种,队列 队列 就是一种类似与去饭堂排队打饭的结构,先来先打到饭。队列就是元素先入队的就先出队,也就是先进先出。就很简单。


1. 链式队列

1)链队的存储结构

结构很重要,需要记住。

#define Elemtype int
//链队的节点
typedef struct QueueNode
{
   Elemtype date;
   struct QueueNode* next;
}QueueNode;
//为了方便入队和出队,我们给其分别定义了一个指向第一个节点的front指针,和指向最后一个节点的tail指针。
typedef struct LinkQueue
{
   QueueNode* front;
   QueueNode* tail;
}LinkQueue;

在这里插入图片描述
这里创建了结构出来,定义了链队的变量Q,由于没有初始化,里面的值都是随机值。所以我们首先想到的就是初始化链队。

2)初始化链队

void InitQueue(LinkQueue* Q)
{	 //申请了一个头节点,来初始化链队
	QueueNode* head = (QueueNode*)malloc(sizeof(QueueNode));
	assert(head);
	Q->front = head;
	Q->tail = head;
	Q->tail->next = NULL;
}

在这里插入图片描述


3) 入队

入队其实和单链表的尾插没啥区别。不行你看看

void EnQueue(LinkQueue* Q, Elemtype x) //单链表的尾插就是入队
{	//创建新节点进行入队准备
	QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
	assert(newNode);
	newNode->date = x;
	newNode->next = NULL;
	
	Q->tail->next = newNode; //入队(尾插)
	Q->tail = newNode; //保持尾指针指向尾节点
}

在这里插入图片描述
为了显示清楚的,可以看输出到屏幕的结果:

4)显示结果

void ShowQueue(LinkQueue* Q) //打印链队相当于遍历链队
{
	QueueNode* cur = Q->front->next; //指向队列的第一个有数据的节点
	printf("front>:");
	while (cur != NULL)
	{
		printf("%d ", cur->date);
		cur = cur->next;
	}
	printf("<:tail.\n");
}

测试结果:
在这里插入图片描述


5) 出队

void DeQueue(LinkQueue* Q)
{
	if (Q->front == Q->tail) //表示为空队列
	{
		return;
	}
	QueueNode* cur = Q->front->next; //指向有数据的第一个节点
	Q->front->next = cur->next;  //出队,也是删除头节点
	free(cur); 
	if (cur == Q->tail) //如果删除的是尾节点,则为空队列
		Q->tail = Q->front;	
}

6)获取队头元素

void GetQueue(LinkQueue* Q,Elemtype* x)
{
	if (Q->front == Q->tail)
		return;
	QueueNode* newNode = Q->front->next;
	*x = newNode->date;
	//出队后,保证下次的队头元素是出对前的下一位
	// 类如:1  2  3  4  出队后是 2  3  4 对头由原来的 1 变成 2;
	Q->front->next = newNode->next; 
	if (Q->tail == newNode) //判断队尾是否为队头
		Q->tail = Q->front; 
		free(newNode);
}

通过指针x来返回获取的队头元素。
测试结果:
在这里插入图片描述


7)求队列长度

int LenQueue(LinkQueue* Q)
{
	int len = 0;
	QueueNode* cur = Q->front->next; 
	while (cur) 
	{
		len++;
		cur = cur->next;
	}
	return len;
}

8)清除队列

void ClearQueue(LinkQueue* Q) //一直删头节点的下一个数据即可
{
	if (Q->front == Q->tail) //队列为空不清除
		return;
	QueueNode* cur = Q->front->next; //cur指向第一个节点
	while (cur)
	{
		Q->front->next = cur->next;
		free(cur);
		cur = Q->front->next;
	}//退出循环后,保证头节点指向尾节点
	Q->front = Q->tail;
}

总结

都是一些基本操作,不过很重要哇。
链式队列到此结束,接下来会分享顺序队列和循环队列。

标签:cur,队列,第六篇,next,tail,front,数据结构,QueueNode,线性表
来源: https://blog.csdn.net/m0_46606290/article/details/117734203