contributed by < Rsysz
>
sysprog
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
: 以遞增順序來排序鏈結串列的元素根據作業提示
Return number of elements in queue. Return 0 if q is NULL or empty Remember: It should operate in O(1)time
You will need to add more fields to this structure to efficiently implement
q_size
andq_insert_tail
新增 int size 與 list_ele_t * tail 到 struct queue_t
:
queue_t
前先檢測是否成功分配記憶體空間,避免Segmentation faultq->head
指標,遍歷queue_t
將內部所有記憶體空間釋放newh
後先行判定有無記憶體空間newh->value = malloc(sizeof(char) * (strlen(s) + 1))
於list_ele_t * newh結構內取得記憶體空間後判定有無取得結構內記憶體空間strncpy(newh->value, s, strlen(s) + 1)
複製strlen(s) + 1長度的字串(含'\0')至newh->value
的記憶體空間中
newh->next
指向q->head
,後取代原先的q->head
queue_t
中第一個元素時q->tail
指向newh
newt
後先行判定有無記憶體空間newt->value = malloc(sizeof(char) * (strlen(s) + 1))
於list_ele_t * newt結構內取得記憶體空間後判定有無取得結構內記憶體空間strncpy(newh->value, s, strlen(s) + 1)
複製strlen(s) + 1長度的字串(含'\0')至newt->value
的記憶體空間中
queue_t
中第一個元素時q->head
指向newt
q->tail->next
指向newt
q->tail
指向newt
,更新q->tail
指標q->head
以便於將待刪除節點內的value
存入char *sp
sp
不為NULL時,利用snprintf比較bufsize
與sp
的大小以確保'\0'的存入,避免Memory overflowq->tail
指向NULL
cursor
遍歷queue_t
,重定q->head->next
指標方向q_sort
僅作為副函數接口使用merge_sort
strcmp
比較兩字串長度並將較小值放入遞迴中的list_ele_t * head進行mergemake test
正常運行 也修改了 traces 裡面的腳本 將sort
改為sort a
sort
與reverse
整合為sort d
q_size
!q ? 0 : q->size;
相當於if (!q) {return 0;} else {return q->size;}
queue_t
不斷調用q_size
時無法符合的時間複雜度的需求if(!q || !q->head)
是省掉的時間 還是佔用的時間多q_sort