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

C語言鏈表實戰(一):動態創建單向鏈表完整指南

     編輯:關於C語言

為什麼需要鏈表?

數組需預先固定長度,估算不準會導致內存浪費或溢出。鏈表通過動態內存分配(malloc),按需申請節點,節點在內存中可不連續,靈活高效。

核心結構:每個節點包含數據域與指針域(指向下一節點)。必須維護一個頭指針 以訪問首節點。

節點結構定義

#include 
#include 

#define LEN sizeof(struct student)

struct student {
    long num;           // 學號
    float score;        // 成績
    struct student *next; // 指向下一節點
};

創建鏈表核心算法

採用尾插法,維護 head(頭指針)、p1(新節點)、p2(尾節點)三個指針。輸入 num=0 結束。

int n = 0; // 全局節點計數

struct student *creat(void) {
    struct student *head = NULL;
    struct student *p1, *p2;

    p1 = p2 = (struct student *)malloc(LEN);
    scanf("%ld,%f", &p1->num, &p1->score);

    while (p1->num != 0) {
        n++;
        if (n == 1) {
            head = p1;        // 首節點
        } else {
            p2->next = p1;    // 鏈接到尾部
        }
        p2 = p1;              // 更新尾指針
        p1 = (struct student *)malloc(LEN); // 分配下一節點
        scanf("%ld,%f", &p1->num, &p1->score);
    }
    p2->next = NULL;          // 尾節點指向 NULL
    return head;
}

內存佈局圖解

鏈表內存結構示意圖

頭指針 head 指向首節點,各節點通過 next 串聯,最後一個節點 next = NULL。

關鍵點總結

  • malloc 動態分配,必須檢查返回值(教學代碼省略,生產代碼必須判空)。
  • 尾插法需維護尾指針 p2,避免每次遍歷到尾部(O(1) vs O(n))。
  • 循環結束條件為哨兵值(此處 num=0),實際項目中可改為計數或文件 EOF。
  • 創建函數返回頭指針,調用者負責後續操作與最終釋放內存(free 遍歷釋放)。

完整可運行示例

int main() {
    struct student *head = creat();
    // 此處可調用打印、插入、刪除等操作
    // 最後釋放鏈表內存
    struct student *p = head;
    while (p) {
        struct student *tmp = p;
        p = p->next;
        free(tmp);
    }
    return 0;
}

下一篇將講解鏈表的遍歷打印操作。

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