ACL庫中有個模塊實現了先進先出隊列的功能,其使用方法很是簡單,下面是結構定義:函數
struct ACL_FIFO { ACL_FIFO_INFO *head; ACL_FIFO_INFO *tail; int cnt; /* for acl_iterator */ /* 取迭代器頭函數 */ const void *(*iter_head)(ACL_ITER*, struct ACL_FIFO*); /* 取迭代器下一個函數 */ const void *(*iter_next)(ACL_ITER*, struct ACL_FIFO*); /* 取迭代器尾函數 */ const void *(*iter_tail)(ACL_ITER*, struct ACL_FIFO*); /* 取迭代器上一個函數 */ const void *(*iter_prev)(ACL_ITER*, struct ACL_FIFO*); /* 取迭代器關聯的當前容器成員結構對象 */ const ACL_FIFO_INFO *(*iter_info)(ACL_ITER*, struct ACL_FIFO*); };
有兩個初始化函數,一個是靜態初始化,一個是動態初始化(須要釋放),以下:.net
/** * 初始化一個給定隊列,應用能夠在棧上分配隊列,然後調用該函數進行初始化 * @param fifo {ACL_FIFO *} * @example: * void test(void) { ACL_FIFO fifo; acl_fifo_init(&fifo); * } */ ACL_API void acl_fifo_init(ACL_FIFO *fifo); /** * 從內存堆中分配一個隊列對象,須要用 acl_fifo_free 釋放 * @return {ACL_FIFO*} */ ACL_API ACL_FIFO *acl_fifo_new(void); /** * 釋放以堆分配的隊列對象 * @param fifo {ACL_FIFO*} * @param free_fn {void (*)(void*)}, 若是該函數指針不爲空則 * 用來釋放隊列中動態分配的對象 */ ACL_API void acl_fifo_free(ACL_FIFO *fifo, void (*free_fn)(void *));
向隊列中添加及得到對象的函數以下:指針
/** * 向隊列中添加一個動態堆對象 * @param fifo {ACL_FIFO*} * @param data {void*} 動態對象 */ ACL_API void acl_fifo_push(ACL_FIFO *fifo, void *data); /** * 從隊列中以先進先出方式彈出一個動態對象, 同時將該對象從隊列中刪除 * @param fifo {ACL_FIFO*} * @return {void*}, 若是爲空,則表示隊列爲空 */ ACL_API void *acl_fifo_pop(ACL_FIFO *fifo);
其它的輔助函數:code
/** * 返回隊列中頭部(即最新添加的)的動態對象 * @param fifo {ACL_FIFO*} * @return {void*}, 若是爲空,則表示隊列爲空 */ ACL_API void *acl_fifo_head(ACL_FIFO *fifo); /** * 返回隊列中尾部(即最先添加的)的動態對象 * @param fifo {ACL_FIFO*} * @return {void*}, 若是爲空,則表示隊列爲空 */ ACL_API void *acl_fifo_tail(ACL_FIFO *fifo); /** * 返回隊列中動態對象的總個數 * @param fifo {ACL_FIFO*} * @return {int}, >= 0 */ ACL_API int acl_fifo_size(ACL_FIFO *fifo);
下面是一個簡單的例子:對象
#include "lib_acl.h" #include <stdio.h> #include <stdlib.h> static void fifo_test(void) { ACL_FIFO *fifo; int i; char *ptr; ACL_ITER iter; fifo = acl_fifo_new(); // 建立隊列 for (i = 0; i < 20; i++) { ptr = (char*) acl_mymalloc(100); snprintf(ptr, 100, "test:%d", i); acl_fifo_push(fifo, ptr); // 向隊列中添加動態元素 } // 遍歷隊列中的全部元素 acl_foreach(iter, fifo) { const char *ptr = (const char*) iter.data; printf(">>>%s\n", ptr); } while (1) { ptr = (char*) acl_fifo_pop(fifo); // 從隊列中取得動態元素 if (ptr == NULL) break; printf("fifo pop: %s\n", ptr); } acl_fifo_free(fifo, acl_myfree_fn); // 釋放隊列 } int main(int argc acl_unused, char *argv[] acl_unused) { fifo_test(); getchar(); return (0); }
這個例子很是簡單,只是演示瞭如何使用ACL庫中的先進先出隊列。頭文件參看:lib_acl/include/stdlib/acl_fifo.hblog
ACL 下載:http://acl.sourceforge.net/隊列
我的微博:http://weibo.com/zsxxsz內存
QQ 羣:242722074get