用c++设计一个类解决约瑟夫环
时间: 2024-05-13 14:14:10 浏览: 68
用vector解决约瑟夫环.txt
约瑟夫环是一个经典的问题,可以通过链表或数组来实现。以下是使用 C 语言设计的类来解决约瑟夫环的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义节点结构体
typedef struct Node {
int data; // 数据域
struct Node *next; // 指针域
} Node;
// 定义约瑟夫环类
typedef struct Josephus {
int size; // 环的大小
Node *head; // 头指针
Node *tail; // 尾指针
// 添加节点
void add(int data) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = data;
node->next = NULL;
if (this->head == NULL) {
this->head = node;
this->tail = node;
} else {
this->tail->next = node;
this->tail = node;
}
this->size++;
}
// 删除节点
void remove(Node *prev, Node *curr) {
if (prev == NULL) {
this->head = curr->next;
} else {
prev->next = curr->next;
}
if (curr == this->tail) {
this->tail = prev;
}
free(curr);
this->size--;
}
// 解决约瑟夫环问题
void solve(int k) {
Node *prev = NULL;
Node *curr = this->head;
int count = 0;
while (this->size > 1) {
count++;
if (count == k) {
this->remove(prev, curr);
count = 0;
} else {
prev = curr;
curr = curr->next;
}
if (curr == NULL) {
curr = this->head;
}
}
printf("The last remaining person is %d.\n", this->head->data);
}
} Josephus;
int main() {
Josephus josephus = {0, NULL, NULL};
int n, k, i;
printf("Please enter the number of people in the circle: ");
scanf("%d", &n);
printf("Please enter the number of people to be eliminated each time: ");
scanf("%d", &k);
for (i = 1; i <= n; i++) {
josephus.add(i);
}
josephus.solve(k);
return 0;
}
```
在上面的代码中,我们使用了节点结构体来定义每个节点,然后定义了约瑟夫环类。约瑟夫环类包含了环的大小、头指针和尾指针,以及添加、删除和解决问题的方法。在解决问题的方法中,我们使用一个计数器来记录每次删除的人数,当计数器达到指定的值时,就删除当前节点。如果当前节点是最后一个节点,则将当前节点指向头节点。
在 main 函数中,我们首先从用户输入中获取环的大小和每次删除的人数,然后使用 for 循环向环中添加节点。最后,我们调用约瑟夫环类的 solve 方法来解决问题,并输出最后留下的人的编号。
阅读全文