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

C 語言鏈表實作:帶表頭節點的單向鏈表完整範例

     編輯:關於C語言

帶表頭節點的設計優勢

引入一個不存儲有效資料的虛擬表頭節點,可統一「空鏈表」與「非空鏈表」的操作邏輯:插入、刪除、查找均無需特別判斷是否操作第一個節點,代碼更簡潔、錯誤更少。

資料結構定義

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

struct Node {
    int num;
    struct Node *next;
};
typedef struct Node *Link;

核心操作實作

1. 建立鏈表(尾插法)

Link createList(int *arr, int len) {
    Link head = (Link)malloc(sizeof(struct Node));
    if (!head) { fprintf(stderr, "記憶體配置失敗\n"); return NULL; }
    head->next = NULL;

    Link tail = head;
    for (int i = 0; i < len; ++i) {
        Link node = (Link)malloc(sizeof(struct Node));
        if (!node) { /* 需釋放已分配節點,此處略 */ return NULL; }
        node->num = arr[i];
        node->next = NULL;
        tail->next = node;
        tail = node;
    }
    return head;  // 返回虛擬表頭
}

2. 列印鏈表

void printList(Link head) {
    Link p = head->next;  // 跳過虛擬表頭
    while (p) {
        printf("%d ", p->num);
        p = p->next;
    }
    putchar('\n');
}

3. 查找節點(按值)

Link findNode(Link head, int value) {
    Link p = head->next;
    while (p) {
        if (p->num == value) return p;
        p = p->next;
    }
    return NULL;
}

4. 插入節點(在指定值之後;若未找到則插在第一個數據節點前)

Link insertNode(Link head, int afterValue, int newValue) {
    Link newNode = (Link)malloc(sizeof(struct Node));
    if (!newNode) return NULL;
    newNode->num = newValue;
    newNode->next = NULL;

    Link target = findNode(head, afterValue);
    if (!target) {  // 未找到:插在第一個數據節點之前
        newNode->next = head->next;
        head->next = newNode;
    } else {        // 找到:插在目標節點之後
        newNode->next = target->next;
        target->next = newNode;
    }
    return head;
}

主程式測試

int main() {
    int data[6] = {1,2,3,4,5,6};
    Link head = createList(data, 6);
    if (!head) return 1;

    printf("原始鏈表:");
    printList(head);

    head = insertNode(head, 6, 23);  // 在值為 6 的節點後插入 23
    printf("插入後:");
    printList(head);

    // 記憶體釋放略
    return 0;
}

關鍵點總結

  • 虛擬表頭消除首節點特判,插入/刪除邏輯統一。
  • 所有 malloc 必須檢查返回值;生產代碼應補全錯誤路徑下的記憶體釋放。
  • 查找、列印均從 head->next 起始,跳過虛擬節點。
  • 此實作為單向鏈表;若需頻繁反向遍歷,考慮雙向鏈表。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved