contributed by < gg21aping
>
list_insert_before()
函式透過指標的指標 **p
直接修改鏈結關係而非僅是節點的內容。
static inline void list_insert_before(list_t *l, list_item_t *before, list_item_t *item) {
list_item_t **p;
for (p = &l->head; *p != before; p = &(*p)->next)
;
*p = item;
item->next = before;
}
透過指標的指標操作,我們可以使用統一的方式處理所有的插入場景:
before == l->head
時,新節點插入鏈結頭部:
p
指向 &l->head
,*p
即 l->head
*p != before
*p = item
即 l->head = item
item->next
指向 before
,即原先 l->head
指向的節點before == NULL
時,新節點插入鏈結尾部:
*p = NULL
p = &(*p)->next
是下一個指標的位址,p
依然保留指向指標的特性*p = item
將尾節點的 next
指向新節點item->next = before
把新節點的 next
指標指向 NULL
*p == before
*p = item
讓前一個節點指向新節點item->next = before
連接後續的節點