contributed by < joshyue
>
參照list.h中的 INIT_LIST_HEAD
, 將next和prev皆指向head本身。
參照list.h中的 list_for_each_entry_safe
走訪queue中每個元素,利用temp保存下個節點的位置後,透過queue.h的q_release_element
將當前節點之value刪除並釋放,最後才將head釋放。
宣告node_insert物件並配置記憶體,配置失敗回傳false,若成功則利用strdup
根據字串長度配置相對應之記憶體空間後,才將字串複製到物件內的value,同前述若配置失敗則釋放node_insert,回傳false,成功則參照list.h中的list_add
,將node_insert插入至queue最前方。
同q_insert_head
的概念,差別在於list_add
是將node_insert插入到queue最前方,此處改用list_add_tail
,將node_insert插入到queue尾端。
首先先判斷head若為NULL或empty的話,則回傳NULL,再來參照list.h中的list_entry
,取得第一個節點之位址,並透過list_del
刪除第一個節點的連結,並保持斷開位置之前後節點仍相連,再來若sp不為NULL,則將刪除節點之value複製給sp,因strncpy
不會回傳字串結束符'\0',因此最後要在sp的最後補上'\0'。
同q_remove_head
的概念,差別在於將head->next改為head->prev。
若head為NULL或empty,則回傳0;反之則參照list.h中的list_for_each
來遍歷queue的每個節點,並在跳到下個節點時,長度+1,如此走訪完便能得到queue的size。