单向链表队列程序接口设计
目录
目录
单向链表构建队列的接口函数
/********************************************************************************************************
*
*
* 该程序实现链表队列元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以链表队列中元素
* 的数据类型为DataType_t,用户可以根据实际情况修改链表队列中元素的类型。
*
* 另外,为了方便管理链表队列,所以用户设计SeqList_t结构体,该结构体中包含三个成员:地址+容量+有效元素的下标
*
*
*
* Copyright (c) 2023-2024 17666589210@136.com All right Reserved
* ******************************************************************************************************/
/*******************************************************************
*
* 文件名称: 单向链表构建队列的接口函数
* 文件作者: 17666589210@163.com
* 创建日期: 2024/04/26
* 文件功能: 对单链表循环队列的增删改查功能的定义
* 注意事项: None
*
* CopyRight (c) 2024 mailLinL@163.com All Right Reseverd
*
* *****************************************************************/
库函数的调用
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
指的是链表队列中的元素的数据类型,用户可以根据需要进行修改
typedef int DataType_t;
构造记录链表队列LinkQueueNode各项参数(链表队列结点的指针指向的下一个结点地址 + 链表队列的结点数据)的结构体
typedef struct LinkQueueNode
{
struct LinkQueueNode * next; //记录链表队列下一个地址
DataType_t data; //记录链表队的数据域
}LQNode_t;
构造记录链表队列LinkQueue各项参数(链表队列的队首地址 + 链表队列的队尾地址)的结构体
typedef struct LinkQueue
{
LQNode_t * front; //记录链表队列队首地址
LQNode_t * rear; //记录链表队列队尾地址
}LQueue_t;
创建单链表空队列
/*******************************************************************
*
* 函数名称: LinkQueue_Create
* 函数功能: 创建单链表空队列
* 函数参数: none
* 返回结果:
* @Head 空队列的管理结构体地址
* 注意事项: None
* 函数作者: 17666589210@163.com
* 创建日期: 2024/04/26
* 修改历史:
* 函数版本: V1.0
* *****************************************************************/
//创建空链表队列并对链表队列进行初始化
LQueue_t * LinkQueue_Create(void)
{
// 1.创建一个头结点并对头结点申请内存
LQueue_t *Head = (LQueue_t *)calloc(1, sizeof(LQueue_t));
if (NULL == Head)
{
perror("Calloc memory for Head is Failed");
exit(-1);
}
//2.对链表队列的头结点进行初始化(链表队列队首指针域 + 队尾指针域)
Head->rear = NULL; //队尾地址为NULL
Head->front = NULL; //队首地址为NULL
return Head;
}
创建新的结点
/*******************************************************************
*
* 函数名称: LinkQueueNewnode_Create
* 函数功能: 入队 向链表队列的尾部进行插入操作
* 函数参数:
* @data 新结点数据域的数据
* 返回结果:
* @New 新结点的地址
* 注意事项: None
* 函数作者: 17666589210@163.com
* 创建日期: 2024/04/26
* 修改历史:
* 函数版本: V1.0
* *****************************************************************/
// 创建新的结点,并对新结点进行初始化(数据域 + 指针域)
LQNode_t * LinkQueueNewnode_Create(DataType_t data)
{
//1.利用calloc为链表队列的新结点申请一块堆内存
LQNode_t * New = (LQNode_t *)calloc(1,sizeof(LQNode_t));
if(NULL == New)
{
perror("calloc memory for Newnode is failed");
exit(-1); //程序异常终止
}
//2.对需要进队的新结点进行初始化(链表队列数据域 + 储存下一个结点指针域)
New->next = NULL;
New->data = data;
return New;
}
判断链式队列是否为空的函数
/*******************************************************************
*
* 函数名称: LinkQueue_IsEmpty
* 函数功能: 检查当前队列是否为空
* 函数参数:
* @data 新结点数据域的数据
* 返回结果:
* @bool true为空,false为不空
* 注意事项: None
* 函数作者: 17666589210@163.com
* 创建日期: 2024/04/26
* 修改历史:
* 函数版本: V1.0
* *****************************************************************/
//判断链式队列是否为空
bool LinkQueue_IsEmpty(LQueue_t *Head)
{
// 当头结点结构体中的队首队尾指针都指向NULL时 表示队列中没有结点
return (Head->front == NULL && NULL == Head->rear) ? true : false;
}
入队函数的设计
//入队
/*******************************************************************
*
* 函数名称: LinkQueue_Enqueue
* 函数功能: 入队 向链表队列的尾部进行插入操作
* 函数参数:
* @Head 队列管理结构体的地址
* @data 入队结点数据域的值
* 返回结果:
* @Head 返回入队操作后管理结构体的地址
* 注意事项: None
* 函数作者: 17666589210@163.com
* 创建日期: 2024/04/26
* 修改历史:
* 函数版本: V1.0
* *****************************************************************/
LQueue_t* LinkQueue_Enqueue(LQueue_t * Head, DataType_t data)
{
//申请新结点进行入队
LQNode_t * New = LinkQueueNewnode_Create(data);
//判断链式队为空时
if(LinkQueue_IsEmpty(Head))
{
Head->front = New;
Head->rear = New;
}
else
{
Head->rear->next = New;
Head->rear = New;
}
printf("%d Enqueue successful\n",data);
return Head;
}
出队函数的设计
//出队
/*******************************************************************
*
* 函数名称: LinkQueue_Dequeue
* 函数功能: 出队 向链表队列的头部进行删除操作
* 函数参数:
* @Head 队列管理结构体的地址
* 返回结果:
* @bool 返回出队操作后成功与否
* 注意事项: None
* 函数作者: 17666589210@163.com
* 创建日期: 2024/04/26
* 修改历史:
* 函数版本: V1.0
* *****************************************************************/
bool LinkQueue_Dequeue(LQueue_t *Head)
{
if (LinkQueue_IsEmpty(Head))
{
printf("LinkQueue is Empty!\n");
return false;
}
//2.把数据从队尾出队,并备份到变量temp
LQNode_t * Phead = Head->front;
DataType_t temp = 0;
if(Head->front->next == NULL)
{
temp = Head->front->data; //备份当前结点的数据
Head->front = NULL; //对队头指向NULL进行初始化
Head->rear = NULL; //对队尾指向NULL进行初始化
free(Phead);
}
else
{
temp = Head->front->data; //备份当前结点的数据
Head->front = Head->front->next; //当前队头指向下一个结点
Phead->next = NULL; //需要出队头结点的执行NULL
free(Phead); //释放出队头结点的空间
}
printf("Dequeued element: %d\n", temp);
return true;
}
/*******************************************************************
*
* 函数名称: size
* 函数功能: 输出当前入队元素的数量
* 函数参数:
* @Head 队列管理结构体的地址
* 返回结果:
* @DataType_t 返回入队元素的数量
* 注意事项: None
* 函数作者: 17666589210@163.com
* 创建日期: 2024/04/26
* 修改历史:
* 函数版本: V1.0
* *****************************************************************/
// 获取队列中元素的数量
int size(LQueue_t* Head)
{
int count = 0;
LQNode_t * current = Head->front;
while (current != NULL)
{
count++;
current = current->next;
}
return count;
}
//(验证函数是否正确入队和出队)
int main(int argc, char const *argv[])
{
LQueue_t * Queue = LinkQueue_Create() ;
LinkQueue_Enqueue(Queue,10);
LinkQueue_Enqueue(Queue,20);
LinkQueue_Enqueue(Queue,30);
printf("Head size: %d\n", size(Queue)); // 输出: 3
LinkQueue_Dequeue(Queue);
LinkQueue_Dequeue(Queue);
LinkQueue_Dequeue(Queue);
LinkQueue_Dequeue(Queue);
return 0;
}