#include Lista duplamente encadeada: next e prev. Apontando sempre pra uma list_head. Uso de container_of. Evita o uso de um ponteiro. Facilita a alocação. Uma lista vazia tem um head apontando pra si mesmo. Declaração de head: LIST_HEAD(head); struct data { ... struct list_head l; ... }; INIT_LIST_HEAD(&data->l); list_add(&data->l, &head); list_add_tail(&data->l, &head); list_del(&data->l); list_empty(&head); struct list_head *e; list_entry(entry, struct data, l); list_first_entry(&head, struct data, l); Macros para iteração: struct list_head *e; list_for_each(e, &head) { struct data *data = list_entry(e, struct data, l); } struct data *data; list_for_each_entry(data, &head, l) { } list_for_each_safe (uso de list_delete) construção while (list_empty) list_delete