Try   HackMD

2025q1 Homework1 (lab0)

contributed by < Brianpan >

作業書寫規範:

  • 無論標題和內文中,中文和英文字元之間要有空白字元 (對排版和文字搜尋有利)
  • 文字訊息 (尤其是程式執行結果) 請避免用圖片來表示,否則不好搜尋和分類
  • 共筆書寫請考慮到日後協作,避免過多的個人色彩,用詞儘量中性
  • 不要在筆記內加入 [TOC] : 筆記左上方已有 Table of Contents (TOC) 功能,不需要畫蛇添足
  • 不要變更預設的 CSS 也不要加入任何佈景主題: 這是「開發紀錄」,用於評分和接受同儕的檢閱
  • 在筆記中貼入程式碼時,避免非必要的行號,也就是該手動將 c=cpp= 變更為 ccpp。行號只在後續討論明確需要行號時,才要出現,否則維持精簡的展現。可留意「你所不知道的 C 語言: linked list 和非連續記憶體」裡頭程式碼展現的方式
  • HackMD 不是讓你張貼完整程式碼的地方,GitHub 才是!因此你在開發紀錄只該列出關鍵程式碼 (善用 diff 標示),可附上對應 GitHub commit 的超連結,列出程式碼是為了「檢討」和「便於他人參與討論」
  • 留意科技詞彙的使用,請參見「資訊科技詞彙翻譯」及「詞彙對照表
  • 不要濫用 :::info, :::success, :::warning 等標示,儘量用清晰的文字書寫。:::danger 則僅限授課教師作為批注使用
  • 避免過多的中英文混用,已有明確翻譯詞彙者,例如「鏈結串列」(linked list) 和「佇列」(queue),就使用該中文詞彙,英文則留給變數名稱、人名,或者缺乏通用翻譯詞彙的場景
  • 在中文敘述中,使用全形標點符號,例如該用「,」,而非 ","。注意書名號的使用,即 ,非「小於」和「大於」符號
  • 避免使用不必要的 emoji 字元

Queue API Implementations

  • q_new
  • q_free
  • q_insert_head
  • q_insert_tail
  • q_remove_head
  • q_remove_tail
  • q_size
  • q_delete_mid
  • q_delete_dup
  • q_swap
  • q_reverse
  • q_reverseK
  • q_sort
  • q_ascend
  • q_descend
  • q_merge

q_new

要確認malloc是否成功

if (h != NULL)
        INIT_LIST_HEAD(h);

q_free

移除queue的時候要連所包含的內容一起釋放
所以要使用list_for_each_safe api

q_insert_head / q_insert_tail

插入新元素要考慮是否有成功分配空間

element_t *new_ele = malloc(sizeof(element_t));
// malloc fails
if (new_ele == NULL)
    return false;
// can not dup str
char *dup_str = strdup(s);
if (dup_str == NULL) {
    // free element's malloc
    free(new_ele);
    return false;
}

除此之外,這兩者的差別只在list_add, list_add_tail的api使用

q_remove_head

一開始使用間接指標去memcpy 發現 case-07過不了

/* Copy element var */
void copy_to_buf(char **dst, char **src, size_t bufsize)
{
    size_t end = bufsize - 1;
    if (strlen(*src) >= end) {
        memcpy(*dst, *src, end);
        *dst[end] = '\0';
        return;
    }
    memcpy(*dst, *src, bufsize);
}

改進後 commit 參考同學的實作改用strncpy去避免這樣的情況

if (sp) {
    strncpy(sp, e->value, bufsize -1);
    sp[bufsize - 1] = '\0';
}