首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C語言結構體可否包含多個自身類型指針?雙向鏈表與多叉樹實證

     編輯:程式設計疑難解答

直接回答:完全可以,且是常見數據結構基石

經典案例一:雙向鏈表

typedef struct DNode {
    int data;
    struct DNode *prev;  // 指向前驅
    struct DNode *next;  // 指向後繼
} DNode;

兩個指針分別指向前驅/後繼節點,構成雙向鏈接。

經典案例二:二叉樹/多叉樹

// 二叉樹
typedef struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode;

// 多叉樹(左孩子右兄弟表示法)
typedef struct MultiNode {
    int val;
    struct MultiNode *first_child; // 長子
    struct MultiNode *next_sibling; // 兄弟
} MultiNode;

經典案例三:圖的鄰接表節點

typedef struct ArcNode {
    int adjvex;              // 邊指向的頂點索引
    struct ArcNode *nextarc; // 下一條邊
    int weight;              // 權重
} ArcNode;

為什麼不需要 void* 強轉?

C語言允許不完全類型指針:在結構體定義內部使用struct Node*,編譯器知道指針大小(固定為機器字長),無需知道完整結構佈局。這稱為前向聲明機制。

避坑指南

  • 嵌套定義 vs 分離聲明:
    // 錯誤:嵌套導致無限遞歸大小
    struct Node { struct Node next; }; // ❌
    
    // 正確:指針引用
    struct Node { struct Node *next; }; // ✅
  • typedef 前向聲明技巧:
    typedef struct Node Node; // 先聲明別名
    struct Node {
        int data;
        Node *prev; // 直接用別名
        Node *next;
    };

結論

結構體包含多個自身類型指針不僅合法,更是實現鏈表、樹、圖等核心數據結構的標準做法。無需void*繞彎路,直接聲明struct Node*即可。

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