首页 > 其他分享 >队列

队列

时间:2024-04-26 22:13:58浏览次数:20  
标签:Head return 队列 LinkQueue LQueue 2024 next

数据结构

队列

使用链表实现队列

/*************************************************************************************
 *
 *  file name:  1.c
 *  author   : 	[email protected]
 *  date     :  2024/04/26
 *  function : 	队
 *  note	 :  none
 *  CopyRight (c)   2024    [email protected]   All Right Reserved
 *
 ************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef int DataType_t;
//创建空的循环队列,并对管理结构体进行初始化:容量、队尾下标、队首下标、首地址
typedef struct  LinkedQueue
{
	DataType_t 			data;
	struct LinkQueue	*next;
}LQueue_t;


LQueue_t *LinkQueue_Creat(unsigned int size)
{
	LQueue_t *Head = (LQueue_t *)calloc(1,sizeof(LQueue_t));
	if(NULL == Head)
	{
		perror("calloc memory for Head is failed");
		exit(-1); //程序异常终止
	}

	Head ->next = NULL;
	return Head;
}


LQueue_t * LStack_NewNode(DataType_t data)
{
	//1.创建一个新结点并对新结点申请内存
	LQueue_t *New = (LQueue_t *)calloc(1,sizeof(LQueue_t));
	if (NULL == New)
	{
		perror("Calloc memory for NewNode is Failed");
		return NULL;
	}

	//2.对新结点的数据域和指针域(2个)进行初始化
	New->data = data;
	New->next = NULL;

	return New;
}

/**
  * @name:		LinkQueue_IsEmpty
  * @brief  	判断顺序队是否为空
  * @param  
  				@Head
  * @retval 	bool
  * @date 		2024/04/26
  * @note   	补充 注意 说明
  */

bool LinkQueue_IsEmpty(LQueue_t *Head)
{
	return (Head->next == NULL)?true:false;
}
/**
  * @name:		LinkQueue_Enqueue
  * @brief  	入队
  * @param  
  				@Head
				@Data
  * @retval 	bool
  * @date 		2024/04/26
  * @note   	补充 注意 说明
  */
bool LinkQueue_Enqueue(LQueue_t *Head,DataType_t Data)
{
		LQueue_t *PHead = Head;

	LQueue_t *New = LStack_NewNode(Data);	
	//如果申请内存失败
	if (NULL == New)
	{
		perror("Calloc memory for NewNode is Failed");
		return false;
	}
	New->next = Head->next;
    Head->next = New;
	
	return true;
}
/**
  * @name:		LinkQueue_Dequeue
  * @brief  	出队
  * @param  
  				@Head
  * @retval 	bool
  * @date 		2024/04/26
  * @note   	补充 注意 说明
  */
DataType_t LinkQueue_Dequeue(LQueue_t *Head)
{
	if(LinkQueue_IsEmpty(Head))
	{
		printf("LinkQueue is Empty\n");
		return;
	}
	//对双向循环链表的头结点的地址进行备份
	LQueue_t *PHead = Head->next;
	// 	链表内只有一个节点
	if(PHead->next == NULL)
	{
		Head->next = NULL;
		free(PHead);
		return true;
	}
    Head->next = PHead->next;
    PHead->next = NULL;
	free(PHead);
	return true;
}
/**
  * @name:		LinkQueue_Print
  * @brief  	遍历
  * @param  
  				@Head
  * @retval 	void
  * @date 		2024/04/26
  * @note   	补充 注意 说明
  */
void LinkQueue_Print(LQueue_t *Head)
{
	//对单向循环链表的头结点的地址进行备份
	LQueue_t *Phead = Head;
	
	//判断当前链表是否为空,为空则直接退出
	if (Head->next == NULL)
	{
		printf("current linkeflist is empty!\n");
		return false;
	}

	//从首结点开始遍历
	while(Phead->next)
	{
		//把头结点的直接后继作为新的头结点
		Phead = Phead->next;

		//输出头结点的直接后继的数据域
		printf("data = %d\n",Phead->data);

		//判断是否到达尾结点,尾结点的next指针是指向首结点的地址
		if (Phead->next == NULL)
		{
			break;
		}	
	}
	return true;
}
//调用代码调试
int main()
{
	int i;
	LQueue_t * Head = LinkQueue_Creat(32);
		LinkQueue_Enqueue(Head,1);
		LinkQueue_Enqueue(Head,2);
		LinkQueue_Dequeue(Head);
		LinkQueue_Print(Head);

}

使用顺序表实现队列

/*************************************************************************************
 *
 *  file name:  1.c
 *  author   : 	[email protected]
 *  date     :  2024/04/26
 *  function : 	顺序队
 *  note	 :  none
 *  CopyRight (c)   2024    [email protected]   All Right Reserved
 *
 ************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef int DataType_t;
//创建空的循环队列,并对管理结构体进行初始化:容量、队尾下标、队首下标、首地址
typedef struct  LinkcularQueue
{
	DataType_t 		*Addr;
	unsigned int 	 Size;
	int 			 Rear;
	int 			 Front;
}LinkQueue_t;

LinkQueue_t *LinkQueue_Creat(unsigned int size)
{
	LinkQueue_t *Head = (LinkQueue_t *)calloc(1,sizeof(LinkQueue_t));
	Head ->Addr = (DataType_t *)calloc(size,sizeof(DataType_t));
	Head ->Size = size;
	Head ->Front = 0;
	Head ->Rear = 0;
	return Head;
}

/**
  * @name:	LinkQueue_IsFull
  * @brief  	判断顺序队是否已满
  * @param  
  			@Head
  * @retval 	bool
  * @date 	2024/04/26
  * @note   	补充 注意 说明
  */
