queue(3)--freebsd中的queue结构使用

前几天看代码,发现有类似这样的结构:

 

TAILQ_FOREACH(np, &head, entries){ printf("%d %d/n", np->a1, np->a2); } 

我没太多代码编写经验,初读的时候能模糊知道和for_each()函数类似,但十分好奇是如何实现了,后来在发现引用了queue.h头文件,是freebsd里定义的一头文件,采用宏定义的形式实现了4种基本的数据结构,没做太多深入的理解,我简单把其中的Tail queue拿出来用了用。

#include "queue.h" typedef struct test_num_ test_num; struct test_num_{ unsigned int a1:3; unsigned int a2:1; TAILQ_ENTRY(test_num) entries; /* Tail queue. */ }; int main() { test_num *n1, *n2, *n3, *np; TAILQ_HEAD(tailhead, test_num) head; struct tailhead *headp = &head; /* Tail queue head. = &head */ TAILQ_INIT(&head); /* Initialize the queue. */ n1 = malloc(sizeof(test_num)); /* Insert at the head. */ n1->a1 = 1; n1->a2 = 5; TAILQ_INSERT_HEAD(&head, n1, entries); n3 = malloc(sizeof(test_num)); /* Insert at the tail. */ n3->a1 = 3; n3->a2 = 0; TAILQ_INSERT_TAIL(&head, n3, entries); n2 = malloc(sizeof(test_num)); /* Insert after. */ n2->a1 = 2; TAILQ_INSERT_AFTER(&head, n1, n2, entries); /* Forward traversal. */ for (np = head.tqh_first; np != NULL; np = np->entries.tqe_next){ printf("%d %d/n", np->a1, np->a2); } TAILQ_FOREACH(np, &head, entries){ printf("%d %d/n", np->a1, np->a2); } /* Delete. 我纳闷的是,这只是在queue中删除了元素,但n1,n2,n3对象并未释放,需要注意 */ while (head.tqh_first != NULL) TAILQ_REMOVE(&head, head.tqh_first, entries); //确实没有释放 printf("%d %d/n", n3->a1, n3->a2); free(n1); free(n2); free(n3); getchar(); } 

 

其中有个特别的地方是struct结构体中的形式:unsigned int a1:3;,它指明a1的最大值只能是2的N次方减1(2^N-1)

另外有个注意的地方当给a2赋值5、0和未初始化的情况下,它的值的情况。

 

参考:

http://blogold.chinaunix.net/u/21842/showart_142295.html

http://topic.csdn.net/u/20090725/21/3310fdf5-f60f-4541-a98d-c629ad92a3a4.html

 

你可能感兴趣的:(数据结构,struct,null,insert,FreeBSD,n2)