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

C語言鏈表基礎:動態建立 1-10 數字鏈表並遍歷輸出

     編輯:關於C語言

鏈表節點定義

struct ListEntry {
    int number;              // 數據域
    struct ListEntry *next;  // 指針域,指向下一節點
};

完整代碼 (標準 C,移除 conio.h 依賴)

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

struct ListEntry {
    int number;
    struct ListEntry *next;
};

int main() {
    struct ListEntry start = {0, NULL};  // 頭節點 (哨兵)
    struct ListEntry *node = &start;     // 工作指針指向頭節點

    // 1. 動態建立鏈表:尾插法
    for(int i = 1; i <= 10; i++) {
        node->next = (struct ListEntry*)malloc(sizeof(struct ListEntry));
        if(!node->next) {
            fprintf(stderr, "記憶體分配失敗\n");
            return 1;
        }
        node = node->next;          // 移動到新節點
        node->number = i;           // 填充數據
        node->next = NULL;          // 終止標記
    }

    // 2. 遍歷輸出
    printf("鏈表內容: ");
    node = start.next;              // 跳過頭節點
    while(node) {
        printf("%d ", node->number);
        node = node->next;
    }
    printf("\n");

    // 3. 釋放記憶體 (重要!)
    node = start.next;
    while(node) {
        struct ListEntry *tmp = node;
        node = node->next;
        free(tmp);
    }
    start.next = NULL;

    return 0;
}

關鍵概念圞解

記憶體佈局:
start (棧上)          堆上節點 1          堆上節點 2          ...          堆上節點 10
+------+------+      +------+------+      +------+------+               +------+------+
| num=0| next |----->| num=1| next |----->| num=2| next |-----> ... ->| num=10|NULL|
+------+------+      +------+------+      +------+------+               +------+------+
  頭節點(哨兵)         數據節點            數據節點                              尾節點

四大核心操作模板

1. 尾插法建立 (O(n))

Node *tail = head;
for(...) {
    tail->next = new_node();
    tail = tail->next;
}

2. 頭插法建立 (O(n),逆序)

for(...) {
    new_node->next = head->next;
    head->next = new_node;
}

3. 遍歷訪問

for(Node *p = head->next; p; p = p->next) {
    // 訪問 p->data
}

4. 釋放銷毀

Node *p = head->next;
while(p) {
    Node *tmp = p;
    p = p->next;
    free(tmp);
}
head->next = NULL;

常見錯誤與修正

錯誤代碼問題修正
node = malloc(...); node->next = ...先移動指標再分配,導致頭節點丟失先 node->next = malloc(...) 再 node = node->next
未檢查 malloc 回傳值分配失敗導致空指標解引用必須檢查 if(!ptr) handle_error()
釋放時 free(node); node = node->next;釋放後訪問野指標先保存 next 再 free
未設置 next = NULL尾節點指向隨機地址新節點必須初始化 next = NULL

進階擴展

  • 雙向鏈表:增加 prev 指標,支援反向遍歷、O(1) 刪除
  • 循環鏈表:尾節點 next 指向頭節點,適用循環調度
  • 帶哨兵節點:簡化邊界條件 (空表、首尾操作)
  • 鏈表排序:歸併排序 O(n log n) 最適合鏈表
  • 跳表:多層索引加速查找至 O(log n)

總結

鏈表是動態資料結構的基石。「頭節點哨兵 + 尾插建立 + 遍歷訪問 + 正確釋放」是 C 語言鏈表操作的標準範式。掌握指標操作、記憶體管理、邊界條件處理,是從數組思維轉向指標思維的關鍵一步。

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