首页 > 编程语言 >单向链表队列程序接口设计

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

时间:2024-04-26 23:56:16浏览次数:30  
标签:Head 函数 队列 程序接口 LinkQueue 结点 链表

目录

目录


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

/********************************************************************************************************
*
*
* 该程序实现链表队列元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以链表队列中元素
* 的数据类型为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;
}

标签:Head,函数,队列,程序接口,LinkQueue,结点,链表
From: https://www.cnblogs.com/wh217/p/18161098

相关文章

  • 数据结构_链表_双向循环链表的初始化、插入、删除、修改、查询打印(基于C语言实现)
    版本:2024年4月26日V1.0发布于博客园/***@filename:DoubleLinkedList.c*@brief:实现双向循环链表的相关功能*@author:RISE_AND_GRIND@163.com*@date:2024/04/26*@version:1.0*@note:*CopyRight(c)2023-2024RISE_AND......
  • 链式队列
    以链表为基础实现链式队列/**********************************************************************************filename:Linked_Queues*author:yxw18679428019@163.com*date:2024/04/26*function:以链表为基础实现链式队列,一般把链表头......
  • 习题---利用两个栈实现队列的“入队”和“出队”
    利用两个栈进行实现队列的入队和出队操作题目:解题分析:​ 该题目需要借助两个栈来实现队列的“入队”和“出队”,并封装好了三个对应的函数。我们需要注意的是栈的特点是“先进后出",与队列的”先进先出“的输出并不一致。所以,我们要利用栈来输出正常排序的序列,需要借助类似取反......
  • 队列
    数据结构队列使用链表实现队列/***************************************************************************************filename:1.c*author: lu.ciana.598393@gmail.com*date:2024/04/26*function: 队*note :none*CopyRight......
  • 以链表为基础实现链式队列
    以链表为基础实现链式队列如果打算以链表作为基础来实现队列的操作,可以避免内存浪费以及避免内存成片移动,只需要确定队头和队尾即可,一般把链表头部作为队头,可以实现头删,把链表尾部作为队尾,可以实现尾插。#include<stdio.h>#include<stdbool.h>#include<stdlib.h>//对输入......
  • 双向循环链表
    双向循链表双向循环链表我是在双向循环链表上进行升级,就是双向循环链表首结点和尾结点相链接,首结点的prev链接尾结点本身,尾结点的next链接首结点本身,在对头部或者尾部操作的时候与双向链表有区别,具体代码写在下面。希望看完代码的你发现错误,请评论批评指正,非常感谢。目录双......
  • 自定义单链表队列的基本接口函数(非循环队列)
    单链表构建队列的接口函数/********************************************************************文件名称: 单链表构建队列的接口函数文件作者:mailLinL@163.com创建日期:2024/04/26文件功能:对单链表循环队列的增删改查功能的定义注意事项:NoneCop......
  • 单链表根据尾插法建立
    include<stdio.h>include<stdlib.h>typedefstructslik{intdata;structslik*next;}sli;voidcreatesli(sli**head,inta[],intsize){for(inti=0;i<size;i++){sli*s=(sli*)malloc(sizeof(sli));s->data=a[i];s->next=NULL......
  • 队列_单向链表
    利用单向链表设计一个队列,实现“先进先出”的功能​ 队列的两端都允许操作,只不过要求数据只能从队列的一端插入,从队列的另一端删除,可以把队列理解为一根水管,水管有进水口和出水口。​ 一般把允许数据插入的一端称为队尾(Tail或者Rear),一般把允许删除数据的一端称为队头队首(Head或......
  • 利用两个栈实现队列的入队出队以及判断队列是否为空
    boolenQueue(SeqStack_t*S1,SeqStack_t*S2,intx){DataType_ttemp=x;//判断S1是否满if(SeqStack_IsFull(S1)){//判断S2是空if(SeqStack_IsEmpty(S2))![image](uploading...){while(!SeqStack_IsEmpty......