# struct 和動態記憶體 ###### 05.20 鄭余玄 --- # struct ---- ## 複習一下 struct ```c++ struct Student { char firstName[20]; std::string lastName; int age; bool gender; int grade; }; ``` ---- ## struct 變數宣告 ```c++ Student sprout1; ``` ---- ## 匿名 struct 變數宣告 - 可以在定義 struct 時宣告變數 ```c++ struct SproutStudent { std::string name; bool gender; int grade; } sprout; ``` - 可以在不定義 struct 名稱時宣告變數 ```c++ struct { std::string name; bool gender; int grade; } sprout; ``` ---- ## struct 初始化 ```c++ // 結構名稱 變數 = { 第一個成員的值, 第二個成員的值, ... }; SproutStudent sprout1 = {"chengscott", true, 87}; ``` ---- ## 存取 struct 成員 - 一般變數:點號(```.```) ```c++ sprout1.grade; // == 87 sprout1.gender = false; ``` - 指標變數:箭號(```->```) ```c++ SproutStudent *s = &sprout1; s->grade; // == 87 s->gender = true; // [思考] 為什麼不用: *s.grade // -> 和 . 運算子優先順序比 * 高 ``` ---- ## 函數參數傳遞 ```c++ bool isPass(Student rhs); // 慢 bool isPass(Student* rhs); // 資料不安全 ``` ```c++ bool isPass(const Student* rhs) { return rhs->grade >= 60; } ``` ```c++ bool isPass(const Student& rhs) { return rhs.grade >= 60; } ``` ---- ## 函數參數傳遞 ```c++ int totalGrade(Student rhs[]); // 資料不安全 int totalGrade(Student *rhs); // 資料不安全 int totalGrade(const Student rhs[]); // 安全 ``` --- # 動態配置記憶體 ---- ## 配置與釋放記憶體 - 靜態 - 和之前相同,會自動在宣告時配置記憶體,在結束生命週期時釋放 - 動態 - ```new``` 和 ```delete``` 運算子 ---- ## ```new``` 和 ```delete``` ```c++ Student *sprout = new Student; // ... delete sprout; // sprout == nullptr ``` ```c++ int n; Student *stu = new Student[n]; delete[] stu; ``` - ```new``` 使用之後記得 ```delete``` - 小心不要操作到 ```delete``` 後的指標 --- # 串列 ## Linked List ---- ## 單向鏈結串列 ```c++ struct Node { int data; // 節點資料 Node *next; // 指向下一個節點 }; Node *head_ = new Node; ``` - 第一個節點位置是 ```head_``` - 最後一個會指向空節點(通常是 ```nullptr```) ![](https://i.imgur.com/RhqZWKG.png) ---- ## 如何遍歷? - 找到第二個節點? - 找到第 n 個節點? ```c++ Node *cur; cur = head_; for (int i = 0; i < n; ++i) { cur = cur->next; } cur->data; // 第 n 個 ``` - 找到最後一個? ```c++ while (cur != nullptr) { cur = cur->next; } cur->data; // 最後一個 ``` ---- ## 插入節點 1. 產生新節點 2. 填寫新節點元素值 3. 填寫新節點元素下一個節點 4. 修改 ```p``` 節點的下一個節點為新節點 ![](https://i.imgur.com/bLsaJQw.png) ---- ## 刪除節點 1. 將 ```del_node``` 節點指向 ```p``` 節點的下一個節點 2. p 節點的下一個節點指向 ```del_node``` 節點的下一個節點 3. 刪除 ```del_node``` 節點 ![](https://i.imgur.com/IZwIhDx.png) ---- ## 雙向鏈結串列 ```c++ struct Node { int data; // 節點資料 Node *prev; // 指向上一個節點 Node *next; // 指向下一個節點 }; ``` ![](https://i.imgur.com/3cY2Dwo.png) ---- ## 如何? - 找到第 n 個節點? - 找到最後一個節點? - 插入節點? - 刪除節點?
{"metaMigratedAt":"2023-06-14T12:54:40.985Z","metaMigratedFrom":"YAML","title":"struct 和動態記憶體","breaks":true,"slideOptions":"{\"theme\":\"serif\"}","contributors":"[]"}
    1652 views