#define TAILQ_ENTRY(type) \
struct { \
struct type *tqe_next; /* next element */ \
struct type **tqe_prev; /* address of previous next element */ \
}
上面显示的代码,使用struct type **tqe_prev
的原因,是否有比struct type *tqe_prev
更好的内容?
答案 0 :(得分:1)
原因是列表的head
。使用指向指针的指针,可以始终使用以下命令删除节点:
*tqe_prev = tqe_next;
if(tqe_next) tqe_next->tqe_prev = tqe_prev;
即使它是第一个节点。
整个队列通常由指向第一个节点的head
指针访问,或者在队列为空时由null
访问,例如:
struct type* head;
第一个节点的tqe_prev
指向此head
指针。这就是为什么上面的删除代码也可以从队列中删除第一个节点。代码可以访问指向要删除的节点的指针,因此可以使其指向下一个节点。如果该节点是队列中唯一剩余的节点,则head
将被删除时设置为null
。
如果它是像tqe_next
这样的简单指针,则无法实现。