contributed by <roger90810
>
在給的 code 中沒有 list_make_node_t 這個 function,經過分析後得出此 function 為加入新的 node 到目前 list 的前面,並回傳目前 list 的第一個 node,因此自己加入 list_make_node_t :
此時已經可以透過 list_display 印出整個 list 的值
NULL
, EXIT_FAILURE
, EXIT_SUCCESS
macro
在 C11 規格書中的 7.22 General utilities <stdlib.h> 提到 :
The macros defined are NULL (described in 7.19);
EXIT_FAILURE
and
EXIT_SUCCESS
which expand to integer constant expressions that can be used as the argument to the
exit function to return unsuccessful or successful termination status
#include <stdlib.h>
NULL
的定義則是在 stddef.h
中,但 stdlib.h
中已經有 #include <stddef.h>
,所以可以不用自己再 include 一次實際去查看 stdlib.h 中發現這兩個 macro 其實就是定義一個常數,和一般寫的 return 0
; 是一樣意思
實作 free_list
list_free
,但並沒有實作valgrind
測試確實 free 掉 listvalgrind 輸出結果:
quicksort 使用 divide and conquer 的方法,先將問題拆成多個子問題,解決子問題後,再將這些子問題合併,因此朝這個方向去思考,程式應該可以分成兩個部分
由以下程式碼可得知 pivot 的選擇為 list 的第一個元素
pivot->next = NULL
即可拆出只有 pivot 這個節點的 listlist left
,此 list 中所有節點的值皆小於等於 pivot 的值
list right
,此 list 中所有節點的值皆大於 pivot 的值
while loop 的部分,就是如何拆出 left 和 right 這兩個 list
list_add_node_t
的用途為插入一個節點到 list 的前面,因此可推出這邊是要將節點 n 插入到 list AAA
或 list BBB
的前面n->value > value?
,也就是和 pivot 的值比較來決定,因此可得出
list right
,並且 n 成為 list right
的第一個節點list left
,並且 n 成為 list right
的第一個節點所以得出
(e) &right
(c) &left
left
, pivot
, right
三個 list首先分析 list_concat
的作法
next
接到另一個 list 中第一個節點即可最後一個節點的 next,此時為 NULL
NULL 改成 list2 的第一個節點
,就會使 list1 的最後一個節點接到 list2 的第一個節點,即可完成 concat所以得出
(c) left = &((*left)->next);
分析完 list_concat 的方法後,即可得知只要依序將 left, pivot, right 接起來,就可以得到遞增順序排序的 list
所以得出
(b) list_concat(&result, pivot); list_concat(&result, right);
經過程式碼驗證,可得到正確結果
完整程式碼: