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

C++ 單向循環鏈表實現約瑟夫問題:常見指針錯誤修正指南

     編輯:程式設計綜合問答

問題代碼分析

原代碼中 Node 類定義了多個 char* 指針成員(name、number 等),但在 input3() 中僅分配了 Node 對象本身,未為這些字符指針分配內存,導致 cin >> q->name 向野指針寫入,引發崩潰。

三種修正方案

方案一:改用字符串類型(推薦)

class Node {
public:
    Node *next;
    std::string name, number, sex, age, banji, heal;
};

方案二:構造函數中分配內存

class Node {
public:
    Node *next;
    char *name, *number, *sex, *age, *banji, *heal;
    Node() {
        next = nullptr;
        name = new char[20];
        number = new char[20];
        sex = new char[10];
        age = new char[10];
        banji = new char[20];
        heal = new char[20];
    }
    ~Node() {
        delete[] name; delete[] number; delete[] sex;
        delete[] age; delete[] banji; delete[] heal;
    }
};

方案三:輸入前臨時分配

q = new Node();
q->name = new char[20];
q->number = new char[20];
// ... 其他字段同理
cin >> q->name >> q->number ...;

完整可運行示例(採用方案一)

#include 
#include 
using namespace std;

struct Node {
    Node *next;
    string name, number, sex, age, banji, heal;
};

class Josephus {
    Node *head;
    int n;
public:
    Josephus() : head(nullptr), n(0) {}
    void input() {
        cout << "輸入人數: "; cin >> n;
        Node *tail = nullptr;
        for (int i = 0; i < n; ++i) {
            Node *p = new Node();
            cout << "第" << i+1 << "人 (name number sex age banji heal): ";
            cin >> p->name >> p->number >> p->sex >> p->age >> p->banji >> p->heal;
            p->next = nullptr;
            if (!head) head = tail = p;
            else { tail->next = p; tail = p; }
        }
        tail->next = head; // 形成循環
    }
    void solve() {
        Node *pre = head, *cur = head;
        while (pre->next != pre) pre = pre->next; // pre 指向尾節點
        int k;
        cout << "輸入步長 k: "; cin >> k;
        while (cur->next != cur) {
            for (int i = 1; i < k; ++i) {
                pre = cur;
                cur = cur->next;
            }
            cout << "出局: " << cur->name << " " << cur->number << endl;
            pre->next = cur->next;
            delete cur;
            cur = pre->next;
        }
        cout << "獲勝者: " << cur->name << " " << cur->number << endl;
        delete cur;
    }
};

int main() {
    Josephus j;
    j.input();
    j.solve();
    return 0;
}

示例動畫 結果截圖

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