contributed by < DaDa0413
>
其他學習心得: Makefile閱讀筆記
前面6個 function 花一點時間便完成,但 q_sort() 重做了1次又debug一整天
中英文之間需要以一個半形空白字元區隔 (即
),在作業要求已清楚描述,務必遵守。
快去改!
建立一個新的 Empty queue
除了要釋放 queue 的 header ,也要釋放所有 list element 的記憶體空間。
遇到 NULL queue 便直接回傳false
。
否則便回傳true
分配記憶體給新的element,以及維護queue的架構。
直接在 insert 以及 remove 時紀錄 queue 的大小,來讓 q_size() 能達成 O(1)
使用current_ptr
、prev_ptr
和next_ptr
,來指向當前的 element ,前一個 element 以及下一個 element ,再將current_ptr
的指標方向從next_ptr
轉向prev_ptr
。當全部的 element 完成以後,再將 queue 的 head 以及 tail 轉向。
目前使用的字串比較函式是strcmp()
,而排序方法為 bubble sort ,但是當我測試trace-15-perf.cmd
時,花了10分鐘仍然跑不出來,因此首先我將會把 strcmp 改成作業說明所提及的 natural sort,
發現 bubble sort 真的慢
interval
,初始為1,用來表示當前要 merge 的 sub-list 的長度,每一次合併(稱為一個 round )兩個長度為interval
的 list ,合併完成後在合併下兩個 sub-list ,當整個 list 的 sub-list 都被合併以後,將interval
乘以2,並再重複上述動作prv
:指向上一 round 的最後一個 elementnxt
:這一 round 的下一個 elementcur1
:要合併的第一個 sublistcur2
:要合併的第二個 sublistProblem:
以及
會出現 char *s 以外的亂碼
Solution:
查閱網路 Cplusplus 上,查閱到 strncpy() 的錯誤使用方法,strncpy() 並不會自動在字串結尾加入'\0'
。
ISO/IEC 9899:201 提到關於 strncpy 的敘述:
The strncpy function copies not more than n characters (characters that follow a null
character are not copied) from the array pointed to by s2 to the array pointed to by s1.
但沒有講明是否有複製 '\0'
,因此最後在他人整理過得資料字串長度、複製、串接中得出需要自行加入
查閱資料需要指明出處,並儘量以第一手資料為主,說好的 C 語言規格書呢?
Problem:
Solution:
使用 Valgrind 分析
很明顯的告訴我們,在q_insert_head()
被 allocate 的 block 還是 reachable 。因此得知, Free 一個 list element 時,不會將被 allocate 的空間也自動 free 掉,因此必須要
Problem:
執行 trace-07-robust.cmd ,測試 insert head to NULL queue 時,不斷發生 segmentation fault 。即使在q_insert_head()
的最後一行加入
仍可以正常的印出字串
Solution:
運用 Valgrind ,分析記憶體 Segmentation fault 的原因,發現出錯的地方式在 qtest.c 的
開始去思考此 q 跟我在q_insert_head()
中引入的q是否視同一個。
才發現搞錯題目的意思,當insert head或insert tail遇上 NULL queue 時,直接返回 fasle 即可,不須額外的q_new()
,因此對q_insert_head()
做以下更動
文字訊息不要用圖片展現,可善用 diff -up
輸出程式碼之間的差異。