contributed by < ShallowFeather
>
ItisCaleb
Windows 11 WSL2
利用 malloc
來配置記憶體
並使用 list.h
中的 INIT_LIST_HEAD
來初始化 head
並且進行回傳
如果使用 list_for_each
進行走訪,會導致當釋放掉目前的 pos
時會讓他無法找到下一個節點
因此使用 list_for_each_entry_safe
巨集,此巨集會使用一個額外的 n 來暫時儲存下一個節點的 entry
值,讓他可以在刪除掉目前的節點以後還能夠繼續執行。
改進漢語描述,特別是「每次循環時」這句。
:notes: jserv
而在開始時,需先檢查 l
是否為空,如為空就無須額外處理。
這兩段程式碼的實作方式很相似,都是利用 malloc
函數分配記憶體給新節點,若分配失敗則直接回傳 false
。接著使用 strdup
函數為新節點的 value
成員分配記憶體空間,並將傳入的字串 s
複製到新分配的空間中。若分配失敗,則需要回傳 false
並釋放先前使用 malloc
分配的記憶體空間。最後,呼叫 list_add
或 list_add_tail
函數,將新節點加入到串列中。
改進漢語描述。
:notes: jserv
跟上面一樣 這兩段的實作很相像
目標在於清除佇列的第一個元素,sp
是一個已分配記憶體空間的字元陣列,而 bufsize
是他的大小(長度)。
首先利用 list_del
來刪除第一個元素,並利用 strncpy 去將剛剛刪除的元素中的 value
複製到 sp
中,並且也需要檢查 bufsize
為 0 的情況來避免 bufsize - 1
為 -1
的情況
而 remove_tail 只需要將 head->next
修改成 head->prev
即可
利用 list_for_each
來迭代整個串列並利用 len
變數來計算總共的數量,最後回傳
利用兩個指標一個走的速度是另一個的兩倍,而當跑到最後一項時,較慢的那個指標便會是中間值,參考連結中 Leetcode 的解法
TODO:降低記憶體存取的數量。
:notes: jserv
參考自 Linux 核心實作 (2023): 第 1 週課程 (隨堂測驗)
根據 1:46:30
所說,由於是雙向的,所以可以從頭尾跑。
由於該串列已「排序」,因此只需要利用 strcmp
去檢查目前的節點和下一個節點是否相同,需要注意:
head->next
等於 head
時,會將該節點刪除,導致不符合所求bool
去紀錄紀錄上一個節點是否需要被刪除。迭代整個串列並且對每個節點交換其 next
以及 prev
值
用一個 cnt
紀錄經過的節點數量,當等於 k
時利用 list_cut_position
去切割,而根據 list.h
當中函數的說明中可以得知當第二個參數非空時,會將第一格參數取代。
最後再將執行過 reverse
操作的節點丟回去 tmp
的前面,並將 tmp
設定在 n->prev
的位置上也就是上次切割的點。
參考 itiscaleb 的程式碼
附上對應的超連結。
:notes: jserv
使用 mergeSort
來實作排序首先利用快慢指標找到中點並去做切割。
而後進入遞迴,將其分割成小塊並利用 strcmp
來比較大小並合併。
如果讓他由後跑到前,題目就變成了找出遞增數列。
單純將所有 list
組合起來並直接 sort
。
TODO 利用分治等手段加速該函式
在 console.h
中發現了
之後在 qtest.c
中加入 do_shuffle
當中內容參考 do_reverseK
以及 do_merge
的檢查
呼叫的 q_shuffle
需在 queue.h
中定義並於 queue.c
中實作
不過由於修改到 queue.h
好像跑不過測試QQ
避免帶有個人色彩的發言,更別說「好像」,理工人說話要精準。
:notes: jserv
dudect
的檢查主要分成三部分
process interupt
之類無關的時間剪裁掉或丟棄大於固定的、無關閾值的測量值Welch's t-test
(當 t 值超過某個閾值就能斷定可能存在性能方面的問題)依據作業要求知道缺乏了 percentile
因此將 oreparaz/dudect
當中的程式碼移植到 dudect/fixure.c
當中