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

C++ 基礎復習精華:結構體、共用體、枚舉、鏈表完整圖解

     編輯:關於C++

結構體:異構數據聚合

定義與實例化


struct Student { int id; char* name; };
Student s1;                    // 默認初始化 (成員不初始化)
Student s2 = {1001, "Zhang"};  // 聚合初始化 (C++20 指定初始化: .id=1001)
Student s3{1002, "Li"};        // 列表初始化

內存佈局

  • 成員**按聲明順序**連續存儲,編插器插入**填充字節**對齊 (如 char + int 中間 3 字節填充)。
  • sizeof(Student) ≥ 成員大小之和。
  • 可用 #pragma pack(n) 或 alignas (C++11) 控制對齊。

成員訪問


Student* p = &s1;
s1.id; p->id; (*p).id; // 等價

結構體進階應用

結構體數組與排序


Student stu[20];
// 輸入...
sort(stu, stu+20, [](const Student& a, const Student& b){
    return a.score != b.score ? a.score > b.score : a.id < b.id;
});

結構體指針鏈表節點


struct Node { int data; Node* next; };
Node* head = nullptr;
// 頭插法建表
for (int i = 9; i >= 0; --i) {
    Node* p = new Node{i, head};
    head = p;
}
// 遍歷
for (Node* p = head; p; p = p->next) cout << p->data << ' ';
// 銷毀
while (head) { Node* tmp = head; head = head->next; delete tmp; }

共用體:節省內存的互斥存儲

特點

  • 所有成員**共享同一塊內存**,大小 = 最大成員大小 (對齊後)。
  • 同一時刻**只能存儲一個成員**的值,寫入新成員會覆蓋舊值。
  • 常用於:類型雙關、協議解析、節省內存 (如標記聯合)。

union Data { int i; float f; char c[4]; };
Data d; d.i = 0x41424344; // 'A','B','C','D' 的 ASCII
cout << d.c[0] << d.c[1] << d.c[2] << d.c[3]; // 輸出 DCBA (小端序)

匿名共用體 (C++11)


struct Packet {
    int type;
    union { int intVal; float floatVal; char strVal[16]; }; // 直接用 intVal 訪問
};

枚舉類型:命名常量集合

傳統 enum (非作用域)


enum Color { RED, GREEN, BLUE }; // 隱式轉 int,污染外部作用域
Color c = RED; int x = RED; // 合法但危險

C++11 enum class (強類型,強烈推薦)


enum class Color : uint8_t { RED = 1, GREEN = 2, BLUE = 4 }; // 指定底層類型
Color c = Color::RED; // 作用域隔離
// int x = Color::RED; // 編譯錯誤,需 static_cast
uint8_t val = static_cast(c); // 1

位掩碼枚舉技巧


enum class Flag : uint32_t { None=0, Read=1, Write=2, Exec=4 };
constexpr Flag operator|(Flag a, Flag b) { return Flag(static_cast(a) | static_cast(b)); }
Flag perm = Flag::Read | Flag::Write; // 3

鏈表:動態數據結構核心

分類

  • 單向/雙向/循環
  • 帶頭節點 / 不帶頭節點 (頭節點簡化邊界條件)

核心操作複雜度

操作單向鏈表雙向鏈表
查找/遍歷O(n)O(n)
插入/刪除 (已知位置)O(1)O(1)
插入/刪除 (按值查找)O(n)O(n)
反向遍歷不可O(n)

關鍵操作圖解 (文字版)

頭插法建表:新節點 next = head; head = newNode; (逆序)

尾插法建表:維護 tail 指針,tail->next = newNode; tail = newNode; (正序)

插入節點 (單向,已知前驅 pre):newNode->next = pre->next; pre->next = newNode;

刪除節點 (單向,已知前驅 pre):Node* del = pre->next; pre->next = del->next; delete del;

雙向鏈表插入:同時維護 prev/next 四個指針賦值。

現代 C++ 替代方案

  • **順序容器**:std::vector (動態數組)、std::list (雙向鏈表)、std::forward_list (單向鏈表)。
  • **智能指針鏈表**:struct Node { int data; unique_ptr next; }; 自動銷毀,無需手動 delete。
  • **算法複用**:std::find, std::remove_if 等配合迭代器使用。

總結

結構體/共用體/枚舉是 C++ 自定義類型基石;鏈表是理解指針、動態內存、遞歸的最佳練習。**實戰中優先用 STL 容器**,手寫鏈表僅用於教學、嵌入式無 STL 環境、或極端定製場景 (如無鎖隊列、內存池節點)。

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