在之前的文章《C語言實現單鏈表(不帶頭結點)節點的插入》中,我詳細介紹了無頭結點單鏈表的節點插入實現。然而在實際工程應用中,帶頭結點的單鏈表因其操作統一、邏輯簡潔而更為常用。本文將深入講解帶頭結點單鏈表的節點插入算法與代碼實現。
帶頭結點的單鏈表在插入操作時,無需單獨處理「插入到第一個節點」這種特殊情況。無論在任意位置插入,邏輯都保持一致:找到目標位置的前驅節點,調整指針即可。這大大降低了代碼複雜度與出錯概率。
Node* InsertNode(Node* pNode, int pos, int x) {
int i = 0;
Node* pMove = pNode;
Node* pInsert = (Node*)malloc(sizeof(Node));
if (!pInsert) return pNode; // 內存分配失敗保護
memset(pInsert, 0, sizeof(Node));
pInsert->element = x;
pInsert->next = NULL;
// 遍歷尋找插入位置(pos 為 0-based 索引)
while (pMove != NULL) {
if (i == pos) {
pInsert->next = pMove->next;
pMove->next = pInsert;
printf("%s函數執行,在pos=%d位置插入value=%d成功\n", __FUNCTION__, pos, x);
return pNode;
}
i++;
pMove = pMove->next;
}
printf("%s函數執行,插入節點失敗(位置非法)\n", __FUNCTION__);
free(pInsert); // 釋放已分配但未使用的節點
return pNode;
}
int main() {
Node* head = NULL;
InitialList(&head); // 初始化帶頭結點鏈表
CreateList(head); // 尾插法建表(輸入正整數,以非正數結束)
PrintList(head); // 打印:例如 10 20 30
InsertNode(head, 1, 99); // 在位置 1 插入 99(即 10 和 20 之間)
PrintList(head); // 打印:10 99 20 30
InsertNode(head, 0, 5); // 在第一個數據節點前插入 5
PrintList(head); // 打印:5 10 99 20 30
ClearList(head); // 清理鏈表
return 0;
}
掌握帶頭結點單鏈表的插入操作,是數據結構學習與 C 語言工程實踐的基礎技能之一。統一的邏輯處理方式,讓代碼更健壯、更易維護。