contributed by < JoshuaLee0321
>
HackMD 提供時間戳記,不需要自行列舉。
注意作業書寫規範:中英文間用一個半形空白字元區隔。
好的
queue.c
的過程q_new
malloc
分配空間給queue,考量到malloc
有機會出錯,那先判斷是不是沒有分配成功,之後再利用 Linux 核心中的 INIT_LIST_HEAD
來把指針指向自己q_free
list_for_each_safe
run 過所有的 item,一個一個節點 release 但這樣會出先 segmentation fault改進你的漢語描述。
後續改成 q_release_element
的內建API
更正版本:
element_t *it = NULL, *safe = NULL;
list_for_each_entry_safe(it, safe, l, list) { q_release_element(it); }
(更新)發現 safe 並沒有初始化成NULL 導致出錯,已修正
(更新)發現 list_for_each_entry_safe 以及 q_release_element 才可以把東西刪除完全
q_insert_head
q_insert_tail
q_delete_head
q_delete_tail
(更)剛開始的實做如下,但這樣會發生我的實做並不是constant time,錯誤還有代釐清
(更)以上課後學習到的新知 (macro) function 為基準 重新製作了 q_insert_##type 在macro 中
(更)已把 q_insert 以及 q_remove 類型的都把它做成macro 方便維護,除此之外還找到了 q_remove_macro
中少加入 if(list_empty(head)) 而導致 segmentation fault
而實際上我就可以只利用四行程式碼來實作
q_delete_dup
linux/list.h
中的 API 跑過迴圈;要注意的事情是,這個function 必須把重複的東西通通刪除掉。由於list_for_each_safe
中的 safe
可以當作 next
來使用,如此一來我們只要
head
中的所有元素it
來觀察是否當前元素與下個元素相同bool not_finished
變數來記錄是否要把當前 it
刪除q_size
jserv
老師撰寫好了q_delete_mid
queue
的長度除以2之後給定一個int cnt
去計算這個list目前到哪裡,但這個實做方法有一個問題,它會花到O(2N)的時間
size
的時間single_p
以及每一次會往後走兩步的 double_p
,在double走到底的時候single會直接在中間
single_p
給移除掉即可q_swap
swap-nodes-in-pairs
中,可以使用 iterative
跟 recursive
的方法實做,而因為有linux kernel 的 API,我選擇使用 iterative
的作法
it
當作 每一次走過的nodeit
往前走一步it
跟 it->next
互換q_reverse
q_reverse
如果使用 Linux 核心的 api 就會非常簡單
q_sort
Valgrind
目前一直卡在 q_insert 的function 並沒有在constant time 處理完畢
除此之外,每一次free佇列都會發生一些問題
(更新) 發先是 q_free 中的safe 沒有初始化
測試時一直發現 trace - 17 一直報告不是常數時間。同時我也很確定我的實作方法為constant time,而經由閱讀 KHLEE 的實作方法,更改了 dudect/constant.c 以及 dudect/fixture 的計算方法後才得到目前的滿分