bool LinkQueue_IsFull(LinkQueue_t *Head)
{
	return (Head->Front == (Head->Rear+1)%(Head->Size))?true:false;
}

/**
  * @name:	LinkQueue_IsEmpty
  * @brief  	判断顺序队是否为空
  * @param  
  			@Head
  * @retval 	bool
  * @date 	2024/04/26
  * @note   	补充 注意 说明
  */

bool LinkQueue_IsEmpty(LinkQueue_t *Head)
{
	return (Head->Front == Head->Rear)?true:false;
}
/**
  * @name:	LinkQueue_Enqueue
  * @brief  	入队
  * @param  
  			@Head
				@Data
  * @retval 	bool
  * @date 	2024/04/26
  * @note   	补充 注意 说明
  */
bool LinkQueue_Enqueue(LinkQueue_t *Head,DataType_t Data)
{
	if(LinkQueue_IsFull(Head))
	{
		printf("LinkQueue is Full\n");
		return;
	}
	
	Head->Addr[Head->Rear] = Data;
	Head->Rear = (Head->Rear+1) % Head->Size;
}
/**
  * @name:	LinkQueue_Dequeue
  * @brief  	出队
  * @param  
  			@Head
  * @retval 	bool
  * @date 	2024/04/26
  * @note   	补充 注意 说明
  */
DataType_t LinkQueue_Dequeue(LinkQueue_t *Head)
{
	DataType_t temp;
	if(LinkQueue_IsEmpty(Head))
	{
		printf("LinkQueue is Empty\n");
		return;
	}
	temp = Head->Addr[Head->Front];
	Head->Front = (Head->Front+1) % Head->Size;
	return temp;
}
/**
  * @name:	LinkQueue_Print
  * @brief  	遍历
  * @param  
  			@Head
  * @retval 	void
  * @date 	2024/04/26
  * @note   	补充 注意 说明
  */
void LinkQueue_Print(LinkQueue_t *Head)
{
	for(int i=0;i<Head->Rear;i++)
	{
		printf("第%d个元素是%d\n",i,Head->Addr[i]);
	}
}

int main()
{
	int i;
	LinkQueue_t * Head = LinkQueue_Creat(32);
		LinkQueue_Enqueue(Head,1);
		LinkQueue_Enqueue(Head,2);
		LinkQueue_Print(Head);
		// LinkQueue_Dequeue(Head);
		//printf("%d",LinkQueue_IsEmpty(Head));
}

标签:Head,return,队列,LinkQueue,LQueue,2024,next
From: https://www.cnblogs.com/lu-ciana/p/18160965

相关文章

  • 以链表为基础实现链式队列
    以链表为基础实现链式队列如果打算以链表作为基础来实现队列的操作,可以避免内存浪费以及避免内存成片移动,只需要确定队头和队尾即可,一般把链表头部作为队头,可以实现头删,把链表尾部作为队尾,可以实现尾插。#include<stdio.h>#include<stdbool.h>#include<stdlib.h>//对输入......
  • 自定义单链表队列的基本接口函数(非循环队列)
    单链表构建队列的接口函数/********************************************************************文件名称: 单链表构建队列的接口函数文件作者:[email protected]创建日期:2024/04/26文件功能:对单链表循环队列的增删改查功能的定义注意事项:NoneCop......
  • 队列_单向链表
    利用单向链表设计一个队列,实现“先进先出”的功能​ 队列的两端都允许操作,只不过要求数据只能从队列的一端插入,从队列的另一端删除,可以把队列理解为一根水管,水管有进水口和出水口。​ 一般把允许数据插入的一端称为队尾(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......
  • 链式队列
    队列原理介绍:​ 队列(Queue)和栈类似,相同点是都属于线性结构,不同点是栈遵循“后进先出”原则,而队列遵循“*先进先出*”的原则,也被称为“FIFO”结构,就是“FirstInputFirstOutput”​ 数据结构中的队列的两端都允许操作,只不过要求数据只能从队列的一端插入,从队列的另一端删除,可......
  • 单向链式队列
    目录目录单向链式队列创建空链表创建新结点入队判断链表是否为空出队遍历代码验证单向链式队列/**@filename: main.c@brief单向链式队列@[email protected]@date2024/04/[email protected]:版本@property:属性介绍@note补充注意说明CopyRight(c)2023......
  • 以链表为基础实现链式队列
    数据结构链式队列以链表为基础实现链式队列1.思路:如果打算以链表作为基础来实现队列的操作,可以避免内存浪费以及避免内存成片移动,只需要确定队头和队尾即可,一般把链表头部作为队头,可以实现头删,把链表尾部作为队尾,可以实现尾插。2.图示:3.代码:/****************************......
  • 单链表队列
    单链表队列队列:遵循先进先出1.创建初始化队列/******************************************************************************函数名称:LinQue_Create*函数功能:创建头结点*函数参数:NONE*......
  • 数据结构—单链表队列头删尾插
    单链表队列的头删尾插/*************************************************/***@filename: 单链表队列的头删尾插.md*@brief实现对单链表队列的头删尾插*@[email protected]*@date2024/04/26*@version1.0:在下坂本,有何贵干*@property:no......
  • 循环队列
    /***********************************************************************************************************该程序实现循环队列元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以循环队列中元素*的数据类型为DataType_t,用户可以根据实际情况修改......