Try   HackMD

2025q1 Homework2 (quiz1+2)

contributed by < Hlunlun >

第一周

測驗 1

實做 list_insert_before() 這個函數,並使用到 你所不知道的 C 語言: linked list 和非連續記憶體 中指標指標的技巧

函數定義的參數有三個指標變數,l 指向 listbefore 指向預添加節點後所連接的節點,item 指向預添加節點,三個節點可能會呈現以下







list_type



l
l



l_

list

head



l->l_:ref






n0

n0

0

next



l_:head->n0:ref






n1

n1

1

next



n0:next->n1:ref






n2

n2

8

next



n1:next->n2:ref






item
item



item_

n3

5

next



item->item_:ref





before
before



before->n2:ref





list_insert_before() 主要功能就是將 n3 接在 n2 之前







list_type



l
l



l_

list

head



l->l_:ref






n0

n0

0

next



l_:head->n0:ref






n1

n1

1

next



n0:next->n1:ref






n3

n3

5

next



n1:next->n3:ref






n2

n2

8

next



item
item



item->n3:ref





n3:next->n2:ref






before
before



before->n2:ref





運用 指標的指標 技巧,首先將指標 p 指向指標 l->head,指標變數 p 中存放的是 指標 l->head 的記憶體位置,藉由檢查 *p 來避免直接使用空的 l->head 進行迭代







list_type



l
l



l_

list

head



l->l_:ref






n0

n0

0

next



l_:head->n0:ref






n1

n1

1

next



n0:next->n1:ref






n2

n2

8

next



n1:next->n2:ref






item

item



item_

n3

5

next



item->item_:ref





before
before



before->n2:ref





p
p



p->l_:head





接下來找到指向 *before 的指標,也就是在鍊結串列中進行迭代找到 n1->next,而指標的指標可以透過 &(*p)->next 取得 *p 指向的節點的 next 的記憶體位置,直到 *p 指向 *before 及停止如下圖







list_type



l
l



l_

list

head



l->l_:ref






n0

n0

0

next



l_:head->n0:ref






n1

n1

1

next



n0:next->n1:ref






n2

n2

8

next



n1:next->n2:ref


*p




item

item



item_

n3

5

next



item->item_:ref





before
before



before->n2:ref





p0
p



p0->l_:head





p1
p



p1->n0:next





p
p



p->n1:next





最後將目前 p 指向的指標 n1->next 指向 *item (也就是 n3 ),最後用 n3->next*before (也就是 n2 ) 接在 n3 後面,至此即完成實做 list_insert_before()







list_type



l
l



l_

list

head



l->l_:ref






n0

n0

0

next



l_:head->n0:ref






n1

n1

1

next



n0:next->n1:ref






n2

n2

8

next




n3

n3

5

next



n1:next->n3:ref





item

item



item->n3:ref





n3:next->n2:ref





before
before



before->n2:ref





p
p



p->n1:next





測驗2

測驗3