contributed by < 110805
>
本次作業是圍繞在實作 queue 上,且此 queue 是能夠支援 LIFO 及 FIFO 的。
題目要求以下 function 的實作:
q_new()
: 建立一個空的 queueq_free()
: 釋放所有被 queue 所使用的記憶體資源q_insert_head()
: 從 queue 的前端插入一個元素 (LIFO)q_insert tail()
: 從 queue 的尾端插入一個元素 (FIFO)q_remove_head()
: 從 queue 的前端刪除一個元素q_size()
: 計算並回傳 queue 中的元素個數q_reverse()
: 反轉 queue 中元素的順序,且此 function 不能 allocate 或是 free 掉任何元素特別要求:
queue.c
及 queue.h
中的 commentsq_insert_tail()
及 q_size()
這兩個 function 之 time complexity 必須是 queue.h
struct queue_t
為了能夠讓 q_insert_tail()
及 q_size()
這兩個 function 能夠在 的時間完成,在 struct queue_t
中增加以下兩個 field: list_ele_t *tail
int size
queue.c
q_new()
建立一個空的 queue ,若無法 allocate 出指定大小的空間,則回傳 NULL。
q_free()
利用 q->head 為起點,並透過 next 沿著 queue 去 free elements ,在 free 掉該 element 之前,要記得先 free 掉該 element 之 value (value is a string)。
q_insert_head()
在前端插入一個元素。題目要求在 copy 之前必須先 allocate space to string ,更重要的是要檢查 malloc 是否有成功,否則在 trace-11 中出現 malloc 失敗的情形時會無法處理。
q_insert_tail()
插入一個元素到尾端。透過新增的 field tail
,要插入一個元素到 queue 的尾端就不用從 head 開始走過整個 queue ,而是可以像 insert head 一樣直接將元素插入 queue 的尾端。
q_remove_head()
移除 queue 的前端元素,且在移除前須先將 string 的內容複製到 sp 中。此處採用 strncpy
是為了防止 buffer overflow 的問題產生。
q_size()
回傳 queue 中的元素個數。透過新增的 field size
即可知道元素個數,而不用走過整個 queue 後才能算出。
q_reverse()
利用三個指標來實作 reverse function ,每次進入迴圈就會將 cur->next 指向前個 node , 並讓三個指標往下個節點前進。