列表中的节点引用了列表中的前一个节点和下一个节点。
函数获取列表的第一个节点。所以这个第一个节点没有前一个节点。
在此声明中
list->prev=allocate();
创建了前一个节点,因为它从函数名开始,它将一个新节点推到列表的开头。
在此声明中
list->prev->next=list;
表达式list->prev 产生新创建节点的地址。此创建的节点应指向列表的当前第一个节点。因此它的数据成员next应该包含节点list的地址。
还有这句话
list->prev->next=list;
这样做。
如果引入一个中间变量可以想象的更简单。
例如
Element_t *new_node = allocate();
list->prev = new_node; // list->prev=allocate();
new_node->next = list; //list->prev->next=list;
list = new_node; //list=list->prev;
return list;
至于这个问题
这是什么意思:f->next->prev=f->prev?
然后看起来节点f 已从列表中删除。现在它的下一个节点(f->next)不会指向f,而是指向f的前一个节点。
再一次,如果引入中间变量会更清楚。
Element_t *previous_node_of_f = f->prev;
Element_t *next_node_of_f = f->next;
next_node_of_f->prev = previous_node_of_f; // f->next->prev=f->prev
如果还要添加这样的语句
previous_node_of_f->next = next_node_of_f;
然后节点 f 将从列表中完全删除。
--------------------------------------------------------
| prev ^
| |
---------------------- ---------------------- ----------------------
| previous_node_of_f | | f | | next_node_of_f |
---------------------- ---------------------- ----------------------
| ^
| next |
-------------------------------------------------------