首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 二元搜尋樹登入系統除錯:修正 search 函數遺漏 return 導致無限迴圈

     編輯:程式設計綜合問答

問題現象

程式編譯通過,執行後輸入帳號密碼卻無任何反應,疑似陷入無限迴圈或函數未正確返回。

程式碼缺陷分析

void search(string name2, string keyword2, bool& nameb, bool& keywordb, node* root) {
    node* p = root;
    nameb = keywordb = false;
    while (p) {
        if (name2 < p->name) p = p->left;
        else if (name2 > p->name) p = p->right;
        else {
            nameb = true;
            if (keyword2 == p->keyword) keywordb = true;
            else keywordb = false;
            // 缺少 return 或 break,導致 while 迴圈持續執行,p 不變,無限迴圈
        }
    }
}

當找到節點(name2 == p->name)後,未跳出迴圈,p 指標不變,條件 while(p) 永真,程式掛死。

修正版 search 函數

void search(string name2, string keyword2, bool& nameb, bool& keywordb, node* root) {
    node* p = root;
    nameb = keywordb = false;
    while (p) {
        if (name2 < p->name) p = p->left;
        else if (name2 > p->name) p = p->right;
        else {
            nameb = true;
            if (keyword2 == p->keyword) {
                keywordb = true;
                return;   // 找到並密碼正確,直接返回
            } else {
                keywordb = false;
                return;   // 找到但密碼錯誤,直接返回
            }
        }
    }
    // 迴圈結束未找到節點,nameb、keywordb 保持 false
}

主程式邏輯優化建議

int main() {
    // ... 建樹略 ...

    string username, password;
    cout << "請輸入帳號密碼: ";
    cin >> username >> password;

    bool nameOk, passOk;
    search(username, password, nameOk, passOk, root);

    if (nameOk && passOk) {
        cout << "登入成功!" << endl;
    } else if (nameOk && !passOk) {
        // 密碼錯誤,允許重試
        while (true) {
            cout << "密碼錯誤,請重新輸入: ";
            cin >> password;
            search(username, password, nameOk, passOk, root);
            if (passOk) {
                cout << "登入成功!" << endl;
                break;
            }
        }
    } else {
        cout << "帳號不存在" << endl;
    }
    return 0;
}

關鍵觀念

  • 搜尋樹遍歷必須有明確終止條件:找到目標、走到葉子(p == nullptr)、或發現不匹配並決定返回。
  • 參考傳遞 bool& 僅用於回傳結果,不可作為迴圈控制變數。
  • 善用除錯器設中斷點 觀察 p 指標變化,能秒殺此類邏輯錯誤。

延伸練習

嘗試將密碼改為雜湊值(如 SHA-256)儲存,並在 search 中比對雜湊,提升安全性。

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