contributed by < PlusThousand0107
>
開發紀錄著重於你的想法、觀察、中間遇到的難題和你如何克服,程式碼應是輔助性質,列出最關鍵的部分即可。
目標: 建立一個空佇列
注意書寫規範:中英文間用一個半形空白字元區隔。
流程:
malloc
對宣告一個大小為 list_head
的記憶體空間INIT_LIST_HEAD()
做初始化目標: 釋放佇列佔用的記憶體
流程:
list_head *l
是否為 NULL,如果是的話就直接結束list_for_each_entry_safe
進行走訪,每過一個節點就用 list_del
做移除並釋放該節點空間,程式碼如下所示*l
的記憶體空間目標: 計算佇列中的節點數量
流程:
list_head *q_head
是否為 NULL,如果是就直接回傳0len
紀錄當前節點數量,並用 list_for_each
進行走訪,每過一個節點就遞增 len
len
目標: 在佇列開頭插入新節點
流程:
malloc
對宣告一個大小為 element_t
的記憶體空間,並將位址傳給宣告的指標變數 node
strdup
將字串複製給 node->value
list_add
將節點加在 head
的後面一位,詳細程式碼如下所示目標: 在佇列結尾處插入新節點
流程:
malloc
對宣告一個大小為 element_t
的記憶體空間,並將位址傳給宣告的指標變數 node
strdup
將字串複製給 node->value
list_add_tail
將節點加在佇列最尾端,除了將 list_add
改成了 list_add_tail
外,其餘均與 q_insert_head
相同目標: 將佇列中鄰近的節點兩兩交換
流程:
a
,並指向 head->next
,再宣告一個指標變數 b
,使其指向 head->next->next
a
和 b
沒有指回到 head
,就會修改它們指的對象,將原先指向 a
的改成指向 b
,指向 b
的改成指向 a
,詳細程式碼如下所示目標: 將鏈結串列以反向順序重新排列
流程:
a
,並指向 head
,再宣告一個指標變數 b
,使其指向 head->next
a
的指標為主,將原本指向 next
的改成指向 prev
,將原本指向 prev
的改成指向 next
,以此方法將順序反轉,直到 a
又回到 head
為止,詳細程式碼如下所示目標: 將佇列開頭的節點移除 (remove)
流程:
head->next
head->next->value
複製到 buffer
中,詳細程式碼如下所示目標: 將佇列結尾的節點移除 (remove)
流程:
head->prev
head->prev->value
複製到 buffer
中,除了將 head->next
改成了 head->prev
外,其餘均與 q_remove_head
相同目標: 將佇列中間的節點刪除 (delete)
流程:
a
,並指向 head->next
,再宣告一個指標變數 b
,使其指向 head->prev
a
往前走,再讓 b
往後走,直到 a != b
或者 a->next != b
,表示已找出中間節點,程式碼如下所示目標: 將鏈結串列以每 k 個節點為一組,進行反向順序重新排列
流程:
list_head *head
不為 NULL 且 k 不能小於 1 ,如果有一個不符就直接結束cnt
紀錄每組節點數量,用 list_for_each_safe
進行走訪,每過一個節點就遞增 cnt
cnt
等於 k 時,會用 list_cut_position
進行切斷,並用上面實作出的 q_reverse
反轉順序,最後再用 list_splice_init
接合回原本的鏈結串列,詳細程式碼如下所示,這裡參考到了 komark06 同學的程式碼目標: 再已排序的狀況下,刪除佇列中內容重複的節點
流程:
list_head *head
是否為 NULL,如果是就直接回傳 falselist_for_each_entry_safe
進行走訪,並用 strcmp
判斷元素的值是否相同,詳細程式碼如下所示,這裡參考到了 yanjiew1 同學的程式碼list_for_each_entry_safe
走訪蒐集到的重複元素,並用 q_release_element
進行刪除