首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言鏈表創建詳解:尾指針移動三步曲 pTail->pNext=pNew; pNew->pNext=NULL; pTail=pNew; 圖解

     編輯:程式設計綜合問答

代碼片段:

pTail->pNext = pNew;  // 1. 當前尾節點指向新節點
pNew->pNext = NULL;   // 2. 新節點指針域置空 (成為新尾部標識)
pTail = pNew;         // 3. 尾指針前移指向新節點

圖解過程 (初始:頭節點=尾節點=Head)

初始:  Head[pNext=NULL]  ← pTail

第1步: pTail->pNext = pNew
       Head[pNext]──→ pNew[pNext=??]

第2步: pNew->pNext = NULL
       Head[pNext]──→ pNew[pNext=NULL]  (鏈表結尾標記)

第3步: pTail = pNew
       Head[pNext]──→ pNew[pNext=NULL]  ← pTail (尾指針更新)

每步含義

  1. pTail->pNext = pNew:**鏈接**。將原尾節點的 pNext 指向新分配的節點 pNew,使新節點掛入鏈表末端。此時 pNew 的 pNext 仍是垃圾值。
  2. pNew->pNext = NULL:**終結**。將新節點的指針域置 NULL,標記鏈表結束。這步必須在 pTail 移動前完成,否則鏈表斷裸。
  3. pTail = pNew:**推進**。尾指針 pTail 更新指向新節點,為下一次插入做準備。不移動尾指針,下輪插入會覆蓋原尾節點的 pNext,導致丟失新節點。

完整創建流程

Node* create_list() {
    Node* pHead = (Node*)malloc(sizeof(Node)); // 頭節點 (不存數據)
    pHead->pNext = NULL;
    Node* pTail = pHead; // 尾指針初始指向頭節點
    
    int len, val;
    scanf("%d", &len);
    for (int i = 0; i < len; ++i) {
        scanf("%d", &val);
        Node* pNew = (Node*)malloc(sizeof(Node));
        pNew->data = val;
        pNew->pNext = NULL; // 分配後即置空,安全
        
        pTail->pNext = pNew; // 掛入
        pTail = pNew;        // 推進
    }
    return pHead; // 返回頭節點 (首元素為 pHead->pNext)
}

關鍵理解

  • 頭節點不存數據,統一處理空表/非空表插入邏輯。
  • 尾指針始終指向最後一個有效節點,插入時直接掛在尾後、再移動尾指針。
  • 新節點 malloc 後立即置 NULL,防止野指針。

三步曲是單鏈表尾插法的核心不變式,理解指針指向變化即掌握鏈表構建本質。

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