链式存储队列
什么使链式存储队列呢?说白了就是一个受到操作限制的链表,只能在链表的头结点进行删除
结点,也只能在链表的尾结点进行插入
结点,且不能在中间
进行插入删除操作,你以为限制到此就结束了吗?但还差一样东西哦,它比不同的链表多了一个游标指针,且分别命名为头指针
,尾指针
如图:
当Q.front=Q.rear
时表示队列为空
如果对你有所帮助,点个赞呗
实现代码
结构体
typedef struct LinkNode
{
int data;
struct LinkNode* next;//指向下一个结点
}LinkNode;//队列结点
typedef struct LinkQueue
{
struct LinkNode* front;//头指针
struct LinkNode* rear;//尾指针
}LinkQueue;
实现功能代码
初始化
int InitQueue(LinkQueue *Q)
{
/*
参数:队列的首地址
函数功能:初始化队列(带头结点的队列)
*/
Q->front = (LinkNode*)malloc(sizeof(LinkNode));//动态申请空间让Q.front与Q.reat指向同一个空间
if (Q->front == NULL)
{
return -1;//如果初始化失败返回-1
}
Q->rear = Q->front;//使头指针和尾指针指向同一节点
Q->rear->next = NULL;
Q->front->next = NULL;
return 0;
}
//初始化队列
让Q.front与Q.rear指向同一个结点如图
入队
int EndQueue(LinkQueue *Q,int Value)
{
/*
第一个参数:队列首地址
第二个参数:入队值
函数功能:入队
*/
LinkNode *N;
N = (LinkNode*)malloc(sizeof(LinkNode));
N->data = Value;
N->next = Q->rear->next;//利用尾插法使尾指针移动
Q->rear->next = N;
Q->rear = N;
return ;
}
入队的时候我们让尾指针移动,头指针保持不变,让尾指针利用尾插法插入结点,如图
出队
int DeleteQueue(LinkQueue *Q)
{
/*
参数:队列首地址
函数功能:出队
*/
if (Q->front == Q->rear)
{
return -1;//若链表为空则返回
}
LinkNode *N;
int Value;
N = Q->front->next;
Q->front->next = N->next;
if (Q->rear == N)//如果只剩一个结点则使尾结点和头节点指向同一个结点
{
Q->rear = Q->front;
}
Value = N->data;
free(N);
return Value;
}
我们在出队的时候让头指针移动,删除头结点如图所示
获取头结点
int GetHead(LinkQueue *Q)
{
return Q->front->next->data;
}