Contributed by < krimson8
>
既然是第二次進行此作業,請考慮下述改進:
100/100
1.Logistics
2.Overview
3.Resources
4, 5 爲 autolab 相關,忽略
6.Overview
queue.h
list_ele_t
爲 linked list 的節點 structqueue_t
爲 queue 的 structlist_ele_t
內的 value
應該存有指向一個char array 的 pointerqueue_t
裏的每一個節點都應該有自己的 string (就算和別的節點是一樣的 string)
malloc
strdup
有使用到 malloc
所以猜想刪除節點的時候也要一併free
掉strcpy
和 strdup
之間的差別
queue_t*
內的 head 指向 一個 queue 的開頭,queue 可分爲兩種 case
queue_t* X = NULL;
即爲Null queuequeue_t* X = ...;
X->head = NULL;
則是 Empty queue7.Programming Task
這段有說使用到 string 的時候,必須 create and store a copy of the string by calling malloc
to allocate space, 還有 allocate space for each string based on its length.
q_insert_tail
和 q_size
要達到
這裏是實作的過程,一個 function 接上 一個 function 做解釋,並且優先解釋先完成的 function。
queue.h
q_size
和 q_insert_tail
就都能夠有辦法實現 的演算法q_new
q->head = NULL;
即表示這是一個空 queueq_insert_head
list_ele_t *newh;
,若malloc
過程失敗則回傳 falsenewh->value = strdup(s);
,但是這樣的話執行 qtest
會回傳 attempted to free unallocated space error,因此參考了 strdup
的實作
問:爲什麼strdup 不行?
已解決
因爲這支程式裏面呼叫的 malloc
不是系統的 malloc
而是 qtest
的,因此如果用 strdup
(qtest
沒有提供)雖然可以過掉測資,但是因爲我的程式碼裏面有顧慮到 free
每一個節點的時候先 free
掉 value
,但是若使用strdup
所 malloc
出來的空間 qtest
是不知情的!這就造成了 qtest
顯示 attempted to free unallocated space error。
qtest
的程式碼有自行模擬malloc
malloc
的過後判斷 value
是 NULL
的話回傳false
因爲qtest 內有一個選項是可以開啓 malloc 成功率,當不爲0 的時候,就會有很多情況回傳NULL
因此若newh->value == NULL
則必須同時兼顧newh
的free
的動作,不然會有memory leak 的錯誤
tail
指向 newh
newh->next = q->head
(head
可能爲 NULL,即創立第一個節點)q->head = newh
(更新 head
pointer 指向新節點)list_count++
增加節點數量q_insert_tail
q_insert_head
的實作方式一樣
list_count
爲0 的時候,讓head
指向新的節點,若不是0 則 tail->next = newh
tail
指向新節點list_count++
增加節點數量q_remove_head
q
與 q->head
爲 NULL 則回傳 falsesp
非 NULL,則把移除的節點的字串複製進去,sp 可以接受的最大size 爲 bufsize - 1
因此要寫好條件判定式,而且 array 最後需要以 NULL terminator 結束(s[bufsize - 1]
)strncpy
複製 給定大小的字串長度temp
的pointer 指向 head
節點head
指向 head->next
temp
所佔的空間 free 掉list_count++
節點數量減一q_size
q
是 NULL 或者 empty 的話回傳0,否則回傳queue 長度q_reverse
q
與 q->head
爲 NULL 則 NO EFFECTq->tail
指向 q->head
,從第二個節點開始每一個節點指向上一個節點,結束後讓 q->head
指向 最後一個節點q_free
q == NULL
的時候回傳什麼值,但是有一筆測資內含指令 free
,而 qtest 結束的時候也會進行 free
指令的動作,因此進行了兩次free
,若不檢查q
的狀態的話會出錯(double free error)free
字串的空間,再 free
掉節點所佔的空間截圖