---
# System prepended metadata

title: 2021q1 Homework1 (lab0)

---

# 2021q1 Homework1 (lab0)
contributed by < `ch1p98` >

<style>
.question {
    color:rgb(184, 126, 139)
}
</style>

## 作業要求


## 開發記錄
:::danger
注意作業規範：中英文間用一個半形空白字元區隔
:notes: jserv
:::

### 關於insert的函式：
```cpp=
x = strlen(value);
char *val = malloc(x + 1);
memcpy(val, s, x);
val[x] = '\0';
```

若沒有最後一行，寫入時會出現類似如下錯誤：
```
ERROR: Removed value dolphinUU??? != expected value dolphin
```

* !與NULL:
```cpp
if (!q)
if (q == NULL)
```
這兩個判斷句的執行結果是一樣的。


* ~~個人目前的結論是printf比gdb好用。大概是我還沒弄懂gdb~~
* 還要找時間研究GDB。
:::danger
你既然說自己沒弄懂 gdb，何以有立場說 printf 比 GDB 好用呢？
:notes: jserv
:::

:::success
我錯了，今天突然就懂gdb怎麼下指令了。前一天腦袋抽筋才看不懂指令。
今天printf和gdb都有幫助到我；gdb backtrace, frame等指令幫助我找到出錯的位置，且能夠step，就像一般的IDE一樣，但這有時候會造成正常執行時不會出現的time limit exceeded。
printf有時在想要同時觀察數行程式碼且只要稍微看一下時，使用上會快一點，而且"比較"不會造成time limit exceeded的問題。
:::


* 程式碼應該邊寫邊整理，例如：
```cpp
if (q->size != 0) { 
        q->tail->next = newt;
        newt->next = NULL;
    } else {
        q->head = newt;
        newt->next = NULL;
    }
    q->tail = newt;
```

其實應該整理成這樣：

```cpp
if (q->size != 0) { /*if q is not empty.*/
        q->tail->next = newt;
    } else
        q->head = newt;
    newt->next = NULL;
    q->tail = newt;
```

但我一直執著於寫出正確的邏輯，想要修正邏輯的部分後再整理。結果苦思良久，最後忍不住動手邊整理邊修改，修改好了以後，正確的邏輯也就浮現了。

### q_sort
* 因為先前就有同學在課堂提到quick sort效能會受到測資影響，worst case下可能出現$O(n^2)$的運行結果：若pivot每次都選固定位置，例如頭或尾。假設該子序列max/min value全部或相當比例出現在此處就會變成或接近$O(n^2)$。雖然可以用隨機取、平均取pivot position等方法避免，但這樣也增加實作的複雜度。
* 因此決定以merge sort實作。


```cpp=
strcmp(s->value, e->value) < 0  /*correct*/
s->value < e->value     /*incorrect*/
```
拜託，這個坑不要踩第二次......我的4小時...
第二個是拿address相減。
python也沒這種寫法；要是直接拿字串相減會報錯。(雖然我也是剛剛開colab才確定這件事)
***<span class = question>你到底為什麼一開始會想要這樣寫？</span>***

總之依照樣版實作總算是達到<font color = "c90c0c">94</font>/100

* input