通常来说,我们定义一个列表节点
typedef struct _node_st{
struct _node_st * prev ;
struct _node_st *next ;
} node_t ;
当这个节点处于初始或者头部尾部时,prev和next都要置为NULL。但是这种情况下,就不能判断,该节点是否处于一个列表中。因为,如果next为空时,该节点可能处于List的尾部,或者是一个初始节点。prev也是一样。
在linux中,有个新的手法,很有趣:
static inline void INIT_LIST_HEAD(struct _node_st *list)
{
list->next = list;
list->prev = list;
}
让首部和尾部都指向自己。
如果,该节点被添加到一个链表中,那么该节点的prev和next就会发生改变。深入linux内核,受益非浅啊。即使这么简单的list的,都能搞出这么多花样。