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

C語言結構體進階:包含數組、嵌套結構與鏈表實現

     編輯:關於C語言

結構體包含數組

struct Rec {
    int x[3];  // 固定大小數組作為成員
    int y;
} r1;

r1.x[0] = 11; r1.x[1] = 22; r1.x[2] = 33;
r1.y = 99;

數組成員內嵌於結構體內存中,非指標,隨結構體整體複製/傳遞。

結構體嵌套結構體

方式一:獨立定義再引用

struct Rec1 { int x, y, z; };
struct Rec2 {
    int ID;
    struct Rec1 num;  // 嵌套結構體變量
} R;

R.num.x = 1;  // 訪問嵌套成員

方式二:匿名嵌套定義

struct Rec {
    int ID;
    struct {        // 匿名結構體類型
        int x, y, z;
    } num;          // 變量名 num
} R;

兩種方式內存佈局相同,匿名方式更緊湊、封裝性更強。

鏈表基石:結構體包含自引用指標

struct Rec {
    int x, y;
    struct Rec *next;  // 指向同類型結構體的指標
} *p = NULL, *pFirst = NULL, *pPrec = NULL;

建立鏈表(頭插法/尾插法)

for (int i = 0; i < 10; i++) {
    p = malloc(sizeof(struct Rec));
    p->x = i;
    p->y = i * i;
    p->next = NULL;

    if (!pFirst) {          // 首節點
        pFirst = p;
        pPrec = p;
    } else {                // 尾插
        pPrec->next = p;
        pPrec = p;
    }
}

遍歷鏈表

p = pFirst;
while (p) {
    printf("%d,%d\n", p->x, p->y);
    p = p->next;
}

釋放鏈表(必須保存 next 再 free)

p = pFirst;
while (p) {
    pPrec = p;
    p = p->next;
    free(pPrec);
}

內存佈局圖解

struct Rec (含數組)          struct Rec (鏈表節點)
+----------+----------+      +----------+----------+----------+
| x[0]     | x[1]     |      | x        | y        | next  *  |  →  下一節點
| x[2]     | y        |      +----------+----------+----------+
+----------+----------+      (next 存儲下一節點地址)

關鍵注意點

  • 自引用指標必須聲明為指標:struct Rec next; 會導致無限遞歸大小,編譯錯誤。
  • malloc 分配單個節點,free 逐個釋放,防止內存洩漏。
  • 結構體賦值/傳值會複製整個內嵌數組,大結構體傳遞建議用指標。
  • 嵌套結構體 與 指向結構體的指標 語義截然不同:前者內嵌數據,後者引用外部數據。

總結

結構體支援數組成員(內嵌存儲)、嵌套結構(組合建模)與自引用指標(構建鏈表、樹等動態數據結構)。掌握這三種模式,即可在 C 語言中構建任意複雜的數據模型,是系統編程、數據結構實現的基石。

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