# 2020q3 Week1
:::warning
課堂問答簡記
:::
## ccs100203
Q: 將 `add_entry` 裡的 `new_node` 插在 `head` 的前面要怎麼改?
如果傳進來的是前面 node 的 next 的 reference,那直接 dereference 後接上去就可以了
e.g. `add_entry(&(head->next), 109);`
```c=
void add_entry(node_t **head, int new_value)
{
node_t *new_node = malloc(sizeof(node_t));
assert(new_node);
new_node->value = new_value;
new_node->next = *head;
*head = new_node;
}
```
但如果不是的話,e.g. `node_t *head2 = head->next; add_entry(&head2, 109);`,就變成用下面的方法,加一個 node 在後面,然後把資料移過去
```c=
void add_entry(node_t **head, int new_value)
{
node_t *new_node = malloc(sizeof(node_t));
assert(new_node);
if(*head){
new_node->value = (*head)->value;
new_node->next = (*head)->next;
(*head)->value = new_value;
(*head)->next = new_node;
}else{
new_node->value = new_value;
new_node->next = NULL;
*head = new_node;
}
}
```
## ZhuMon
Q 如何改 reverse 為 pointer to pointer
```c
void reverse(node_t **head)
{
node_t *cursor = NULL;
while (*head) {
node_t *next = (*head)->next;
(*head)->next = cursor;
cursor = *head;
*head = next;
}
*head = cursor;
}
```
## tigger12613
Q 將 `add_entry` 裡的 `new_node` 插在 list 的最前面要怎麼改? (head前面可能還有node,請在確保整體linked list依舊正常的情況下在head前面插入`new_node` .另外,不可新增傳入的參數)
我贊同 `ccs100203` 的方法,以下內容皆參考 `ccs100203` 的答案
`head'`是參數的(*head)
```graphviz
digraph structs {
rankdir=LR;
node[shape=box];
struct0 [label= "real head",color=purple];
struct5 [label= "head'"];
struct1 [label= "last"];
struct2 [label= "node1\n value of node1",color=purple];
struct3 [label= "node2\n value of node2"];
struct4 [label= "node3\n value of node3"];
{
rank="same";
struct0 -> struct2[color=purple]
}
{
rank="same";
struct1 -> struct4
}
{
rank="same";
struct5 -> struct3
}
struct2 -> struct3[arrowhead=vee, tailclip=true, arrowsize=1,color=purple];
struct3 -> struct4[arrowhead=vee, tailclip=true, arrowsize=1];
}
```
我們並不知道紫色的那些東西存不存在,所以新增一個 node ,把 node2 的 value 丟給 new node
```graphviz
digraph structs {
rankdir=LR;
node[shape=box];
struct0 [label= "real head",color=purple];
struct5 [label= "head'"];
struct1 [label= "last"];
struct2 [label= "node1\n value of node1",color=purple];
struct3 [label= "node2\n value of node2"];
struct4 [label= "node3\n value of node3"];
struct6 [label= "new node\nno value"];
{
rank="same";
struct0 -> struct2[color=purple]
}
{
rank="same";
struct1 -> struct4
}
{
rank="same";
struct5 -> struct3
}
struct2 -> struct3[arrowhead=vee, tailclip=true, arrowsize=1,color=purple];
struct6 -> struct4[arrowhead=vee, tailclip=true, arrowsize=1];
struct3 -> struct6[arrowhead=vee, tailclip=true, arrowsize=1];
}
```
copy value of node2 to new node
```graphviz
digraph structs {
rankdir=LR;
node[shape=box];
struct0 [label= "real head",color=purple];
struct5 [label= "head'"];
struct1 [label= "last"];
struct2 [label= "node1\n value of node1",color=purple];
struct3 [label= "node2\n value of node2"];
struct4 [label= "node3\n value of node3"];
struct6 [label= "new node\nvalue of node2"];
{
rank="same";
struct0 -> struct2[color=purple]
}
{
rank="same";
struct1 -> struct4
}
{
rank="same";
struct5 -> struct3
}
struct2 -> struct3[arrowhead=vee, tailclip=true, arrowsize=1,color=purple];
struct6 -> struct4[arrowhead=vee, tailclip=true, arrowsize=1];
struct3 -> struct6[arrowhead=vee, tailclip=true, arrowsize=1];
}
```
copy the new value to node2
```graphviz
digraph structs {
rankdir=LR;
node[shape=box];
struct0 [label= "real head",color=purple];
struct5 [label= "head'"];
struct1 [label= "last"];
struct2 [label= "node1",color=purple];
struct3 [label= "node2\n new value"];
struct4 [label= "node3"];
struct6 [label= "new node\nvalue of node2"];
{
rank="same";
struct0 -> struct2[color=purple]
}
{
rank="same";
struct1 -> struct4
}
{
rank="same";
struct5 -> struct3
}
struct2 -> struct3[arrowhead=vee, tailclip=true, arrowsize=1,color=purple];
struct6 -> struct4[arrowhead=vee, tailclip=true, arrowsize=1];
struct3 -> struct6[arrowhead=vee, tailclip=true, arrowsize=1];
}
```
這樣就可以在維持 link list 的正確性的情況下,插入一個node