contributed by < bclegend
>
brian049
感謝建議,已改進。
q_free
和 q_remove_head / q_remove_tail
函式時可以藉由 -
或是 *
等等列點式來讓整段文字易讀。q_sort
函式缺少解釋。Add q_size
以及 Modify q_size
,可以在後者的 commit message 當中補述為什麼要那樣改程式碼。
感謝建議,已依照建議更新 commit 2766e40 。
q_reverseK
函式解釋當中有添加圖示使整體解釋更明瞭。注意細節,上方的空白。
閱讀指定的教材了嗎?若是,列出過程中遇到的問題。
在測試程式碼時在 TESTING trace trace-17-complexity
卡住,而無法結束測試。
command 是「命令」,而非「指令」(instruction)
編寫完程式後需要使用以下命令指令 ,使程式碼排版符合規範。
宣告一個新的佇列。
避免非必要的項目縮排 (即 *
和 -
),以清晰、明確,且流暢的漢語書寫。
宣告一個新的佇列並將 list_head
大小的空間分配給新的佇列,並判斷該佇列是否成功分配。
將佇列結構中指向下一個以及前一個節點的指標 prev
和 next
宣告在該新佇列之中。
問題
if(!q_empty)
?參閱作業系統教科書關於 slab 的描述
釋放在佇列中的節點,並釋放佇列。
避免非必要的項目縮排 (即 *
和 -
),以清晰、明確,且流暢的漢語書寫。
首先需要確認佇列是否存在。
宣告指標 entry
用於指向目前的節點和指標 safe
用於指向下一節點。
利用 list_for_each_entry_safe
來經過佇列中的每個節點,運用 list_del
來刪除節點於佇列中的連結,並使用 free
來釋放該節點的記憶體。
在刪除完佇列中的節點後,釋放節點 head
的記憶體。
問題
return;
是否合理?會有什麼表現?free(entry)
會讓佇列無法釋放節點?
提供 GDB 實驗步驟和分析
將新的節點插入佇列的頭部/尾端。
函式 q_insert_head
運用 list_add
將目標節點加入佇列頭部,而函式 q_insert_tail
運用 list_add_tail
將目標節點加入佇列尾端。
避免非必要的項目縮排 (即 *
和 -
),以清晰、明確,且流暢的漢語書寫。
首先需要確認佇列是否存在。
宣告一個新的 element
並將 element_t
大小的空間分配給新的 element
,並確認 element
是否配置成功。
將目標字元指標 s
指配到新的 element->value
中,並確認是否成功指配。
利用 list_add
或是 list_add_tail
將 element
加入到佇列之中,並回傳 true
回報 element
已經加入佇列之中。
在中文敘述中,使用全形標點符號,例如該用「,」,而非 ","
問題
strdup
?查閱 Linux man page,避免看 cppreference.com 網站,因為後者是舊的副本。
The
strdup()
function returns a pointer to a new string which is a duplicate of the string s. Memory for the new string is obtained withmalloc(3)
, and can be freed withfree(3)
.
將佇列頭部/尾部的節點從佇列中移除。
函式 q_remove_head
運用 head
中的 next
成員指定目標節點而函式 q_remove_tail
運用 head
的 prev
成員指定目標節點 。
避免非必要的項目縮排 (即 *
和 -
),以清晰、明確,且流暢的漢語書寫。
首先需要確認佇列是否存在以及佇列是否為空的佇列。
宣告一個新的指標 node
將 head->next
或是 head->prev
指派到 node
宣告一個 element_t
的指標 element
,並將 node
的進入點指派到。element
中,
將該節點中的字串依照設定的長度 bufsize
複製到字元指標 sp
中,並在字元最後加入 \0
。
使用函式 list_del
刪除該節點在佇列中的連結。
問題
strncpy
?The strndup() function is similar (with
strdup
) , but copies at most n bytes. If s is longer than n, only n bytes are copied, and a terminating null byte ('\0') is added.
參考 Risheng1128
提供的範例中以下程式碼作用為何?
測試:
1.以下實際作用為何?
2.若 strncpy
已經在末端加入 ('\0') 那 sp[bufsize - 1] = 0;
的目的為何?
有疑慮就該去做實驗並分析。
計算在佇列中有幾個節點 。
避免非必要的項目縮排 (即 *
和 -
),以清晰、明確,且流暢的漢語書寫。
首先需要確認佇列是否存在。
指派 0
到新宣告的整數 count
中。
使用函式 list_for_each
訪問每一個節點,每存取訪問 一個節點就將 count
加 1
,計算出在佇列中的節點數量。
access 的翻譯是「存取」,而非「訪問」(visit)
刪除在佇列中間的節點。
設計流程 : 從 head
由前往後和由後往前出發,當這兩個指向同一個位置時這個位置會在佇列的中間,因此我們只需要刪除這個節點,就能達成我們所期望的效果。
首先需要確認佇列是否存在。
並同時宣告兩個指標 move_head
以及 move_tail
,並分別指派 head
到指標之中。
在迴圈中同時移動 move_head
到 next
的位置以及移動 move_tail
到 prev
的位置,並在 move_head->next
與 move_tail->prev
指向同一個位置時或是 move_head->next
指向 move_tail
時離開迴圈。
將 move_head
移動到下一個節點,並刪除且釋放該節點。
對照 Dictionary.com 對 implement 一詞的解釋:
「實作」會是符合上述 "implement" 語意的譯詞,取「起」以「創作」的意思,而「製造」本質上是固定輸入並通常產生固定輸出的行為。
根據 wanghanchi 的筆記中提到的,q_delete_dup
是針對已經排序過後的佇列進行刪除有重複字串的節點,因此在實作實做 時我們需要比較下一個節點上的字串即進行刪除。
用函式 list_for_each_entry_safe
(Iterate over list entries and allow deletes) 組成巢狀迴圈比對每個節點中的數值是否一致,若一致則刪除該節點。
問題
在程式碼中若缺少條件 entry->list.next != head &&
會造成錯誤 Segmentation fault occurred. You dereferenced a NULL or invalid pointerAborted (core dumped)
的原因為何?
在 lab0-c/list.h
中 list_for_each_safe
和 list_for_each_entry_safe
的描述如下
deletes 和 deletions 有什麼差別?
將佇列中的節點從頭到尾進行兩兩交換。
依序經過佇列中的每個節點與下一個節點進行交換。
首先需要確認佇列是否存在。
宣告一個新的指標 node
並利用函式 list_for_each
讓該指標經過佇列中的每個節點。
在經過節點時將節點與節點所指向的下一節點進行交換。
若缺少以下判斷式,原程式碼會將佇列頭部以及尾端進行交換,而這不是我們所希望的效果。
在 q_reverseK
完成的情況下,使用以下程式可以達成與 q_swap
一致的結果。
將佇列中所有的節點反向。
在使用函式 list_for_each_safe
時,會將指標 safe
指向 node->next
並且由於函式 list_for_each_safe
支持在迭代中移除節點的操作,因此選用此函式對用在該實作中。
首先需要確認佇列是否存在。
接著宣告兩個指標 node
以及 safe
並在引用函式 list_for_each_safe
時將 node
指向 head->next
並將 safe
指向 node->next
。
接著在每次的迭代中會先將指標 safe
指向 node->next
的位置,並對調 node
中指向前後節點的位置。
最後由於迭代結束後節點 head
沒有被改動到,因此另外將節點 head
指向前後節點的指標 所指向的位置進行對調。
將在佇列中的節點以 k
為一組進行反轉,直到剩餘的佇列不足 k
個節點
首先需要確認佇列是否存在。
接下來宣告 nhead
並初始為 LIST_HEAD
,另外計算 times
為該佇列需要反轉段落有幾段。
再來宣告 temp1
以及 temp2
並初始為 LIST_HEAD
,作用分別為在每一次的迭代中將 head
所指向的佇列中首個節點放到 temp1
所指向的佇列中,接著將 temp1
中的節點插入到 temp2
所指向的佇列中的前方,重複直到執行 k
次。
並將 temp2
指向的佇列插入 head
指向的佇列尾端,並將 temp2
所指向的佇列插入 nhead
所指向的佇列 times
次後,將 head
所指向佇列 head
剩餘的節點插入 nhead
所指向的佇列的尾端。
以清晰、明確,且流暢的漢語書寫。
將佇列中的元素沿著下降/上升方向排列,若有為反規則的元素存在,則刪除該節點。
參考 Leetcode 中的解法,但由於此實做使用的是雙向鏈結串列,而原題中使用的是線性單向鏈結串列,因此在函數的開頭需要先反轉鏈結串列。
以清晰、明確,且流暢的漢語書寫。
以清晰、明確,且流暢的漢語書寫。
此函數的作用是將所有連結在一起的環狀鏈結串列合併到第一個節點中,同時將其餘的鏈結頭重新初始化以確保它們是空的。
避免非必要的項目縮排 (即 *
和 -
),以清晰、明確,且流暢的漢語書寫。
list_sort.c
為 linux 核心中實作的 merge sort 檔案
在執行 list_sort
函式時,在開始排序前會先將環狀雙向鏈結串列轉換為 null-terminated
的單向鏈結串列,並最後使用函式 merge_final
在最後一次的 merge 後轉換回原本的環狀雙向鏈結串列。
根據 A GNU Manual 在函式定義時,檢查在位置 (2,3,4)
輸入的參數為 non-null
的指標。
基於 lib/list_sort.c 中的架構,將該架構修改符合 queue.c
的架構。