contributed by < wcc-gh
>
建立空佇列
INIT_LIST_HEAD
建立 list head釋放分配給整個佇列的記憶體空間
list_for_each_entry_safe
逐一走訪並釋放節點value
-> 節點本身element_t *node, *safe;
list_for_each_entry_safe (node, safe, head, list) {
free(node->value);
free(node);
}
safe
設為 NULL , 但我認為不用設初值也能正常運作head
自佇列的開頭處插入新節點
value
value
配置失敗要釋放配置給節點的記憶體value
strcpy
會被偵測為 Dangerous function ,根據建議改用 strncpy
strcpy
應該也沒問題list_add
將節點插入至佇列開頭自佇列的尾端插入新節點
與 q_insert_head
相似,最後呼叫 list_add_tail
將節點插入至佇列尾端
value
複製至指定的 buffer sp
list_first_entry
取得第一個元素位址,並將其移出佇列value
至 sp
value
長度超過 buffer size ,使用 strncpy
,並手動在尾端加入空字元value
複製至指定的 buffer sp
與 q_remove_head
相似,中間呼叫 list_last_entry
取得最後一個元素位址
回傳佇列中元素個數
list_for_each
走訪佇列並計算元素個數刪除佇列中的位於中間的元素
value
-> 元素本身刪除佇列中所有相同 value 之元素
list_for_each_entry_safe
走訪整個佇列bool del = false;
list_for_each_entry_safe (node, safe, head, list) {
if (&safe->list != head && strcmp(node->value, safe->value) == 0) {
list_del(&node->list);
free(node->value);
free(node);
del = true;
} else if (del) {
list_del(&node->list);
free(node->value);
free(node);
del = false;
}
}
如果目前元素與下一個元素 value
相同刪除該元素,並利用一個布林值 del
追蹤與之前的元素是否相同,以便刪除最後一個重複的元素
每兩個元素互相交換位置,若只剩一個節點則保持不動
list_for_each_safe
走訪佇列s
控制每兩個迴圈進行一次交換list_move
讓目前元素與前一元素交換位置bool s = false;
list_for_each_safe (node, safe, head) {
if (s)
list_move(node, node->prev->prev);
s = !s;
}
list_move(struct list_head *node, struct list_head *head)
原本是將節點移至串列的開頭,但實際上是移動至第二個參數的下一個節點,所以用 list_move(node, node->prev->prev)
交換前後節點位置反轉整個佇列
list_for_each_safe
走訪整個佇列,並交換每個元素的 next
prev
指標head
的 next
prev
指標每 k 個元素元素一組進行反轉
count
進行分組,紀錄每組的開頭,並在該組結束時以反轉過的順序接上其他組將佇列元素做升序/降序排序
head
的連結,之後的流程作為單向鍊結串列操作刪除元素使佇列中剩餘元素呈現升序排列
min
,若當前元素比 min
大則刪除該元素q_size
回傳剩餘元素數量刪除元素使佇列中剩餘元素呈現降序排列
max
,若當前元素比 max
小則刪除該元素q_size
回傳剩餘元素數量將一串佇列合併為一個佇列,維持降序/升序排序
q_sort
進行排序q_size
回傳總元素數量