contributed by <I-Ying-Tsai
>
這題要求我們利用 list_insert_before
涵式來測試好品味的 linked list
結構
根據 list_insert_before
涵式的要求,可以得到:
AAAA : &l->head
, 因為涵式接受的是 Node** head
<所以我們需要傳入的是 head
的地址,而 head
又是第一個節點的地址,這也是指標的指標的應用。
BBBB : before
, 因為在 list_insert_before
函式中,我們希望在 entry
之前插入新節點 new_node
,因此我們需要確保 new_node
指向 entry
,而前一個節點(prev
)指向 new_node
。
CCCC : &(*p)->next
, 因為我們希望透過 pointer to pointer (Node** p)
來修改鏈結串列的結構,特別是當 entry
不是 head
的情況下,我們需要找到 entry
的前一個節點,並調整它的 next
指標,讓 new_node
正確插入。
DDDD : item->next
, 因為 *p = item;
讓 prev->next
指向 item。 item->next = before;
讓 item
連接到 entry
。
這段程式碼的目的是 在單向鏈結串列中,找到 entry
,並在其之前插入 item
。
block_t
:
size_t size;
:
記錄當前記憶體區塊的大小。
struct block *l;
:
指向 左子節點(left child),即 小於當前區塊大小的記憶體區塊。
struct block *r;
:
指向 右子節點(right child),即 大於當前區塊大小的記憶體區塊。
find_free_tree()
:
搜尋 target
在 free tree
中的位置,回傳指向該區塊的指標。這個函式的作用是幫助 remove_free_tree()
定位到 target
在 二元搜尋樹(BST
) 中的節點,以便進行刪除或合併。
find_predecessor_free_tree()
:
尋找小於 node->size
的最大節點。這個函式的結果用於 刪除 target
節點時,找到適合替換 target
的節點。
remove_free_tree()
從二元搜尋樹(BST
)中移除 target
,並確保 BST
結構保持完整。
刪除一個節點時,可能發生三種情況:
1.target
沒有子節點 → 直接刪除。
2.target
只有一個子節點 → 讓 target
的父節點直接指向 target
的子節點。
3.target
有兩個子節點 → 找到 target
的 predecessor
來替代 target
,保持 BST
屬性。
EEEE : (*pred_ptr)->r
, 因為它會走訪 target
節點的 左子樹,找到其中的最右節點。
FFFF : pred_ptr
, 因為它代表如何向右子樹移動,即應該指向 pred_ptr
的 右子節點,直到找到最右節點。
這段程式碼的目的是 管理樹狀結構的記憶體區塊,其中 block_t
作為 二元搜尋樹(BST
)節點,用來管理空閒記憶體區塊(free block
)。主要功能包括:
find_free_tree()
:在樹中尋找 指定大小的記憶體區塊。
find_predecessor_free_tree()
:尋找 指定節點的 predecessor
。
remove_free_tree()
:從 BST
中 移除記憶體區塊,並維持 BST
屬性。
補完程式碼:
node_t
:
value
:儲存節點的值(數值)。
list
:使用 Linux Kernel list_head
來管理鏈結串列。
list_entry
:
ptr
:指向 struct list_head
的指標(即 next
或 prev
)。
type
:包含 struct list_head
的結構體類型(如 node_t
)。
member
:struct list_head
在 type
結構中的成員名稱(如 list
)。
它會從 list_head
的指標 ptr
,計算出 type
結構體的起始位置。
GGGG : head->prev
, 因為需要確保雙向鍊結串列可以閉合。
HHHH : list_entry(pivot,node_t,list)->value
, 因為它要取出 pivot
節點的 value
。
IIII : list_entry(n,node_t,list)->value
, 因為它要取出 n
節點的 value
。
JJJJ : pivot
, 因為當快速排序拆分鏈結串列時,pivot 作為 新的中間點,用來重新組合。
KKKK : right
, 因為這個快速排序是從 right
部分開始排序,所以 right
需要先被放到 begin[i + 2]
。