队列概念很简单,就是排队,先进先出,通常有链表形式和数组形式(即链接类型和顺序类型),它也是软件构建的一个基本数据结构,看看AMPS中的队列实现。
AMPS_Queue.h
#ifndef __HEADER_AMPS_QUEUE_H
#define __HEADER_AMPS_QUEUE_H
#ifdef __cplusplus
extern "C" {
#endif
#include "AMPS_Defines.h"
#include "AMPS_LinkList.h"
typedef struct _AMPSListBasedQueue t_AMPSListBasedQueue;
typedef struct _AMPSArrayBasedQueue t_AMPSArrayBasedQueue;
/*链表形式的队列*/
struct _AMPSListBasedQueue
{
int unCount; /*队列结点个数*/
t_AMPSSList* poQueueHead; /*队列头指针*/
t_AMPSSList* poQueueTail; /*队列尾指针*/
};
int Queue_EnQueueListBasedData(void* r_pvAMPSContext, void* r_pvAMPSListBasedQueue, void* r_pvDataToEnQueue);
int Queue_EnQueueListBasedDataAtHead(void* r_pvAMPSContext, void* r_pvAMPSListBasedQueue,
void* r_pvDataToEnQueue);
void* Queue_DeQueueListBasedData(void* r_pvAMPSContext, void* r_pvAMPSListBasedQueue);
int Queue_GetListBasedQueueLength(void* r_pvAMPSContext, void* r_pvAMPSListBasedQueue);
/*数组形式的队列*/
struct _AMPSArrayBasedQueue
{
int nSizeOfQueue; /*队列总大小*/
int unCount; /*当前结点个数*/
unsigned char** ppuchQueue; /*队列结点内容(可看做一个长度为nSizeOfQueue,内容为char*的数组)*/
int nHeadIndex; /*队列头下标*/
int nTailIndex; /*队列尾下标*/
};
int Queue_EnQueueArrayBasedInit(void* r_pvAMPSContext, void* r_pvAMPSListBasedQueue, int r_nSizeOfQueue);
void Queue_EnQueueArrayBasedCleanup(void* r_pvAMPSContext, void* r_pvAMPSListBasedQueue);
int Queue_EnQueueArrayBasedData(void* r_pvAMPSContext, void* r_pvAMPSArrayBasedQueue, void* r_pvDataToEnQueue);
void* Queue_DeQueueArrayBasedData(void* r_pvAMPSContext, void* r_pvAMPSArrayBasedQueue);
int Queue_GetArrayBasedQueueLength(void* r_pvAMPSContext, void* r_pvAMPSArrayBasedQueue);
#ifdef __cplusplus
}
#endif
#endif //__HEADER_AMPS_QUEUE_H
AMPS_Queue.c
/*****************************************************************
文件名称: AMPS_Queue.c
功能描述: 队列操作函数(包括链表类型队列和数据类型队列)
备注: 通常的队列是队头删除,队尾插入(这个函数库的实现刚好相反)
*****************************************************************/
#include "AMPS_Core.h"
#include "AMPS_Defines.h"
#include "AMPS_MemMgt.h"
#include "AMPS_Queue.h"
#include "AMPS_LinkList.h"
/*****************************************************************
函数名称: Queue_EnQueueListBasedData
功能描述: 向队列中写数据(链表类型队列) 队头插入
入参::
void* r_pvAMPSContext AMPS应用上下文数据结构
void* r_pvAMPSListBasedQueue 待写入的队列
void* r_pvDataToEnQueue 待写入队列的数据
出参:
--
返回值:
int
*****************************************************************/
int Queue_EnQueueListBasedData(void* r_pvAMPSContext, void* r_pvAMPSListBasedQueue, void* r_pvDataToEnQueue)
{
t_AMPSListBasedQueue* poAMPSListBasedQueue = r_pvAMPSListBasedQueue;
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");
/*向队列中添加结点,前向插入,即向队头插入*/
if (NULL == SList_Prepend(&poAMPSListBasedQueue->poQueueHead, r_pvDataToEnQueue))
{
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "SList_Prepend is failed.\n");
return AMPS_ERROR_FAILURE;
}
/*在写入前,如果队列为空,队尾与队头指向同一位置*/
if (0 == poAMPSListBasedQueue->unCount)
{
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "Set Tail to Head.\n");
poAMPSListBasedQueue->poQueueTail = poAMPSListBasedQueue->poQueueHead;
}
/*队列中元素个数加1*/
poAMPSListBasedQueue->unCount++;
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
return AMPS_SUCCESS;
}
/*****************************************************************
函数名称: Queue_EnQueueListBasedData
功能描述: 向队列中写数据(链表类型队列),队尾插入
入参::
void* r_pvAMPSContext AMPS应用上下文数据结构
void* r_pvAMPSListBasedQueue 待写入的队列
void* r_pvDataToEnQueue 待写入队列的数据
出参:
--
返回值:
int
*****************************************************************/
int Queue_EnQueueListBasedDataAtHead(void* r_pvAMPSContext, void* r_pvAMPSListBasedQueue, void* r_pvDataToEnQueue)
{
t_AMPSListBasedQueue* poAMPSListBasedQueue = r_pvAMPSListBasedQueue;
t_AMPSSList* poSList = NULL;
TRACE(QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");
/*向队头追加结点*/
poSList = SList_AppendEx(&poAMPSListBasedQueue->poQueueHead, r_pvDataToEnQueue);
if(NULL == poSList)
{
TRACE(QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "SList_Prepend is failed.\n");
return AMPS_ERROR_FAILURE;
}
if(0 == poAMPSListBasedQueue->unCount)
{
TRACE(QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG_2, "Set Tail to Head.\n");
poAMPSListBasedQueue->poQueueTail = poAMPSListBasedQueue->poQueueHead;
}
else
{
/*将队尾指向当前结点位置,即队头指向链表首结点,队尾指向链表尾结点*/
poAMPSListBasedQueue->poQueueTail = poSList;
}
poAMPSListBasedQueue->unCount++;
TRACE(QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
return AMPS_SUCCESS;
}
/*****************************************************************
函数名称: Queue_DeQueueListBasedData
功能描述: 队尾结点出队列(链表类型队列)
入参::
void* r_pvAMPSContext AMPS应用上下文数据结构
void* r_pvAMPSListBasedQueue 待操作的队列
出参:
--
返回值:
void* 队尾结点内容
*****************************************************************/
void* Queue_DeQueueListBasedData(void* r_pvAMPSContext, void* r_pvAMPSListBasedQueue)
{
t_AMPSListBasedQueue* poAMPSListBasedQueue = r_pvAMPSListBasedQueue;
t_AMPSSList* poSList = NULL;
void* pvQueueData = NULL;
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");
if (NULL == poAMPSListBasedQueue->poQueueTail || 0 == poAMPSListBasedQueue->unCount)
{
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Queue is empty.\n");
return NULL;
}
/*删除队尾结点*/
poSList = poAMPSListBasedQueue->poQueueTail->poAMPSSListPrev;
pvQueueData = poAMPSListBasedQueue->poQueueTail->pvData;
if (AMPS_SUCCESS != SList_Remove(&poAMPSListBasedQueue->poQueueHead, poAMPSListBasedQueue->poQueueTail, NULL))
{
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "SList_Remove is failed\n");
return NULL;
}
poAMPSListBasedQueue->poQueueTail = poSList;
poAMPSListBasedQueue->unCount--;
/*返回已删除的队尾结点的内容*/
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
return pvQueueData;
}
/*****************************************************************
函数名称: Queue_DeQueueListBasedData
功能描述: 获取队列长度(链表类型队列)
入参::
void* r_pvAMPSContext AMPS应用上下文数据结构
void* r_pvAMPSListBasedQueue 待操作的队列
出参:
--
返回值:
int 队列长度
*****************************************************************/
int Queue_GetListBasedQueueLength(void* r_pvAMPSContext, void* r_pvAMPSListBasedQueue)
{
t_AMPSListBasedQueue* poAMPSListBasedQueue = r_pvAMPSListBasedQueue;
return (poAMPSListBasedQueue->unCount);
}
/*****************************************************************
函数名称: Queue_EnQueueArrayBasedInit
功能描述: 队列初始化(数组类型队列)
入参::
void* r_pvAMPSContext AMPS应用上下文数据结构
void* r_pvAMPSArrayBasedQueue 待操作的队列
int r_nSizeOfQueue 队列总大小
出参:
--
返回值:
int
*****************************************************************/
int Queue_EnQueueArrayBasedInit(void* r_pvAMPSContext, void* r_pvAMPSArrayBasedQueue, int r_nSizeOfQueue)
{
t_AMPSArrayBasedQueue* poAMPSArrayBasedQueue = r_pvAMPSArrayBasedQueue;
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");
/*由于队列中存放结点内容的成员为char
**,所以需要在初始化时预先分配好内存,在队列销毁时释放*/
poAMPSArrayBasedQueue->ppuchQueue = AMPS_InternalMalloc(sizeof(char*) * r_nSizeOfQueue);
if (NULL == poAMPSArrayBasedQueue->ppuchQueue)
{
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "AMPS_InternalMalloc failed for poAMPSArrayBasedQueue->poQueue.\n");
return AMPS_ERROR_FAILURE;
}
poAMPSArrayBasedQueue->unCount = 0;
poAMPSArrayBasedQueue->nHeadIndex = 0;
poAMPSArrayBasedQueue->nTailIndex = 0;
poAMPSArrayBasedQueue->nSizeOfQueue = r_nSizeOfQueue;
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
return AMPS_SUCCESS;
}
/*****************************************************************
函数名称: Queue_EnQueueArrayBasedInit
功能描述: 队列销毁(数组类型队列)
入参::
void* r_pvAMPSContext AMPS应用上下文数据结构
void* r_pvAMPSArrayBasedQueue 待操作的队列
出参:
--
返回值:
void
*****************************************************************/
void Queue_EnQueueArrayBasedCleanup(void* r_pvAMPSContext, void* r_pvAMPSListBasedQueue)
{
t_AMPSArrayBasedQueue* poAMPSArrayBasedQueue = r_pvAMPSListBasedQueue;
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");
/*释放在初始化时分配的结点内存*/
AMPS_InternalFree(poAMPSArrayBasedQueue->ppuchQueue);
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
}
/*****************************************************************
函数名称: Queue_EnQueueArrayBasedData
功能描述: 向队列中写数据(数组类型队列)
入参::
void* r_pvAMPSContext AMPS应用上下文数据结构
void* r_pvAMPSArrayBasedQueue 待操作的队列
void* r_pvDataToEnQueue 待写入的数据
出参:
--
返回值:
int
*****************************************************************/
int Queue_EnQueueArrayBasedData(void* r_pvAMPSContext, void* r_pvAMPSArrayBasedQueue, void* r_pvDataToEnQueue)
{
t_AMPSArrayBasedQueue* poAMPSArrayBasedQueue = r_pvAMPSArrayBasedQueue;
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");
/*判断队列是否已满*/
if((poAMPSArrayBasedQueue->unCount + 1) == poAMPSArrayBasedQueue->nSizeOfQueue)
{
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_ERROR, "Queue is FULL.\n");
return AMPS_ERROR_FAILURE;
}
/*新队列结点赋值*/
//printf("Queue Head Index 1 ==> %d \n", poAMPSArrayBasedQueue->nHeadIndex);
poAMPSArrayBasedQueue->ppuchQueue[poAMPSArrayBasedQueue->nHeadIndex] = r_pvDataToEnQueue;
/*插入新结点*/
poAMPSArrayBasedQueue->nHeadIndex = (poAMPSArrayBasedQueue->nHeadIndex + 1) % poAMPSArrayBasedQueue->nSizeOfQueue;
//printf("Queue Head Index 2 ==> %d \n", poAMPSArrayBasedQueue->nHeadIndex);
/*记数增1*/
poAMPSArrayBasedQueue->unCount++;
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
return AMPS_SUCCESS;
}
/*****************************************************************
函数名称: Queue_DeQueueArrayBasedData
功能描述: 从队尾删除结点(数组类型队列)
入参::
void* r_pvAMPSContext AMPS应用上下文数据结构
void* r_pvAMPSArrayBasedQueue 待操作的队列
出参:
--
返回值:
void* 已删除结点内容
*****************************************************************/
void* Queue_DeQueueArrayBasedData(void* r_pvAMPSContext, void* r_pvAMPSArrayBasedQueue)
{
t_AMPSArrayBasedQueue* poAMPSArrayBasedQueue = r_pvAMPSArrayBasedQueue;
void* pvQueueData = NULL;
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Entering.\n");
/*是否为空队列*/
if (0 == poAMPSArrayBasedQueue->unCount)
{
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_DEBUG, "Queue is empty.\n");
return NULL;
}
//printf("Queueu Tail Index 1 ==> %d \n", poAMPSArrayBasedQueue->nTailIndex);
pvQueueData = poAMPSArrayBasedQueue->ppuchQueue[poAMPSArrayBasedQueue->nTailIndex];
/*从队尾删除结点,即队尾指针上移*/
poAMPSArrayBasedQueue->nTailIndex = (poAMPSArrayBasedQueue->nTailIndex + 1) % poAMPSArrayBasedQueue->nSizeOfQueue;
//printf("Queueu Tail Index 2 ==> %d \n", poAMPSArrayBasedQueue->nTailIndex);
poAMPSArrayBasedQueue->unCount--;
TRACE( QUEUE_TRACE_ID(r_pvAMPSContext), AMPS_TRACE_LEVEL_INFO, "Leaving.\n");
return pvQueueData;
}
/*****************************************************************
函数名称: Queue_DeQueueArrayBasedData
功能描述: 获取队列结点个数(数组类型队列)
入参::
void* r_pvAMPSContext AMPS应用上下文数据结构
void* r_pvAMPSArrayBasedQueue 待操作的队列
出参:
--
返回值:
int 队列结点个数
*****************************************************************/
int Queue_GetArrayBasedQueueLength(void* r_pvAMPSContext, void* r_pvAMPSArrayBasedQueue)
{
t_AMPSArrayBasedQueue* poAMPSArrayBasedQueue = r_pvAMPSArrayBasedQueue;
return (poAMPSArrayBasedQueue->unCount);
}