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

C語言單鏈表創建全流程詳解:從結構定義到動態構建

     編輯:關於C語言

單鏈表基礎概念與節點結構

單鏈表是線性表的鏈式存儲結構,每個節點包含兩部分:數據域存儲實際數據(如姓名),鏈域/指針域存儲下一個節點的地址。節點在內存中可不連續分布,通過指針串聯形成邏輯順序。C語言中通過結構體自引用實現:

typedef struct node {
    char name[20];        // 數據域:存儲姓名
    struct node *link;    // 鏈域:指向直接後繼節點
} stud;

帶頭節點單鏈表的動態創建算法

創建過程遵循「申請空間→賦值數據→鏈接節點→移動工作指針」循環:

#include <stdio.h>
#include <malloc.h>

#define N 10

typedef struct node {
    char name[20];
    struct node *link;
} stud;

stud *creat(int n) {
    stud *p, *h, *s;
    int i;
    
    /* 1. 創建頭節點 */
    if ((h = (stud *)malloc(sizeof(stud))) == NULL) {
        printf("內存分配失敗!\n");
        exit(0);
    }
    h->name[0] = '\0';  // 頭節點數據域置空
    h->link = NULL;     // 頭節點鏈域置空
    p = h;              // p 指向當前鏈表尾部
    
    /* 2. 循環創建數據節點 */
    for (i = 0; i < n; i++) {
        if ((s = (stud *)malloc(sizeof(stud))) == NULL) {
            printf("內存分配失敗!\n");
            exit(0);
        }
        p->link = s;                    // 將新節點掛到尾部
        printf("請輸入第 %d 個人的姓名:", i + 1);
        scanf("%s", s->name);           // 數據域賦值
        s->link = NULL;                 // 新節點鏈域置空
        p = s;                          // p 後移到新尾部
    }
    return h;  // 返回頭節點指針
}

int main() {
    int number = N;
    stud *head = creat(number);  // 保存頭指針,後續所有操作從這裡開始
    return 0;
}

關鍵步驟圖解

  1. 初始化:頭節點 h 獨立存在,p=h。
  2. 首次插入:申請 s1,p->link=s1(即 h->link=s1),p=s1。
  3. 後續插入:申請 s2,p->link=s2(即 s1->link=s2),p=s2。
  4. 結束:最後 p 指向尾節點,尾節點 link=NULL。

工程實踐注意事項

  • 必須檢查 malloc 返回值:防止內存不足導致程序崩潰,示例中使用 exit(0) 簡單處理,實際項目應返回錯誤碼或拋出異常。
  • 頭指針不可丟失:main() 中必須保存 creat() 返回的頭指針,否則整個鏈表無法訪問,造成內存洩漏。
  • 輸入安全性:scanf("%s", ...) 存在緩衝區溢出風險,建議使用 fgets() 或限定寬度 scanf("%19s", ...)。
  • 擴展性:可將節點結構擴展為包含學號、成績等多字段,創建邏輯不變。

常見變體

不帶頭節點:首個數據節點即為頭指針,插入刪除需特判頭節點情況,代碼稍繁瑣。
尾插法 vs 頭插法:本文採用尾插法保持輸入順序;頭插法新節點插在頭節點後,順序與輸入相反,但無需維護尾指針。

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