contributed by < chses9440611 >
在 queue_t 增加 size 和 tail 欄位,用來完成在 時間內完成 q_insert_tail 和 q_size
當 malloc queue 失敗時要回傳 NULL
,而一開始讓 q->head
和 q->tail
指向 NULL
這邊要注意的是當新的節點的 value 在 malloc 失敗時要記得將新節點的空間一併釋放。
第二個要注意的是當要插入第一個節點時,要讓 q->tail
和 q->head
指向同一個節點。
要注意的地方跟 q_insert_head 一樣。
當 q 為 NULL
或是 q->size 為0,以及 sp 指向 NULL 時回傳 NULL
要注意要移除的節點的字串長度要跟 bufsize 比較大小,字串長度不可以超過 bufsize - 1
由於在 queue_t 中增加了 size 欄位,使得可以在常數時間內完成
可改寫為以下:
簡潔又清晰 :notes: jserv
經過改寫後:
先讓 q->tail = q->head
可以避免之後再用迴圈來尋找 q->tail
的 overhead。
若用 bottom-up 的方式,會需要 的空間,在 trace-15 會檢測時會超出程式記憶體的容量。若是純用遞迴也會造成 Segmentation fault。於是最後我採取的是用 Top-down 遞迴來均分串鏈,用迴圈來合併分併兩個串鏈,最後在用一個 for 迴圈來尋找 q->tail
。則遞迴式為
藉由 Mater theorem 或是計算可得
mergesort
和 merge
這兩個函式應該在宣告標註 static
,這樣就不會有符號的 visibility 被公開的狀況,有助於編譯器施加最佳化。
:notes: jserv
在使用時,要注意 static function 的宣告和實作要放在同一個檔案 否則會有error: foo_function declared ‘static’ but never defined
在合併時,先尋找第一個節點,並讓 head
指向他,之後再用迴圈的方式來尋找。
但這個函式在節點數來到百萬級時造成程式的 stack 已滿而無法運作
qtest
實作,撰寫獨立的終端機命令解譯器 (可建立新的 GitHub repository)qtest
命令列功能,使其支援單行或多行編輯、歷史命令處理、命令自動補完 (例如輸入 h
之後按下 Tab 按鍵,自動接續補上 elp
,成為完整的 help
命令)。除了整合程式碼外,應當說明 antirez/linenoise 的運作原理,注意到 termios 的運用