原代碼中 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;
}
