C++输入正整数n、m(m<n),设有n个人坐成一圈,从第1个人开始循环报数,报到m的人出列,然后再从下一个人开始报数,报到m的人又出列,如此重复,直到所有的人都出列为止。要求用链式结构和顺序结构实现,按出列的先后顺序输出每个人的信息。
时间: 2024-11-09 10:21:21 浏览: 10
oj_从1开始报数_编号1至n_n个死囚犯围成一圈_报到数m时_继续上述操作_
5星 · 资源好评率100%
在C++中,我们可以使用双向链表(因为删除节点后,需要能快速找到下一个节点)来模拟这个过程。这里假设每个节点包含一个整数值和指向前后两个节点的指针。首先,我们需要定义一个节点类`Person`,然后实现一个循环报数的函数`countOut()`。
```cpp
class Person {
public:
int number;
Person* next;
Person* prev;
Person(int num) : number(num), next(nullptr), prev(nullptr) {}
};
// 链表头部初始化
Person* head = nullptr;
void insertPerson(int n) {
for (int i = 1; i <= n; ++i) {
Person* node = new Person(i);
if (!head) {
head = node;
head->prev = nullptr;
} else {
Person* tail = head->prev;
tail->next = node;
node->prev = tail;
node->next = head;
}
}
}
void countOut(int m) {
Person* current = head;
while (current != nullptr) {
if (current->number == m) {
// 移除节点并保持链表连通
if (current->prev != nullptr) {
current->prev->next = current->next;
} else { // 如果当前是第一个节点
head = current->next;
head->prev = nullptr;
}
if (current->next != nullptr) {
current->next->prev = current->prev;
}
delete current; // 删除节点
current = current->next;
} else {
current = current->next;
}
}
}
// 输出结果
void printOrder() {
Person* temp = head;
while (temp != nullptr) {
std::cout << "Person " << temp->number << " has been removed.\n";
temp = temp->prev;
}
}
```
阅读全文