隊列概念很簡單,就是排隊,先進先出,通常有鏈表形式和數組形式(即連結類型和順序類型),它也是軟體構建的一個基本資料結構,看看AMPS中的隊列實現。
AMPS_Queue.h
#ifndef __HEADER_AMPS_QUEUE_H#define __HEADER_AMPS_QUEUE_H#ifdef __cplusplusextern "C" {#endif#include "AMPS_Defines.h"#include "AMPS_LinkList.h"typedef struct _AMPSListBasedQueuet_AMPSListBasedQueue;typedef struct _AMPSArrayBasedQueuet_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{intnSizeOfQueue; /*隊列總大小*/ int unCount; /*當前結點個數*/ unsigned char**ppuchQueue; /*隊列結點內容(可看做一個長度為nSizeOfQueue,內容為char*的數組)*/intnHeadIndex; /*隊列頭下標*/intnTailIndex; /*隊列尾下標*/};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);}