不要犹豫,直接复制就能通过,给力的话点个关注吧!
/*************************************************************
date: March 2021
copyright: Bei Gua (北瓜)
DO NOT distribute this code.
**************************************************************/
// 队列的链接存储实现文件
// 采用循环链表,具有附加头节点,使用尾结点指针
// CLQ_ Circularly Linked Queue
#include <stdio.h>
#include <stdlib.h>
#include "CLnkQueue.h"
LNode* CLQ_Create()
// 创建一个队列
{
LNode* rear=(LNode*)malloc(sizeof(LNode));
rear->data = 0;
rear->next = rear;
return rear;
}
void CLQ_Free(LNode* rear)
// rear指向尾结点
{
CLQ_MakeEmpty(rear);
free(rear);
}
void CLQ_MakeEmpty(LNode* & rear)
// rear指向尾结点
// 将队列变为空队列
{
T item;
while(!CLQ_IsEmpty(rear))
CLQ_Out(rear,item);
}
bool CLQ_IsEmpty(LNode* rear)
// 判断队列是否为空
{
return rear==rear->next;
}
int CLQ_Length(LNode* rear)
// 返回队列长度,rear指向尾结点
{
/********** Begin *********/
if(rear == NULL) return 0;
if(rear == rear->next) return 0; // empty queue
LNode* p = rear->next->next;
int count = 0;
while (p != rear->next) {
count++;
p = p->next;
}
return count;
/********** End **********/
}
void CLQ_In(LNode* &rear, T x)
// 入队列, 新结点加入链表尾部。rear指向尾结点
{
/********** Begin *********/
LNode* newNode = (LNode*)malloc(sizeof(LNode));
newNode->data = x;
newNode->next = rear->next;
rear->next = newNode;
rear = newNode; // update rear to new node
/********** End **********/
}
bool CLQ_Out(LNode* &rear, T& item)
// 出队列。空队列时,返回值为false。rear指向尾结点
//由item带回出队列的值
{
/********** Begin *********/
if (rear == rear->next) return false; // empty queue
LNode* head = rear->next->next;
item = head->data;
rear->next->next = head->next; // skip head node
if(head == rear) { // only one node in queue
rear = rear->next; // set rear to dummy head
}
free(head); // delete head node
return true;
/********** End **********/
}