該列表的節點具有對前一個節點和列表中下一個節點的引用。
該函數獲取列表的第一個節點。所以這個第一個節點沒有前一個節點。
在這份聲明中
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->下一步 - >先前= F->分組?
那麼它看起來像是從列表中刪除節點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 |
-------------------------------------------------------
https://www.cs.cmu.edu/~adamchik/15-121/lectures/Linked%20Lists/linked%20lists.html好解釋 – edtheprogrammerguy