2020q1 Homework1 (lab0)
contributed by < BWbwchen
>
開發環境
作業要求
q_new
: 建立新的「空」佇列;
q_free
: 釋放佇列所佔用的記憶體;
q_insert_head
: 在佇列開頭 (head) 加入 (insert) 給定的新元素 (以 LIFO 準則);
q_insert_tail
: 在佇列尾端 (tail) 加入 (insert) 給定的新元素 (以 FIFO 準則);
q_remove_head
: 在佇列開頭 (head) 移除 (remove) 給定的元素。
q_size
: 計算佇列中的元素數量。
q_reverse
: 以反向順序重新排列鏈結串列,該函式不該配置或釋放任何鏈結串列元素,換言之,它只能重排已經存在的元素;
q_sort
: 以遞增順序來排序鏈結串列的元素
實作
Structure
- 為了要讓
q_insert_tail
和 q_size
可以為 ,因此加入新的 struct member 來隨時紀錄 tail
和 size
q_new
- malloc 一個新的記憶體空間,但須注意 malloc 有沒有失敗,並做初始化
q_free
- 單純的從 head 一路 free 到結尾,但須注意
value
也是經由 malloc 取得的,因此也要 free
q_insert_head
- 需注意如果原先的 queue 是空的情況,還有在 malloc value 失敗時,要記得把原本的 newh 還回去
q_insert_tail
- 需要注意 queue 為空的狀況,要記得更新 queue 的資料
q_remove_head
- 需要注意如果 queue 的長度為 1 的狀況。也要記得刪除的 node 需要把 value free 掉
q_size
q_reverse
- 因為 list_ele_t 只記住 next 的資料,因此需要一個 pointer 來記住下一個 element ,才能順利將 next 的資料更新。
q_sort
- 我採用 merge sort 的方式
- 如果採用測驗 1 的方式去切 list 的話,複雜度沒辦法壓下來,因此要找到 list 區段的中心才能將複雜度壓到
- get_mid()
- 用兩個走訪速率為 1 : 2 的 pointer 去走訪到中間點
- merge_list
- 這邊我就直接採用測驗題的方式去做 merge