queue.[ch]
和連帶的檔案,測試後用 Git 管理各項修改,要能滿足 $ make test
自動評分系統的所有項目。lab0-c
專案,比較你自己實作的 merge sort 和 Linux 核心程式碼之間效能落差qtest
提供的 web
命令得以搭配上述佇列實作使用,目前一旦網頁伺服器啟動後,原本處理命令列操作的 linenoise
套件就無法使用,請提出改善機制qtest
提供新的命令 shuffle
,允許藉由 Fisher–Yates shuffle 演算法,對佇列中所有節點進行洗牌 (shuffle) 操作,需要以統計的原理來分析你的實作,探究洗牌的「亂度」qtest
中執行 option entropy 1
並搭配 ih RAND 10
一類的命令,觀察亂數字串的分布,並運用「資訊與熵互補,資訊就是負熵」的觀念,設計一組新的命令或選項,得以在 qtest
切換不同的 PRNG 的實作 (可選定 Xorshift),搭配統計分析工具,比較亂數產生器 (如 Xorshift vs. 內建) 的品質q_new
q_free
q_insert_head
q_insert_tail
q_remove_head
q_remove_tail
q_size
使用 malloc
函式進行記憶體配置,若配置記憶體空間失敗則回傳 NULL
,使用 queue.h
及連帶的 list.h
中所提供的巨集與函式。以 INIT_LIST_HEAD()
取代將 next
和 prev
都指向自身 (head
) 的初始化實作。
最初以 list.h
中提供的 list_for_each_safe()
來走訪節點,並以q_release_element()
來釋放走訪到的節點,但在編譯時卻產生出 error: passing argument 1 of ‘q_release_element’ from incompatible pointer type 。經檢查後發現 q_release_element()
中的 expected type 應該要為element_t *
,且 struct element_t
才有包含 char
與 *value
的變數宣告。
改進方案: 改以 element_t *
宣告 entry
和 safe
,並且以list_for_each_entry_safe()
取代 。list_for_each_safe()
確認 head
是否為空,以及確認 ele
記憶體配置是否成功後,宣告新增字串的長度 (包含\0
) 並串接字串 s
。使用 list.h
中提供的 list_add()
將新增的節點加入至串列的 head
。
以 q_insert_head()
為基礎,僅將 list.h
中提供的 list_add()
改為 list_add_tail()
。
使用 list_first_entry()
取得 queue 中的第一個節點後,以 list_del_init()
來移除找到的第一個節點,並將移除之節點中所包含的字串存於 sp
,最後再回傳這個被移除的節點。
以 q_remove_head()
為基礎,僅將 list.h
中提供的 list_first_entry()
改為 list_last_entry()
,即為找到並取得 queue 中的最後一個節點。
使用 list_for_each()
來走訪所有的節點,並參照 L01: lab0 來實作此介面。
參考 你所不知道的 C 語言: linked list 和非連續記憶體 ,並以 Leetcode 2095. Delete the Middle Node of a Linked List 案例,應用快慢指標的技巧,並刪除找到的中間節點。
走訪每個節點,並檢查每個節點往後至尾端的最後一個節點,檢查節點之中是否存在相同的字串。