# 2025q1 Homework2 (quiz1+2)
contributed by <[`kk908676`]((https://github.com/kk908676))>.
# 第 1 週測驗題
### 測驗 一 : 程式碼運作原理
題目核心鏈結串列結構
```c
#include <stddef.h>
typedef struct list_item {
int value;
struct list_item *next;
} list_item_t;
typedef struct {
struct list_item *head;
} list_t;
```
關鍵操作 `list_insert_before` 函式的語意如下:

測試一:
```c
/* Test inserting at the beginning */
list_reset();
my_assert(list_size(&l) == 0, "Initial list size is expected to be zero.");
for (size_t i = 0; i < N; i++)
list_insert_before(&l, l.head, &items[i]);
my_assert(list_size(&l) == N, "Final list size should be N");
size_t k = N - 1;
list_item_t *cur = l.head;
while (cur) {
my_assert(cur->value == k, "Unexpected list item value");
k--;
cur = cur->next;
}
```
首先會初始化一個解構指標 `head`
接著在 `head` 指向的鏈結串列最前面新增節點,直到 `N-1` 為止
當 `i = 0` 時
```graphviz
digraph G {
rankdir=LR;
node [shape=record];
head [label="head"];
p [label="{<data> 0 | <next>}"];
head -> p;
}
```
當 `i = 1` 時
```graphviz
digraph G {
rankdir=LR;
node [shape=record];
head [label="head"];
p [label="{<data> 1 | <next>}"];
p_prime [label="{<data> 0 | <next>}"];
head -> p;
p:next -> p_prime;
}
```
當 `i = 2` 時
```graphviz
digraph G {
rankdir=LR;
node [shape=record];
head [label="head"];
p [label="{<data> 2 | <next>}"];
p_prime [label="{<data> 1 | <next>}"];
p_double_prime [label="{<data> 0 | <next>}"];
head -> p;
p:next -> p_prime;
p_prime:next -> p_double_prime;
}
```
以此類推...
測試二 :
```c
/* Test inserting at the end */
list_reset();
my_assert(list_size(&l) == 0, "Initial list size is expected to be zero.");
for (size_t i = 0; i < N; i++)
list_insert_before(&l, NULL, &items[i]);
my_assert(list_size(&l) == N, "Final list size should be N");
k = 0;
cur = l.head;
while (cur) {
my_assert(cur->value == k, "Unexpected list item value");
k++;
cur = cur->next;
}
```
首先會初始化一個解構指標 `head`
接著在 `head` 指向的鏈結串列最後面新增節點,直到 `N-1` 為止
當 `i = 0` 時
```graphviz
digraph G {
rankdir=LR;
node [shape=record];
head [label="head"];
p [label="{<data> 0 | <next>}"];
head -> p;
}
```
當 `i = 1` 時
```graphviz
digraph G {
rankdir=LR;
node [shape=record];
head [label="head"];
p [label="{<data> 0 | <next>}"];
p_prime [label="{<data> 1 | <next>}"];
head -> p;
p:next -> p_prime;
}
```
當 `i = 2` 時
```graphviz
digraph G {
rankdir=LR;
node [shape=record];
head [label="head"];
p [label="{<data> 0 | <next>}"];
p_prime [label="{<data> 1 | <next>}"];
p_double_prime [label="{<data> 2 | <next>}"];
head -> p;
p:next -> p_prime;
p_prime:next -> p_double_prime;
}
```
以此類推...
### 測驗 二 : 程式碼運作原理