下載的《信號放大器》C++ 代碼編譯通過但運行出錯,經審查 `CreatBT()` 函數存在致命邏輯錯誤:
BiTREE CreatBT() {
// ...
root = new Node;
root = NULL; // ❌ 1. 內存洩漏:new 後立即置 NULL,丟失指針
// ...
while (p.data != '0') {
s = new Node;
// ... 初始化 s ...
q.rear = (q.rear + 1) % 100;
q.ele[q.rear] = s;
q.front = (q.front + 1) % 100;
return q.ele[q.front]; // ❌ 2. 首次循環就 return!後續構建邏輯永不執行
// 以下代碼全是死代碼
if (p.parent == '0') root = s;
else { /* 連接父子節點 */ }
cin >> p.data >> p.parent >> p.tag >> p.weight;
}
return root;
}
| 行號 | 問題 | 後果 |
|---|---|---|
| root = new Node; root = NULL; | 內存洩漏 + 根節點丟失 | 樹根為空,後續遍歷崩潰 |
| 循環內首個 return | 只處理第一個節點就退出 | 樹只有 1 個節點,結構不完整 |
| 隊列操作邏輯 | front/rear 同時 +1 導致隊列永遠為空 | 無法查找父節點連接子節點 |
BiTREE CreatBT() {
cout << "請按層序輸入節點 (data parent tag weight), 0 0 0 0 結束:\n";
Bnode p;
Squeue q;
BiTREE root = NULL, s;
Makenull(q);
cin >> p.data >> p.parent >> p.tag >> p.weight;
while (p.data != '0') {
s = new Node;
s->data = p.data;
s->weight = p.weight;
s->lchild = s->rchild = NULL;
// 入隊
q.rear = (q.rear + 1) % 100;
q.ele[q.rear] = s;
if (p.parent == '0') {
root = s; // 根節點
} else {
// 在隊列中查找父節點
int f = q.front;
while ((f + 1) % 100 != (q.rear + 1) % 100 && q.ele[(f + 1) % 100]->data != p.parent) {
f = (f + 1) % 100;
}
f = (f + 1) % 100; // 指向父節點
if (q.ele[f]->data == p.parent) {
if (p.tag == 'L') q.ele[f]->lchild = s;
else q.ele[f]->rchild = s;
}
}
cin >> p.data >> p.parent >> p.tag >> p.weight;
}
return root;
}
後序遍歷計算每節點最大衰減量 `D`,超過容忍值 `tolerance` 在子節點放置放大器並重置 `D`。邏輯複雜但框架正確,前提是樹構建正確。
下載的代碼請務必先閱讀核心邏輯,不要指望能直接跑通。