侵入时双向链表不需要单独进行内存分配,跟随具体结构进行分配,详细数据结构:
typedef structure list_node { struct list_node *next; struct list_node *prev; } list_t;链表初始化
初始化链表,哨兵自己成环。
list->next = list; list->prev = list尾插
将节点node插到list之后,这里需要注意先操作node节点,否则会破坏链表结构,node的后继指针指向list节点的下一个节点,node的前驱指针指向list节点,list节点的后继指针指向node,list的下一个节点的前驱指针指向node。
node->next = list->next; node->prev = list; list->next->prev = node; list->next = node;头插
将节点node插到list之前,这里需要注意先操作node节点,node的前驱指针指向list的上一个节点,node的后继指针指向list,list的上一个节点的后继节点指向node,list的前驱指针指向node。
node->prev = list->prev; node->next = list; list->prev->next = node; list->prev = node;移除
将该节点指向自己成环,并将node的前后两个节点连接起来,并将自己设置成环。
node->prev->next = node->next; node->next->prev = node->prev; node->prev = node; node->next = node;判断链表是否为空,通过判断list的后继指针是否指向自己,也就是当前哨兵是否指向自己。
list->next == list