使用C++面向过程分文件如下三个:1,创建链表 2,数小孩 3,小孩离开 来编写链表和结构体解决约瑟夫问题
时间: 2024-03-07 08:48:54 浏览: 58
好的,我会尽力回答你的问题。
首先,我们需要定义小孩的结构体,可以包含小孩的编号和是否还在游戏中的标志位。代码如下:
```cpp
struct Child {
int id; // 小孩编号
bool in_game; // 是否还在游戏中
};
```
接下来,我们需要创建一个链表来存储小孩信息。为了方便,我们可以使用双向循环链表。代码如下:
```cpp
struct Node {
Child child;
Node* prev;
Node* next;
};
class ChildList {
public:
ChildList() {
head_ = new Node;
head_->prev = head_->next = head_;
}
~ChildList() {
Node* node = head_->next;
while (node != head_) {
Node* temp = node;
node = node->next;
delete temp;
}
delete head_;
}
void AddChild(int id) {
Node* node = new Node;
node->child.id = id;
node->child.in_game = true;
node->prev = head_->prev;
node->next = head_;
head_->prev->next = node;
head_->prev = node;
}
Node* FindFirstInGame() {
Node* node = head_->next;
while (node != head_) {
if (node->child.in_game) {
return node;
}
node = node->next;
}
return nullptr;
}
void Remove(Node* node) {
node->prev->next = node->next;
node->next->prev = node->prev;
delete node;
}
private:
Node* head_;
};
```
这样,我们就可以通过 ChildList 类来创建链表、添加小孩、查找第一个还在游戏中的小孩、删除小孩等操作了。
接下来,我们就可以编写数小孩和小孩离开的逻辑了。代码如下:
```cpp
void Play(ChildList* child_list, int k) {
Node* node = child_list->FindFirstInGame();
while (node != nullptr) {
for (int i = 1; i < k; ++i) {
node = node->next;
if (node == child_list->head_) {
node = node->next;
}
}
node->child.in_game = false;
Node* temp = node;
node = node->next;
child_list->Remove(temp);
}
}
int main() {
ChildList child_list;
for (int i = 1; i <= 10; ++i) {
child_list.AddChild(i);
}
Play(&child_list, 3);
return 0;
}
```
在 main 函数中,我们创建了一个包含 10 个小孩的链表,然后调用 Play 函数开始玩游戏。Play 函数的参数包括一个 ChildList 指针和一个数小孩时的步长 k。在函数中,我们首先查找第一个还在游戏中的小孩,然后开始数小孩,每数到第 k 个小孩就将其标记为已离开游戏,并从链表中删除。当链表中没有还在游戏中的小孩时,游戏结束。
以上就是使用 C++ 面向过程分文件来编写链表和结构体解决约瑟夫问题的一个简单示例。希望能够对你有所帮助。
阅读全文