contributed by < yunchi0921
>
linux_kernel
queue_t
為了讓依題目要求q_size
& q_insert_tail
能再O(1)執行而新增一tail
指標與qsize
再插入與刪除時隨時紀錄。
q_free
因為要同時清除 string 與 list element 所以宣告*cur
與*prev
,每一次while
迴圈中,prev
指向cur
位置,而cur
指向下一個位址,由prev
負責清除,直到cur
指向NULL
為止。
這裡藉由同學幫助發現當我q
為NULL時,沒有返回return,則如果情況發生則會free到一個NULL的位置而產生問題。
修改如下
q_new
根據註解判斷queue是否為空,若不是則初始化各值並回傳。
q_insert_head
這裡值得注意的是tail的連接,實作方式是當queue的size為1時,就將tail指向新element。
這邊也有一個問題,如果當newh->value
配置失敗的時候,我應該free(newh)
並return false
,以避免memory leak。
修改如下,同時q_insert_tail
也相同,不贅述直接修改程式碼。
q_insert_tail
概念基本上跟q_insert_head差不多
q_remove_head
根據註解sp
不為NULL時要將刪除之 string 複製到sp
中,且別忘記清除 string 以及 list element。
這邊有一個問題需要注意
題目要求說,當queue為空以及q為NULL的時候回傳false,但因為我q->qsize
寫在前面的關係,compiler在當q為NULL時,會判定我去讀一個NULL pointer,故應該要寫成以下型式
q_size
題目要求在O(1)時間內執行,所以在queue.h
更改queue_t
新增qsize
以達到此目的。
q_reverse
這邊我參考geeksforgeeks中3個指標的方式,裡頭有一個 gif 檔描述的相當清楚,但與我們不同的是,除了要改變 head ,同時也要改變 tail 。
testmalloc
與testfree
感謝0xff07詳細的解釋
這邊主要對find_header
及find_free
看看有什麼想講的,以及許多不懂的問題。
首先find_header
主要是藉由block_ele_t
的大小來推算出header在哪邊,接下來則是一連串的檢查機制。
這邊ab
指向allocated
這個doubly-linked list的開頭,並且在迴圈中搜尋這個block到底有沒有再這個串列裡頭
這段程式我則不太明白,因為在test_malloc
當中每個new_block的magic_header
都會被指定成MAGICHEADER
,這樣子與上一段的檢查,發現他已經是allocated的一個block,這樣子
b->magic_header
一定會在test_malloc
被指定為MAGICHEADER
才對,有種重複檢查沒有必要感覺。
我猜應該是因為 cautious mode
關閉的時候而存在的機制,不曉得正不正確。