pos = 0 表示頭節點之後(第一個有效位置),pos = 1 表示第二個,以此類推。若 pos == length 等價於尾插。
bool List_Insert(DList *L, int pos, int val) {
Node *p = L->head;
for (int i = 0; i < pos && p != L->tail; ++i) p = p->next;
if (p == L->tail) return false; // 越界
Node *n = malloc(sizeof(Node));
n->element = val; n->prior = n->next = NULL;
/* 關鍵:先連新節點,再斷舊連 */
n->next = p->next;
p->next->prior = n;
p->next = n;
n->prior = p;
return true;
}
插入前: p <-> p->next 步驟1: n->next = p->next 步驟2: p->next->prior = n 步驟3: p->next = n 步驟4: n->prior = p 結果: p <-> n <-> p->next
此順序保證任意時刻鏈表結構完整,即使中途發生中斷/異常也不會產生斷鏈。
| pos | p 指向 | 效果 |
|---|---|---|
| 0 | head | 頭插(第一個有效節點前) |
| length | 尾節點前 | 尾插(tail 前) |
| 中間 | 中間節點 | 中間插入 |