contributed by < st9540808
>
修改 queue.h
queue.c
來實作一個支援 FIFO 和 LIFO 的 queue
q_new()
: 建立一個空的 queue
q_free()
: 釋放 queue 的所有記憶體資源
q_insert_head()
: 在 queue 的頭插入一個元素 (LIFO)
q insert tail()
: 在 queue 的尾插入一個元素 (FIFO)
q_remove_head()
: 在 queue 的頭移除一個元素
q_size()
: 回傳 queue 的元素個數
q_reverse()
: 反轉 queue 中元素的順序,必須是 in-place,不能呼叫 malloc()
和 free()
Note:
value
必須使用動態分配q_insert_tail()
和 q_size()
的時間複雜度必須是 struct queue_t
queue_t
裡新增兩個 field : tail
和 size
以達成 的時間複雜度。
q_new()
建立一個空的 queue,同時也需要檢查 malloc 是否成功。
q_free()
釋放傳入 queue 所有元素的記憶體資源,value 因為是動態分配的所以也必須同時釋放。
q_insert_head()
在 queue 的頭插入一個元素,這裡也要檢查 malloc 是否成功。但在用 qtest 在評分時 trace-11-malloc 一直回傳 Attempt to free NULL,這部分一直沒辦法拿分,事實上根據 cppreference.com 對 free() 的描述:
If ptr is a null pointer, the function does nothing.
一般在實作如果傳入 NULL 是沒問題的,這裡 q_insert_head()
的實作因應這項評分而修改。
q_insert_tail()
在 queue 的尾插入一個元素,需要區別 queue 的大小是 0 或大於 0 兩種情況。
q_remove_head
從 queue 的頭移除一個元素,並且複製 bufsize - 1
個字元到 sp
,最後一個字元必須是空字元。
q_size()
回傳 queue 的大小。
q_reverse()
反轉一個 queue ,一開始需要檢查 queue 是否為 NULL 且有 2 個以上個元素,再利用三個指標 prev curr next
來走訪 queue ,避免因為方向對調後存取不到剩餘的元素。
參考 : Linked List: 新增資料、刪除資料、反轉