数据结构第六篇:线性表之链式队列
作者:互联网
文章目录
前言
今天就来盘它,队列。
一 什么是队列
队列不难,也是线性表之中的一种,队列 队列 就是一种类似与去饭堂排队打饭的结构,先来先打到饭。队列就是元素先入队的就先出队,也就是先进先出。就很简单。
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