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

C 語言非循環單鏈表創建詳解:帶頭結點的尾插法實現

     編輯:關於C語言

核心概念釐清

術語定義
頭指針指向鏈表第一個結點(頭結點)的指針
頭結點首元結點之前的附加結點,數據域存放表長等輔助信息,不存有效數據
首元結點鏈表中第一個存放有效數據的結點
尾元結點最後一個有效結點,指針域為 NULL

含 3 個有效結點的鏈表結構

尾插法創建流程

  1. 動態分配頭結點,pHead、pTail 均指向它
  2. 置 pTail->next = NULL
  3. 輸入結點個數 len
  4. 循環 len 次:
    1. 讀取數據 val
    2. 分配新結點 pNew,填充數據
    3. pTail->next = pNew 掛鏈
    4. pNew->next = NULL
    5. pTail = pNew 移動尾指針
  5. 返回 pHead

尾插法過程示意

完整代碼實現

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node *pNext;
} NODE, *PNODE;

PNODE create_list(void) {
    int len, i, val;
    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    if (!pHead) { printf("分配失敗!\n"); exit(-1); }
    
    PNODE pTail = pHead;
    pTail->pNext = NULL;
    
    printf("請輸入鏈表結點個數:len = ");
    scanf("%d", &len);
    
    for (i = 0; i < len; i++) {
        printf("請輸入第 %d 個結點的值:", i+1);
        scanf("%d", &val);
        
        PNODE pNew = (PNODE)malloc(sizeof(NODE));
        if (!pNew) { printf("分配失敗!\n"); exit(-1); }
        
        pNew->data = val;
        pTail->pNext = pNew;
        pNew->pNext = NULL;
        pTail = pNew;
    }
    return pHead;
}

int main(void) {
    PNODE pHead = create_list();
    // 此處可添加遍歷、釋放等操作
    return 0;
}

關鍵點總結

  • 帶頭結點:統一空表與非空表操作,插入刪除無需特判首元
  • 尾指針:實現 O(1) 尾部插入,避免每次遍歷到表尾
  • 錯誤處理:malloc 失敗需檢查並退出
  • 內存釋放:使用後必須遍歷釋放所有結點(含頭結點),防止洩漏

擴展練習

  1. 實現 void traverse(PNODE head) 遍歷輸出
  2. 實現 void free_list(PNODE head) 完整釋放
  3. 改為頭插法,觀察數據順序逆轉
  4. 實現指定位置插入/刪除
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved