list_empty функция свързан списък с ядрото

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.


person Aman Deep Gautam    schedule 25.10.2012    source източник


Отговори (2)


Списъкът е кръгъл, като самата глава служи като фиктивен възел. Кръговите списъци имат леко предимство в броя на сравненията, необходими по време на вмъкване и изтриване. Тъй като няма нулеви указатели, няма толкова специални случаи, които да търсите. Тук нямам изходния код, но ако го проверите, ще откриете, че инициализирането на списък се извършва с нещо като:

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; 
}

Виж! Изобщо няма твърдения ако!

person Gene    schedule 25.10.2012

тъй като head->next не е NULL, когато списъкът е празен, той сочи към head вместо това.

person iabdalkader    schedule 25.10.2012