C语言知识-----队列的实现

#ifndef AJB_QUEUE_H_
#define AJB_QUEUE_H_

#include "ajb_types.h"

typedef struct Queue_
{
    AJB_U16	 pReadSeat;   		//存放数据队列的位置
    AJB_U16	 pWriteSeat;		//获取数据队列的位置
    AJB_U16  Size;  		    //队列总容量的大小
    AJB_U16	 DataSize;	        //当前队列中数据容量的大小
    AJB_U16  EmptySize;
    AJB_U8	 *Data;      		//队列数据存放地址
    
    void (*AnalysisQueueData)(struct Queue_ *Queue);
    
}Queue_t;//队列结构体

typedef void (*pAnalysisQueueData)(Queue_t *Queue);

extern AJB_U16 GetQueueEmptySize(Queue_t Queue);
extern AJB_U16 GetQueueDataSize(Queue_t Queue);
extern AJB_U16 ReadDataFromQueue(Queue_t Queue,AJB_U16 Offset,AJB_U8 *Data,AJB_U16 Length );
extern AJB_U16 WriteDataToQueue(Queue_t *Queue,AJB_U8 *Data,AJB_U16 Length);
extern AJB_BOOL InitQueue(Queue_t *Queue,AJB_U8 *QueueDataAddr,AJB_U16 QueueSize,pAnalysisQueueData AnalysisQueueData );
extern AJB_U16 DelectDataFromQueue(Queue_t *Queue,AJB_U16 Length );

#endif /* AJB_QUEUE_H_ */
#include "ajb_queue.h"
#include "string.h"
#define TRACE_QUEUE 	TRUE
AJB_BOOL InitQueue( Queue_t *Queue, 
						 AJB_U8 *QueueDataAddr, 
						 AJB_U16 QueueSize ,
						 pAnalysisQueueData AnalysisQueueData )
{
    if( NULL == Queue || NULL == QueueDataAddr )
    {
      return AJB_FALSE;
    }

    Queue->Size = QueueSize;
    Queue->pReadSeat = 0;
    Queue->pWriteSeat = 0;
    Queue->DataSize = 0;
    Queue->EmptySize = QueueSize;
	Queue->AnalysisQueueData = AnalysisQueueData;
#if 0
    if( NULL == QueueDataAddr )
    {
		Queue->Data = (uint8 *)malloc(sizeof(uint8) * QueueSize );
    }
#endif

	Queue->Data = QueueDataAddr;

    if( NULL == Queue->Data )
    {
      return AJB_FALSE;
    }
    else
    {
      return AJB_TRUE;
    }
}
AJB_U16 WriteDataToQueue(Queue_t *Queue,AJB_U8 *Data,AJB_U16 Length)
{

    if(0 == Queue->EmptySize)
    {
         return 0;
    }

    if( Queue->pWriteSeat >= Queue->Size )
    {
      Queue->pWriteSeat = 0;
    }

    /*鍒ゆ柇FIFO瀛樺偍绌洪棿鏄惁*/
    if(Length > Queue->EmptySize)
    {
         Length = Queue->EmptySize;
    }

    if( (Queue->Size - Queue->pWriteSeat) >= Length )//杩炵画鐨勭┖闂磋冻澶?
    {
        memcpy( &(Queue->Data[Queue->pWriteSeat]),Data,Length);
        Queue->pWriteSeat += Length;
    }
    else
    {
        memcpy( &(Queue->Data[Queue->pWriteSeat]) ,Data,Queue->Size - Queue->pWriteSeat );
        memcpy( &(Queue->Data[0]),&(Data[Queue->Size - Queue->pWriteSeat]) ,Length + Queue->pWriteSeat - Queue->Size );
        Queue->pWriteSeat = Length + Queue->pWriteSeat - Queue->Size;
    }

    Queue->EmptySize -= Length;
    Queue->DataSize += Length;

	if( NULL != Queue->AnalysisQueueData )
	{
		Queue->AnalysisQueueData(Queue);  //瑙f瀽闃熷垪涓殑鏁版嵁
	}

    return Length;   //杩斿洖鎴愬姛鍐欏叆鎴愬姛鐨勫瓧鑺傛暟
}
AJB_U16 ReadDataFromQueue(Queue_t Queue,AJB_U16 Offset,AJB_U8 *Data,AJB_U16 Length )
{

    if( NULL == Data )
    {
      return 0;
    }

    if(0 == Queue.DataSize || 0 == Length)  //褰撳墠闃熷垪涓虹┖鎴栬€呰鍙栫殑鏁版嵁闀垮害涓洪浂
    {
        return 0;
    }

    if( Offset > ( Queue.DataSize - 1 ) )   //鍋忕Щ瓒呰繃浜嗚寖鍥?
    {
      return 0;
    }

    if( Offset + Queue.pReadSeat > Queue.Size - 1 )//鏍规嵁鍋忕Щ閲忚绠楀紑濮嬭鍙栨暟鎹殑浣嶇疆
    {
      Queue.pReadSeat = (Offset + Queue.pReadSeat) - Queue.Size ;  //璁$畻鍑烘渶灏忕殑鍊间负0
    }
    else
    {
      Queue.pReadSeat += Offset;  //璁$畻鍑烘渶澶х殑鍊间负 Queue->Size - 1
    }

    if( (Queue.DataSize - Offset) < Length ) //鏍稿鏈€澶у彲璇诲彇鐨勬暟鎹暱搴?
    {
        Length = Queue.DataSize - Offset;
    }

    /* 鍒ゆ柇绌洪棿鏄惁鏄繛缁?*/
    if( (Queue.Size - Queue.pReadSeat) >= Length )
    {
        memcpy(Data,&(Queue.Data[Queue.pReadSeat]),Length);
    }
    else
    {
        memcpy(Data,&(Queue.Data[Queue.pReadSeat]) ,Queue.Size - Queue.pReadSeat );
        memcpy( &Data[Queue.Size - Queue.pReadSeat],Queue.Data , Length  + Queue.pReadSeat - Queue.Size );

    }

    return Length;
}
AJB_U16 DelectDataFromQueue(Queue_t *Queue,AJB_U16 Length )
{
    if( NULL == Queue )
    {
      return 0;
    }

    if( 0 == Length )  //褰撳墠闃熷垪涓虹┖鎴栬€呰鍙栫殑鏁版嵁闀垮害涓洪浂
    {
        return 0;
    }

    if( Queue->DataSize  < Length ) //鏍稿鏈€澶у彲浠ュ垹闄ょ殑闀垮害
    {
        Length = Queue->DataSize ;
    }

    if( (Length + Queue->pReadSeat) >=  Queue->Size  )
    {
      Queue->pReadSeat = Length  + Queue->pReadSeat - Queue->Size;
    }
    else
    {
      Queue->pReadSeat += Length;
    }

    Queue->EmptySize += Length;
    Queue->DataSize -= Length;

    return Length;
}
AJB_U16 GetQueueDataSize(Queue_t Queue)
{
  return Queue.DataSize;
}
AJB_U16 GetQueueEmptySize(Queue_t Queue)
{
  return Queue.EmptySize;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值