首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言實現帶頭結點單鏈表的節點插入操作

     編輯:關於C

在之前的文章《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;
}

關鍵點解析

  • 頭結點作為哨兵:pNode 指向頭結點,實際數據節點從 pNode->next 開始,插入邏輯統一處理。
  • 位置索引語義:pos 表示插入到第 pos 個數據節點之前(0 表示頭結點之後,即第一個數據節點位置)。
  • 邊界檢查:若 pos 超過鏈表長度,循環結束後返回失敗,並釋放臨時分配的節點內存。
  • 內存安全:malloc 後檢查空指針,失敗路徑釋放資源,避免內存洩漏。

完整測試示例

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 語言工程實踐的基礎技能之一。統一的邏輯處理方式,讓代碼更健壯、更易維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved