contributed by < paul90317
>
1
快速排序程式碼填空
list_first_entry
的輸入是節點 head
,輸出是 entry
所以會用到 container_of
,故 AAA
是 struct item
,BBB
是 list
。
CCC
是 list_for_each_entry_safe
。
DDD
這個程式碼發生在 itm
比 pivot
小時發生。題目要求是該排序演算法要是 stable,所以應填入 list_add_tail
。
EEE
同 DDD
,也是 list_add_tail
。
FFF
可以看出程式碼想要以 list_less
, pivot
, list_greater
建立新的 list 於 head
,所以要填 list_splice_tail
。
在 DDD
FFF
的程式碼中,忘記把 itm
從原本的 list 中移除,正確答案應該要是 list_move_tail
。
如果要填 list_add_tail
,就要在分割結束串接之前加上 INIT_LIST_HEAD(head)
。
參考:as200188
2
GGGG
是 list_for_each_entry_safe
HHHH
是 list_add_tail
IIII
是 &stack[++top]
JJJJ
是 &stack[++top]
KKKK
是 &tmp->list
1. 解釋上方程式碼運作原理,指出設計和實作的缺失
list_add_tail
以達到 stable sort 的目的。if (!list_empty(!list_empty(&partition)))
以防止將空的 list 推入並造成無窮迴圈。3
根據題目說明,要把前一節點和後一節點的指標做相連,LLLL
是 a & b
上方巨集迴圈初始化部分會將 node 直接指派成 list->head.cmp
,這意味著第一個節點 (first entry) 不是 list->head
,而是 list->head
的下一節點。
rp
是上一節點的指標,所以在迴圈迭代下一節點是 rn = address_of(rp, node->cmp)
。
當 node
是 &list->tail
的時候,會跳出迴圈,因為它的容器是 xor_list_t
而非自訂義容器 struct test_node
。
上方巨集的走訪方向與 xorlist_for_each
相反。
上方巨集定義了初始節點 pos2
,需要再給它 pos1
以獲得下一節點。
上方巨集的走訪方向與 xorlist_for_each_from
相反。
real_next
是 n
的下一個節點,在一般的情況下它是原本的第一個節點 node
,但在沒有節點時它是 tail,故 MMMM
是 &list->tail
。
PPPP
是 node->cmp