contributed by < naihsin
>
依據上述指示著手修改 queue.[ch] 和連帶的檔案,測試後用 Git 管理各項修改,要能滿足 $ make test 自動評分系統的所有項目。
queue.c 僅提供介面 (interface) 但尚未有完整程式實作,需要由學員補完並逐步精進,包含以下:
l
)是否為空l
為空,則代表「沒有」佇列l
不為空,此時佇列有兩種狀態,分別是「空」佇列與「不是空」佇列(也就是佇列裡面有 element )list_for_each_entry_safe
走訪所有包含 list_head 結構的 element entryq_release_element
把每一個 element free 掉l
free 掉element_t
大小給 ptr 指標list_add
把 ptr 指向 list 成員的位址加入到 list headstrlen(s) + 1
大小給 ptr->value ,包含空字元s
複製到新的 element 中element_t
大小給 ptr 指標list_add
把 ptr 指向 list 成員的位址加入到 list tailstrlen(s) + 1
大小給 ptr->value ,包含空字元s
複製到新的 element 中list_entry
找到從 head 數來的第一個 element entry 的位址list_del_init
把剛剛找到的 element 的 list 成員 從 list 中移除list_entry
找到從 tail 數來的第一個 element entry 的位址list_del_init
把剛剛找到的 element 的 list 成員 從 list 中移除q_insert_head
, q_insert_tail
中,分別 malloc 整個 element
結構與 element->value
,使用到兩次 malloc ,在釋放 element 也必須把這兩個結構 free 掉list_for_each
走訪 list 所有的節點list_for_each
是一個 macro ,展開為list_del_init
把慢指針從 list 中移除list_entry
找到慢指針被存放到 element 結構的位址q_release_element
把找到的 element releaselist_move
把 left 節點從 list 中移除,且再把 left 加入到 right 在 list 中的下一個位址,如此一來就可以達成 swap 兩個節點的操作list_for_each_safe
走訪 list 中的所有節點list_move
刪除節點若為 singular,不需要繼續處理。
q_merge
的結束條件q_merge
來切割節點直到剩下一個節點q_merge
會回傳已經排序好的節點q_delete_mid
q_mergefinal
把左邊與右邊的 list 排序合併pointer to pointer
目的是為了減少記憶體的分配**ptr
,讓 ptr 紀錄 head 的記憶體位址,以便根據要修改當前節點的記憶體位址來變更 ptr**node
,讓 node 紀錄即將要加入 list 的節點的記憶體位址,一開始設成 NULLlist_entry
找到 left 跟 right 所在的 element 結構的記憶體位址&left
也就是 left 節點所處的記憶體位址&right
也就是 right 節點所處的記憶體位址*node->prev = prev
也就是把 left->prev = prev
或 right->prev = prev
,把 node 與前一個節點的關係接上left = left->next