约瑟夫问题用循环链表c语言
时间: 2023-11-07 15:05:05 浏览: 91
好的,下面是约瑟夫问题的循环链表实现的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建循环链表
ListNode* createList(int n) {
ListNode *head = (ListNode*)malloc(sizeof(ListNode));
head->val = 1;
head->next = NULL;
ListNode *prev = head;
for (int i = 2; i <= n; i++) {
ListNode *node = (ListNode*)malloc(sizeof(ListNode));
node->val = i;
node->next = NULL;
prev->next = node;
prev = node;
}
prev->next = head;
return head;
}
// 解决约瑟夫问题
int josephus(int n, int m) {
ListNode *head = createList(n);
ListNode *p = head;
while (p->next != p) {
for (int i = 1; i < m-1; i++) {
p = p->next;
}
printf("%d ", p->next->val);
p->next = p->next->next;
p = p->next;
}
int res = p->val;
free(p);
return res;
}
int main() {
int n = 5, m = 3;
int res = josephus(n, m);
printf("\nThe last number is: %d\n", res);
return 0;
}
```
在这个代码中,我们首先定义了链表节点结构体 `ListNode`,然后通过 `createList()` 函数创建了一个包含 `n` 个节点的循环链表。接着,我们使用 `josephus()` 函数来解决约瑟夫问题。该函数通过循环遍历链表,找到要删除的节点,并将其从链表中删除。最后,我们返回最后一个被删除的节点的值作为结果。
注意,由于约瑟夫问题是一个经典问题,因此这个代码中的实现方式并不唯一。可能会有更高效的算法或者更简洁的代码实现方式。
阅读全文