contributed by < Jacobchen142
>
說好的進度呢?
老師抱歉,因為我發現我有太多基礎需要補上,所以一直沒開始做作業
list_head
為 doubly-linked list 的 head 或是 node
element_t
為 doubly-linked list 的 element
list_head
結構。list_head
結構則是嵌入在自定義的結構中,本次作業中即為element_t
list_head
的指標,透過malloc()
建立該指標list.c
所提供的INIT_LIST_HEAD()
進行初始化l
(指向開頭的指標) 為NULL
則直接return
l
之外還有其他list_head
的節點,利用list_del()
移除節點的連結,再透過list_entry()
找到串列節點的位置,用q_release_element()
釋放記憶體l
free()
釋放l
head
或s
為NULL
的情況malloc()
取得節點所需的記憶體空間,要注意malloc()
失敗的情況list_add()
加入串列中strcpy()
想法 1:比照q_insert_head()
的方法
想法 2:直接利用q_insert_head()
來實作
head
為NULL
或是串列為空的情況list_first_entry()
取得第一個節點的記憶體位置,並用list_del()
從串列中移除該節點sp
head
為NULL
或是串列為空的情況list_last_entry()
取得第一個節點的記憶體位置,並用list_del()
從串列中移除該節點sp
prev
和next
)走訪串列。當兩個指標相遇或是即將交錯位置,即可判斷中心節點。value
相同之節點一定是相鄰的。順著串列的next
方向走訪,若相鄰的兩個節點內容一樣,則刪除當前節點。list_for_each_entry_safe()
走訪串列,並定義兩個布林變數紀錄狀態:equal
,表示相鄰兩節點之字串內容是否相同;flag
,表示前一次的equal
equal
或flag
為其一true
,表示當前的節點為與下一個或前一個相同,刪除該節點head->prev
)時,equal
必為false
(equal
中有定義當前節點的next
不能是head
的條件),所以要另外單獨用flag
判斷head
的next
方向開始走訪,每經過一個節點便將該節點加到head->next
q_reverse()
q_reverse()
的參數是串列的開頭,所以呼叫q_reverse()
之後,下次若要再次呼叫該函式,要傳入的引數是尚未做q_reverse()
節點的前一個(第14行)執行命令make valgrind
會發現以下訊息
關鍵字still reachable
,根據Valgrind FAQ可得知,當still reachable
發生時,程式可以正常執行但是仍有指標指向未釋放的記憶體。再參考yanjiew的筆記,發現是qtest.c
中的q_quit()
第一行就直接return true
,移除該行程式即可