2

list_empty()函数在中定义./include/linux/list.h,其定义为

static inline int list_empty(const struct list_head *head)
{
    return head->next == head;
}

list_head数据结构定义为

struct list_head {
     struct list_head *next, *prev;
};

我不明白为什么内核中的这个实现会检查head->next == head而不是head->next == NULL&& head->prev == NULL

4

2 回答 2

9

该列表是圆形的,头部本身用作虚拟节点。循环列表在插入和删除过程中所需的比较次数上有一点优势。由于没有空指针,因此没有那么多特殊情况需要寻找。我这里没有源代码,但是如果你检查一下,你会发现初始化列表是通过以下方式完成的:

head->next = head->prev = head;

插入将是:

void insert_after(struct list_head *node, struct list_head *after)
{
  node->next = after->next;
  node->prev = after;
  after->next->prev = node;
  after->next = node; 
}

看!根本没有 if 语句!

于 2012-10-25T17:41:57.177 回答
0

因为head->next不是NULL当列表为空时,而是指向head

于 2012-10-25T17:43:16.460 回答