环形链表的约瑟夫问题c语言
时间: 2023-11-28 09:06:13 浏览: 105
环形链表的约瑟夫问题是一个经典的问题,可以使用环形链表来解决。首先,我们需要创建一个结构体来表示每个士兵,包括士兵的编号和指向下一个士兵的指针。然后,我们可以使用循环来模拟报数的过程,每次数到m的士兵就被杀死出列,直到只剩下一个士兵为止。
下面是一个示例代码:
```
#include <stdio.h>
#include <stdlib.h>
struct soldier {
int num;
struct soldier *next;
};
int main() {
int n, m;
printf("请输入士兵的数量和报数的数字:");
scanf("%d %d", &n, &m);
// 创建环形链表
struct soldier *head = (struct soldier *)malloc(sizeof(struct soldier));
head->num = 1;
struct soldier *p = head;
for (int i = 2; i <= n; i++) {
struct soldier *new_soldier = (struct soldier *)malloc(sizeof(struct soldier));
new_soldier->num = i;
p->next = new_soldier;
p = new_soldier;
}
p->next = head;
// 模拟报数过程
p = head;
while (p->next != p) {
for (int i = 1; i < m - 1; i++) {
p = p->next;
}
struct soldier *temp = p->next;
p->next = temp->next;
printf("士兵%d被杀死了\n", temp->num);
free(temp);
p = p->next;
}
printf("最后留下的士兵编号是%d\n", p->num);
// 释放内存
free(p);
return 0;
}
```
阅读全文
相关推荐


















