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*); };
有两个初始化函数,一个是静态初始化,一个是动态初始化(需要释放),如下:
/** * 初始化一个给定队列,应用可以在栈上分配队列,而后调用该函数进行初始化 * @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);
其它的辅助函数:
/** * 返回队列中头部(即最新添加的)的动态对象 * @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.h
ACL 下载:http://acl.sourceforge.net/
QQ 群:242722074