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;
C語言允許不完全類型指針:在結構體定義內部使用struct Node*,編譯器知道指針大小(固定為機器字長),無需知道完整結構佈局。這稱為前向聲明機制。
// 錯誤:嵌套導致無限遞歸大小
struct Node { struct Node next; }; // ❌
// 正確:指針引用
struct Node { struct Node *next; }; // ✅
typedef struct Node Node; // 先聲明別名
struct Node {
int data;
Node *prev; // 直接用別名
Node *next;
};
結構體包含多個自身類型指針不僅合法,更是實現鏈表、樹、圖等核心數據結構的標準做法。無需void*繞彎路,直接聲明struct Node*即可。