# 2025q1 Homework1 (lab0) contributed by < `qianzsh` > {%hackmd NrmQUGbRQWemgwPfhzXj6g %} ## 開發環境 ```bash $ gcc --version gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0 $ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian Address sizes: 39 bits physical, 48 bits virtual CPU(s): 12 On-line CPU(s) list: 0-11 Thread(s) per core: 2 Core(s) per socket: 6 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: Model name: Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz Stepping: CPU MHz: CPU max MHz: 4600.0000 CPU min MHz: 800.0000 BogoMIPS: 6399.96 Virtualization: L1d cache: 192 KiB L1i cache: 192 KiB L2 cache: 1.5 MiB L3 cache: 12 MiB NUMA node0 CPU(s): 0-11 ``` ## 針對佇列操作的程式碼實作 ### q_free 一開始程式碼為以下 ```c void q_free(struct list_head *head) { struct list_head *temp; while (head) { temp = head->next; free(head); head = temp; } } ``` 後來發現自己對佇列的理解有誤。起初,以為每個節點都是 list_head 結構體,但實際上只有佇列的頭部是 `list_head`,其餘節點均為 element_t 結構體,因此,在釋放記憶體時,不僅要釋放佇列頭部,還必須釋放各節點內部指標所指向的記憶體。 ```c void q_free(struct list_head *head) { if (!head) return; struct list_head *current = head->next, *next; while (current != head) { next = current->next; element_t *entry = list_entry(current, element_t, list); free(entry->value); free(entry); current = next; } free(head); } ``` ### q_delete_mid 使用類似快慢指標定位中間節點,在自己手動跑第二個測資 `./qtest -f traces/trace-02-ops.cmd` 後發現有記憶體洩漏以及節點被錯誤刪除的問題,最後透過更改變數初始值以及釋放結構體中 value 所指向的記憶體來解決。 ### q_reverse 我一開始不確定鏈結是否為循環結構,使用 `list_last_entry` 定位最後一個 element_t 再從尾端往前逐一遍歷,針對每個節點的 `next` 和 `prev` 指標進行交換。 ```c element_t *last = list_last_entry(head, element_t, list); head->next = &last->list; ``` 後來回去看[你所不知道的 C 語言: linked list 和非連續記憶體](https://hackmd.io/@sysprog/c-linked-list#circular-linked-list)找到以下這張圖 ![image](https://hackmd.io/_uploads/rkmaz76aye.png) 從圖片可以發現鏈結是頭尾相連的,所以除了對 `head->next` 做設定以外還需要對 `head->prev` 做設定。 ### q_reverseK 首先閱讀[LeetCode 25. Reverse Nodes in k-Group](https://leetcode.com/problems/reverse-nodes-in-k-group/description/)來理解題意, ## REFERENCE - [共筆示範](https://hackmd.io/@sysprog/linux2025-sample-lab0) - [2024 homework1 開發紀錄](https://hackmd.io/@sysprog/linux2024-homework1)