AMPS:隊列源碼解讀

來源:互聯網
上載者:User

  隊列概念很簡單,就是排隊,先進先出,通常有鏈表形式和數組形式(即連結類型和順序類型),它也是軟體構建的一個基本資料結構,看看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);}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.