用c语言循环链表实现一个简单的约瑟夫环问题
时间: 2024-03-18 19:40:23 浏览: 69
好的,以下是用C语言循环链表实现一个简单的约瑟夫环问题的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int num;
struct node *next;
} Node;
int main() {
int n, m;
printf("请输入总人数n和出圈数字m:");
scanf("%d%d", &n, &m);
Node *head = (Node*)malloc(sizeof(Node));
head->num = 1;
head->next = NULL;
Node *tail = head;
for (int i = 2; i <= n; i++) {
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->num = i;
newNode->next = NULL;
tail->next = newNode;
tail = newNode;
}
tail->next = head;
Node *p = head, *prev = tail;
int count = 1;
while (p->next != p) {
if (count == m) {
prev->next = p->next;
printf("%d出圈\n", p->num);
free(p);
p = prev->next;
count = 1;
} else {
prev = p;
p = p->next;
count++;
}
}
printf("%d是最后一个出圈的\n", p->num);
free(p);
return 0;
}
```
代码实现思路如下:
1. 先输入总人数n和出圈数字m。
2. 创建循环链表,从1到n编号依次加入到链表中。
3. 从头节点开始遍历链表,每遍历到第m个节点,就将该节点从链表中删除,然后输出该节点的编号,直到链表中只剩下一个节点为止。
4. 输出最后一个节点的编号,释放链表内存空间。
代码中用到了循环链表的概念,即将最后一个节点的next指针指向头节点,形成一个环。通过循环链表可以方便地实现约瑟夫环问题。
阅读全文