为什么OpenBSD <sys queue.h =“”>中的尾部队列使用指针指针?</sys>

时间:2014-07-09 10:11:26

标签: c pointers

#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更好的内容?

1 个答案:

答案 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这样的简单指针,则无法实现。