# 2025q1 Homework2 (quiz1+2)
contributed by <As7r1d
>
AAAA
:&list->head
BBBB
:before
CCCC
:&(*p)->next
DDDD
:item->next
測試程式簡述
在了解測試程式目的後,接下來了解串列架構:
list_item_t
表示串列的節點。其中 value
表示節點儲存的數值,next
則表示指向下一個 list_item_t
節點的指標(若為 NULL,表示是最後一個節點)。list_t
中 head 表示指向串列的第一個節點。如果 head 是 NULL,表示鏈結串列為空。了解 list_insert_before
函式
list_insert_before
目的:在這個函式中有一個單向鏈結串列 l
,將 item 插入 before 節點之前。
list_item_t **p
:p 是個變數指向 list_item_t *
指標的指標,一開始會指向 head。在 for loop 中,要找到要插入位置 before 節點,如果找到就離開迴圈,沒有找到就繼續尋找。這種指標的指標方法不需要透過特例判斷也可以正確處理插入在鏈結串列頭部或中間的情況。
接下來用圖解方式一步步解釋,使用指標的指標方式,設定情境是我要在 C 節點前插入節點 X:
p = &l->head
一開始是 p
指向 head 這個指標變數本身的位址,對 p 取值是 A 節點。p = &(*p)->next
。接著對 p 取值是 B 節點。p = &(*p)->next
。對 p 取值是 C 節點。找到before = C。*p = item;
將 p 指向的值改成 &X。item->next = before;
,把 X->next 指向 before(即C)接下來思考 edge case,如果l
是空的,即 l->head == NULL
情況。
list_insert_before(l, NULL, nodeA)
,那麼 before == NULL,所以 *p == before
跳出 for 迴圈,執行 *p = item;
,p 指向的值改為 &nodeAitem->next = before;
,把 nodeA
之 next
改成 NULL。EEEE
:(*pred_ptr)->r
FFFF
:&(*pred_ptr)->r
這題程式碼主要是二元搜尋樹(BST)中刪除節點的功能。
二元搜尋樹特性如下:
節點架構如下:
remove_free_tree()
:該函式目的是從樹中移除一個特定的記憶體區塊 block_t *target
。刪除節點同時保持這棵樹的性質,主要有三種情況:
而我們需要完成 find_free_tree()
該函式
void remove_free_tree