開發者實作雙向鏈表儲存長整數 (每節點 4 位數) 進行加法,發現異號相加 (如 -2 + 1) 結果錯誤輸出 -1,9999,且 0+0 也異常。本文深度分析演算法邏輯缺陷並提供修正思路。
typedef struct node {
int data; // 節點數值 (0-9999)
struct node *prior; // 前驅指標
struct node *next; // 後繼指標
} node;
// 表頭節點特殊用法:
// head->data = 1 (正數) 或 -1 (負數) — 符號位
// head->next 指向最高位節點 (萬位)
// 尾節點 next 指向 head->next (循環雙向鏈表)
create():讀取逗號分隔輸入 (如 1,2345,6789),建立循環雙向鏈表,表頭存符號add_Num():從最低位 (尾節點) 向最高位 (頭節點) 逐節點相加,處理進位output():從最高位輸出,補齊前導零在 add_Num() 中,異號處理邏輯 (e1*e2 != 1) 存在根本性錯誤:
// 當前錯誤邏輯片段
if (e1 * e2 == 1) { // 同號
sum->data = e1;
s->data = abs(s->data);
if (s->data >= 10000) { s->data -= 10000; carry = 1; }
else carry = 0;
} else { // 異號 — 這裡邏輯錯誤!
if (s->data >= 0) carry = 0;
else { s->data += 10000; carry = -1; }
}
num1 = -2 (表頭 -1, 節點 2), num2 = 1 (表頭 1, 節點 1)s->data = 2*(-1) + 1*1 = -1s->data < 0 → s->data += 10000 = 9999, carry = -1e1 (即 -1),輸出 -1,9999異號相加 = 大絕對值減小絕對值,結果符號跟隨大絕對值
建議參考經典教學實作:
若非教學必須用鏈表,現代 C 語言建議:
GMP (GNU Multiple Precision) 庫:mpz_t 類型支援任意精度整數boost::multiprecision::cpp_int鏈表長整數加法的異號 Bug 根因在於符號-絕對值表示法下錯用補數借位邏輯。正確做法是分離「比較大小→大減小→借位→設定符號」四步驟。建議教學階段先用陣列實作掌握核心演算法,再挑戰指標版本;實務專案直接採用成熟多精度庫。