# 2024q1 Homework1 (lab0) contributed by < [Lushengjhou0315](https://github.com/Lushengjhou0315) > :::danger 詳閱作業規範,注意細節。 ::: ## 開發環境 ```shell $ gcc --vesion gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 $ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Address sizes: 46 bits physical, 48 bits virtual Byte Order: Little Endian CPU(s): 20 On-line CPU(s) list: 0-19 Vendor ID: GenuineIntel Model name: 13th Gen Intel(R) Core(TM) i5-13500 CPU family: 6 Model: 191 Thread(s) per core: 2 Core(s) per socket: 14 Socket(s): 1 Stepping: 2 CPU max MHz: 4800.0000 CPU min MHz: 800.0000 BogoMIPS: 4992.00 ``` ## 指定的佇列操作 ### queue.c 將目標完成的 queue.c 打開以後,除了確認[預期目標](https://hackmd.io/@sysprog/linux2024-lab0/%2F%40sysprog%2Flinux2024-lab0-a)中,未完整程式的功能以及需求,從 queue.h 中確認輸入參數所代表的意思與型別。標頭檔中 list.h 的內容也有看,其中有許多功能可以拿來利用,因此在實作的部分會使用到其中的內容進行實作 :::danger 1. 無論標題和內文中,中文和英文字元之間要有空白字元 (對排版和文字搜尋有利) 2. 改進你的漢語表達 ::: ### q_new ```cpp struct list_head *q_new() { struct list_head *new_queue = malloc(sizeof(struct list_head)); if(!new_queue){ return NULL; //分配記憶體失敗 } INIT_LIST_HEAD(new_queue); return new_queue; } ``` 首先使用了 malloc 配置了記憶體,根據 harness.h 的描述,記憶體有可能配置失敗,會回傳 NULL ,因此需要加上判斷。 ```cpp static inline void INIT_LIST_HEAD(struct list_head *head) { head->next = head; head->prev = head; } ``` 在這邊還利用 INIT_LIST_HEAD 進行 head 的初始化,由於佇列的鏈結串列是雙向的,現在只有節點,因此向前以及向後的指標都指向自己。 ### q_free ```cpp void q_free(struct list_head *head) { if (!head){ return; } if (list_empty(head)){ free(head); return; } element_t *entry, *safe; list_for_each_entry_safe(entry, safe, head, member){ list_del(entry); free(entry); } free(head); return } ``` 考慮了幾個可能性 * head 不存在,直接回傳。 * head 為空佇列,釋放此記憶體空間,再回傳。 *