单向链表队列程序接口设计

目录


单向链表构建队列的接口函数

/********************************************************************************************************
*
*
* 该程序实现链表队列元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以链表队列中元素
* 的数据类型为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;
}
posted @ 2024-04-26 23:48  52017  阅读(13)  评论(0编辑  收藏  举报