A more sophisticated kind of linked list is a doubly-linked list. Each node has two links: one points to the previous node, or points to a null value or empty list if it is the first node; and one points to the next, or points to a null value or empty list if it is the final node; e.g. NULL <- 26 <-> 56 <-> 46 -> NULL.
The list family of functions and macros provide routines to create a list, add, move or remove elements and iterate over the list.
Data Structures | |
struct | list_head |
list head More... | |
Defines | |
#define | container_of(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member))) |
get container of list head | |
#define | LIST_HEAD_INIT(name) { &(name), &(name) } |
list head initialization | |
#define | LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name) |
list head creation | |
#define | list_entry(ptr, type, member) container_of(ptr, type, member) |
get the struct for this entry | |
#define | list_for_each(pos, head) for (pos = (head)->next; pos != (head); pos = pos->next) |
iterate over a list | |
#define | list_for_each_prev(pos, head) for (pos = (head)->prev; pos != (head); pos = pos->prev) |
iterate over a list backwards | |
#define | list_for_each_safe(pos, n, head) |
iterate over a list safe against removal of list entry | |
#define | list_for_each_entry(pos, head, member) |
iterate over list of given type | |
#define | list_for_each_entry_reverse(pos, head, member) |
iterate backwards over list of given type. | |
#define | list_for_each_entry_safe(pos, n, head, member) |
iterate over list of given type safe against removal of list entry | |
#define | list_for_each_entry_safe_reverse(pos, n, head, member) |
iterate backwards over list of given type safe against removal of list entry |
#define container_of | ( | ptr, | |||
type, | |||||
member | ) | ((type *)((char *)(ptr) - offsetof(type, member))) |
#define LIST_HEAD_INIT | ( | name | ) | { &(name), &(name) } |
#define LIST_HEAD | ( | name | ) | struct list_head name = LIST_HEAD_INIT(name) |
#define list_entry | ( | ptr, | |||
type, | |||||
member | ) | container_of(ptr, type, member) |
#define list_for_each | ( | pos, | |||
head | ) | for (pos = (head)->next; pos != (head); pos = pos->next) |
#define list_for_each_prev | ( | pos, | |||
head | ) | for (pos = (head)->prev; pos != (head); pos = pos->prev) |
#define list_for_each_safe | ( | pos, | |||
n, | |||||
head | ) |
#define list_for_each_entry | ( | pos, | |||
head, | |||||
member | ) |
Value:
for (pos = list_entry((head)->next, typeof(*pos), member); \ &pos->member != (head); \ pos = list_entry(pos->member.next, typeof(*pos), member))
pos | the type * to use as a loop counter | |
head,: | the head for your list | |
member | the name of the list_struct within the struct |
#define list_for_each_entry_reverse | ( | pos, | |||
head, | |||||
member | ) |
Value:
for (pos = list_entry((head)->prev, typeof(*pos), member); \ &pos->member != (head); \ pos = list_entry(pos->member.prev, typeof(*pos), member))
pos | the type * to use as a loop counter | |
head | the head for your list | |
member | the name of the list_struct within the struct |
#define list_for_each_entry_safe | ( | pos, | |||
n, | |||||
head, | |||||
member | ) |
Value:
for (pos = list_entry((head)->next, typeof(*pos), member), \ n = list_entry(pos->member.next, typeof(*pos), member); \ &pos->member != (head); \ pos = n, n = list_entry(n->member.next, typeof(*n), member))
pos | the type * to use as a loop counter | |
n | another type * to use as temporary storage | |
head | the head for your list | |
member | the name of the list_struct within the struct |
#define list_for_each_entry_safe_reverse | ( | pos, | |||
n, | |||||
head, | |||||
member | ) |
Value:
for (pos = list_entry((head)->prev, typeof(*pos), member), \ n = list_entry(pos->member.prev, typeof(*pos), member); \ &pos->member != (head); \ pos = n, n = list_entry(n->member.prev, typeof(*n), member))
pos | the type * to use as a loop counter | |
n | another type * to use as temporary storage | |
head | the head for your list | |
member | the name of the list_struct within the struct |