数据结构 队列 C语言实现
先将代码分享出来,后续更新使用说明
/**
* 文件名: uqueue.c
* 说明: 队列实现源文件
* 作者: HAUE.Y2C
*/
#include "uqueue.h"
QueueBuffer_Type QueueBuffer;
//队列初始化
QueueBuffer_Type * Queue_Register(u16 mSize)
{
QueueBuffer_Type *pQueueBuffer;
pQueueBuffer = (QueueBuffer_Type *)malloc(sizeof(QueueBuffer_Type)); //分配记录队列信息的结构变量
memset((u8 *)pQueueBuffer, 0, sizeof(QueueBuffer_Type)); //记录队列信息的结构变量清0
pQueueBuffer->BufferStart = pQueueBuffer->pIn = pQueueBuffer->pOut = malloc( mSize ); //分配队列所需内存
pQueueBuffer->BufferEnd = pQueueBuffer->BufferStart + mSize; //队列结束指针
return pQueueBuffer;
}
//将数据压入队列
void Queue_Push(QueueBuffer_Type * pQueueBuffer, u8 mData)
{
u8 *p = NULL;
p = pQueueBuffer->pIn;
*p++ = mData; //mData 给了pQueueBuffer->pIn并且加1,mcount++
if (p == (pQueueBuffer->BufferEnd + 1))
{
p = pQueueBuffer->BufferStart;
}
pQueueBuffer->pIn = p;
pQueueBuffer->mCount++;
}
//将数据弹出队列
unsigned char Queue_Pop(QueueBuffer_Type *pQueueBuffer)
{
unsigned char mData;
unsigned char *p;
p = pQueueBuffer->pOut; //把pout的送出去,pout加1,并且mcount--
mData = *p;
if(++p == (pQueueBuffer->BufferEnd + 1))
{
p = pQueueBuffer->BufferStart;
}
pQueueBuffer->pOut = p;
pQueueBuffer->mCount--;
return mData;
}
//读出队列指定序号数据
unsigned char Queue_Read(QueueBuffer_Type *pQueueBuffer, unsigned char mId )
{
unsigned char *pTemp;
pTemp = pQueueBuffer->pOut + mId;
if( pTemp < pQueueBuffer->BufferEnd )
{
return(*pTemp);
}
else
{
return(*(pTemp - pQueueBuffer->BufferEnd + pQueueBuffer->BufferStart));
}
}
//返回队列数据个数
u16 Queue_Num(QueueBuffer_Type *pQueueBuffer )
{
return pQueueBuffer->mCount;
}
//队列清空
void Queue_Clear(QueueBuffer_Type *pQueueBuffer )
{
pQueueBuffer->pIn = pQueueBuffer->pOut = pQueueBuffer->BufferStart;
pQueueBuffer->mCount = 0;
}
//填充队列
u8 Queue_Full(QueueBuffer_Type *pQueueBuffer, u16 MAX_Entry)
{
return (pQueueBuffer->mCount == MAX_Entry);
}
/**
* 文件名: uqueue.h
* 说明: 队列的实现
* 作者: HAUE.Y2C
*/
#ifndef __UQUEUE_H
#define __UQUEUE_H
#include "sys.h"
#include "main.h"
typedef struct
{
u8 *BufferStart; //缓冲区起始点
u8 *BufferEnd; //缓冲区结束点
u8 *pIn; //写指针
u8 *pOut; //读指针
u16 mCount; //缓冲区数据个数
}QueueBuffer_Type;
typedef struct
{
QueueBuffer_Type *pReceiveDataBuffer;
QueueBuffer_Type *pSendDataBuffer;
}USARTBuffer_Type;
extern QueueBuffer_Type QueueBuffer;
//队列初始化
QueueBuffer_Type * Queue_Register( u16 mSize );
//将数据压入队列
void Queue_Push(QueueBuffer_Type *pQueueBuffer, u8 mData );
//将数据弹出队列
u8 Queue_Pop(QueueBuffer_Type *pQueueBuffer );
//读出队列指定序号数据
u8 Queue_Read(QueueBuffer_Type *pQueueBuffer, u8 mId );
//返回队列数据个数
u16 Queue_Num(QueueBuffer_Type *pQueueBuffer );
//队列清空
void Queue_Clear(QueueBuffer_Type *pQueueBuffer );
//填充队列
u8 Queue_Full(QueueBuffer_Type *pQueueBuffer, u16 MAX_Entry);
#endif
其他
如果有用请点赞,谢谢!!!