contributed by < qiaoyi213
>
注意項目符號的使用,標題用 #
開頭,分項就該以 ##
開頭,並該維護階層關係。
登記在 https://hackmd.io/@sysprog/linux2023-homework1 的網址,要用「固定網址」(參見 用固定網址發布筆記),也就是如 https://hackmd.io/@itsme/XXXX 的形式,設定公開發表。
不用抄題目,善用超連結。
q_new
q_free
q_insert_head
q_insert_tail
q_remove_head
q_remove_tail
q_size
q_delete_mid
q_delete_dup
q_swap
q_reverse
q_reverseK
q_sort
q_descend
q_merge
一開始並不懂 indirect pointer 的用意,看了許久還是不理解為什麼這麼做。
看不懂就該列出教材哪裡沒寫好。不要說「大概懂」,無法應用和指出如何改進就是不懂。
參考 Mes 的筆記 後就大概懂 indirect pointer 的技巧,但在實作上可能還需要熟悉。
寫到一半發現真的對我自己寫的東西很不確定,所以回來重新審視 queue.h
以及 list.h
。
幻滅是成長的開始。
在執行下列命令時
多次出現 Null pointer deference
的錯誤,目前還不知道怎麼解決。
例如:
queue.c:71:22: error: Null pointer dereference: (struct element_t*)0 [nullPointer]
element_t *tmp = list_first_entry(head, element_t, list);
q_new
參考 list.h
中的 INIT_LIST_HEAD
函式,此函式是將 linked list
中的 prev
指標以及 next
指標指向自己,形成一個環形的 linked list
。
q_free
從頭開始依序迭代所有的節點,移除該節點後就釋放該節點記憶體。
利用 list.h
中的巨集 list_for_each_entry_safe
實作 q_free
。
注意資訊科技詞彙翻譯
已將「遍歷」修正為「迭代」
q_insert_head
使用 list_add
巨集新增節點
q_insert_tail
與 q_insert_head
實作方法相似,只是將 list_add()
更換為 list_add_tail()
q_size
遍歷所有節點並且記錄 linked list
的大小。
q_remove_head
目前測試結果仍有錯誤:Probably not constant time or wrong implementation
q_remove_tail
q_delete_mid
使用 slow
指標以及 fast
指標
每次移動 slow
指標一次、fast
指標兩次,即可找到中間的位置。
q_delete_dup
q_reverse
q_reverseK
q_swap
merge_two_list
參考 你所不知道的 C 語言: linked list 和非連續記憶體 後重新實作一遍。
將兩個已排序好的 linked list
合併並排序。
疑惑:在原本的範例中是使用 uintptr_t
,我不清楚為什麼這裡是使用 u_int64_t
才對。
merge_sort
實作 merge sort,並且使用與 q_delete_mid
相同的方法找位於 queue
中間的節點以分治。
q_sort
首先要先將 linked list
斷開連接變成 singular linked list
之後進行 merge sort 之後再重新連接。
q_merge
q_descend
make test
分數:71/100