contributed by < amyhsieh16
>
linux2020
lab0-c
queue.[ch]
和連帶的檔案
q_new
:建立新的「空」佇列;q_free
:釋放佇列所佔用的記憶體;q_insert_head
:在佇列開頭 (head) 加入 (insert) 給定的新元素 (以 LIFO 準則);q_insert_tail
:在佇列尾端 (tail) 加入 (insert) 給定的新元素 (以 FIFO 準則);q_remove_head
:在佇列開頭 (head) 移除 (remove) 給定的元素。q_size
:計算佇列中的元素數量。q_reverse
:以反向順序重新排列鏈結串列,該函式不該配置或釋放任何鏈結串列元素,換言之,它只能重排已經存在的元素;q_sort
:以遞增順序來排序鏈結串列的元素queue_t
q_size
和 q_insert_tail
在 條件下完成,新增
size
:紀錄 queue的元素數量tail
:紀錄 queue最後一個元素的記憶體位置q_new
head
及 tail
為 NULL, size
為 0q_free
NULL
時,不進行 freeq_insert_head
NULL
或沒有配置動態記憶體
,回傳 false
malloc
函數後,須確認是否成功,若否則須回傳 false
strcpy
而使用 strncpy
size
, tail
的設定q_insert_tail
NULL
或沒有配置動態記憶體
,回傳 false
malloc
函數後,須確認是否成功,若否則須回傳 falsestrcpy
而使用 strncpy
size
, head
的設定q_remove_head
NULL
或 empty
時,回傳 falseq_size
NULL
或為 empty
時,回傳0q_reverse
queue
是 NULL
或 empty
時,不進行 reverse
head
開始,改變其 next
的位置curr
: 要修改的元素prev
: 下一個要修改的元素tmp
: 暫存 prev->next
考慮以下的修改:
要點:
{ ... }
裡頭只有 return
或變數指派的話,可縮減 {
和 }
的使用;tmp
的 scope,不僅視覺上更清晰,而且日後引入 foreach 巨集 (Linux 核心原始程式碼的風格) 時,會更容易;amyhsieh16已修正
1. commitac17c81
2. commit7b414e6
q_sort
你需要解釋,為何會超時?
Approach 2: 使用 Merge Sort
merge
函式時,在 trace-15-perf
一項中沒有得分,利用 $ make valgrind
發現 stack overflowmerge
函式縮減上述程式碼:
for
迴圈改寫原本的 while
敘述,這樣之後可用 foreach 巨集改寫,而且會更清晰;merge
和 mergesort
都以遞迴實作,但其實可減少遞迴次數;amyhsieh16 1. 已修改,請參閱commit 83a3277
for
迴圈實作 merge
函式$ make SANITIZER=1
qtest
實作的記憶體錯誤,Massif 視覺化 “simulation” 過程中的記憶體使用量,需要設計對應的實驗