使用C语言单循环链表解决“约瑟夫环问题”的完整代码
时间: 2024-12-23 14:18:37 浏览: 33
约瑟夫环问题是这样的:给定一个正整数n和一个起始位置m(0 <= m < n),数组中的每个元素按顺序编号从1开始,从m开始,按照逆时针方向每次跳过k个元素,直到再次回到起点。请问最后会停在哪一位?
在C语言中,我们可以使用单循环链表来模拟这个过程。首先,我们需要定义一个节点结构,并设置两个指针,一个指向当前节点,另一个作为标记。这里是一个完整的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* create_list(int n) {
Node* head = (Node*)malloc(sizeof(Node));
if (!head) {
printf("Memory allocation failed.\n");
return NULL;
}
Node* current = head;
for (int i = 1; i <= n; ++i) {
current->data = i;
current->next = head;
current = current->next;
}
return head;
}
void josephus(Node** head, int k, int start) {
Node* last = *head;
Node* runner = *head;
int position = start - 1;
while (runner != last) {
runner = runner->next;
position--;
if (position == 0) {
position = k - 1;
*head = runner;
}
}
printf("The last person is at index %d.\n", position + 1);
}
int main() {
int n, k, start;
printf("Enter the number of people in the circle: ");
scanf("%d", &n);
printf("Enter the skip value (k): ");
scanf("%d", &k);
printf("Enter the starting position (m+1): ");
scanf("%d", &start);
Node* list = create_list(n);
if (list) {
josephus(&list, k, start);
}
return 0;
}
```
在这个程序中,`create_list()`函数用于创建包含n个元素的链表,`josephus()`函数处理约瑟夫环问题。在`main()`中,用户输入n、k和起始位置,然后调用这两个函数。
阅读全文