c++链表解决约瑟夫环
时间: 2023-06-10 09:08:39 浏览: 108
c++链表,解决约瑟夫环问题
5星 · 资源好评率100%
约瑟夫环是一个经典的问题,可以使用链表来解决。以下是使用 C 语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node* next;
} Node;
Node* createList(int n) {
Node* head = (Node*)malloc(sizeof(Node));
head->data = 1;
head->next = NULL;
Node* tail = head;
for (int i = 2; i <= n; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = i;
newNode->next = NULL;
tail->next = newNode;
tail = newNode;
}
tail->next = head;
return head;
}
void josephus(int n, int m) {
Node* head = createList(n);
Node* p = head;
while (n > 1) {
for (int i = 1; i < m; i++) {
p = p->next;
}
Node* tmp = p->next;
p->next = tmp->next;
free(tmp);
n--;
}
printf("The winner is: %d\n", p->data);
free(p);
}
int main() {
josephus(10, 3);
return 0;
}
```
在这个代码中,我们先定义了一个 `Node` 结构体表示链表节点,其中包含了节点的数据和指向下一个节点的指针。
然后,我们使用 `createList` 函数创建一个包含 `n` 个节点的循环链表。在创建过程中,我们先创建头节点 `head`,然后依次创建剩余的 `n-1` 个节点,并将它们链接在一起形成循环链表。
最后,我们使用 `josephus` 函数来模拟约瑟夫环的过程。在每一轮中,我们先找到第 `m` 个节点,然后将它从链表中删除。直到链表中只剩下一个节点为止,这个节点就是胜利者。
最后,我们释放掉所有的节点内存,程序结束。
阅读全文