最近学习Libevent源码,看到了TAILQ这一数据结构,觉得非常疑惑,为什么要将prev和last定义为二级指针呢?定义为一级指针也完全能实现双向链表的功能吧?而且直接使用一级指针效率也不低。不过这么做肯定有其道理,那么TAILQ中使用二级指针相比于直接用一级指针来说有什么好处呢?谢谢!
#define TAILQ_HEAD(name, type) \
struct name { \
struct type *tqh_first; /* first element */ \
struct type **tqh_last; /* addr of last next element */ \
}
#define TAILQ_ENTRY(type) \
struct { \
struct type *tqe_next; /* next element */ \
struct type **tqe_prev; /* address of previous next element */ \
}
哈,这个我以前正好整理过。。tailq之一二事
好处就是,删除第一个节点或者在第一个节点不用特殊处理。
当然这不是和
Linux
中的list
相比(因为它也没有特殊处理)