#include <stdio.h>#include <stdlib.h>typedef struct node { int data; struct node *next;} Node;Node *create_circle(int n) { Node *head = NULL, *prev = NULL; for (int i = 1; i <= n; i++) { Node *curr = (Node*)malloc(sizeof(Node)); curr->data = i; if (prev != NULL) { prev->next = curr; } prev = curr; if (i == 1) { head = curr; } } prev->next = head; return head;}void josephus_circle(Node *head, int m) { Node *prev = head; while (prev->next != head) { prev = prev->next; } Node *curr = head; while (curr->next != curr) { for (int i = 1; i < m; i++) { prev = curr; curr = curr->next; } prev->next = curr->next; printf("%d ", curr->data); Node *temp = curr; curr = curr->next; free(temp); } printf("%d ", curr->data); free(curr);}int main() { int n = 5, m = 2; Node *head = create_circle(n); josephus_circle(head, m); return 0;}代码解释
时间: 2023-06-15 13:08:31 浏览: 174
#include <stdio.h>
这是一个用来解决约瑟夫环问题的 C 代码。
首先,定义了一个结构体 `node`,它包含一个 `data` 字段和一个指向下一个节点的指针 `next`。
```C
typedef struct node {
int data;
struct node *next;
} Node;
```
接下来,实现了一个 `create_circle` 函数来创建一个有 `n` 个节点的循环链表。循环链表的特点是最后一个节点的 `next` 指针指向第一个节点,因此需要在创建完最后一个节点后将它的 `next` 指针指向头节点。
```C
Node *create_circle(int n) {
Node *head = NULL, *prev = NULL;
for (int i = 1; i <= n; i++) {
Node *curr = (Node*)malloc(sizeof(Node));
curr->data = i;
if (prev != NULL) {
prev->next = curr;
}
prev = curr;
if (i == 1) {
head = curr;
}
}
prev->next = head;
return head;
}
```
然后,实现了一个 `josephus_circle` 函数来解决约瑟夫环问题。该函数接受一个循环链表的头节点指针 `head` 和一个整数 `m`,表示每隔 `m` 个节点删除一个节点,直到只剩下一个节点为止。
首先,用两个指针 `prev` 和 `curr` 分别指向循环链表的最后一个节点和第一个节点,以便后续删除节点时可以方便地修改它们之间的指针关系。
然后,从头节点开始遍历循环链表,每隔 `m-1` 个节点就将 `prev` 和 `curr` 分别指向下一个节点,直到找到要删除的节点。删除节点的方法是将 `prev` 的 `next` 指针指向 `curr` 的下一个节点,然后打印出被删除节点的 `data` 值,并释放它的内存。最后,将 `curr` 指向被删除节点的下一个节点,继续遍历循环链表,直到只剩下一个节点为止。
```C
void josephus_circle(Node *head, int m) {
Node *prev = head;
while (prev->next != head) {
prev = prev->next;
}
Node *curr = head;
while (curr->next != curr) {
for (int i = 1; i < m; i++) {
prev = curr;
curr = curr->next;
}
prev->next = curr->next;
printf("%d ", curr->data);
Node *temp = curr;
curr = curr->next;
free(temp);
}
printf("%d ", curr->data);
free(curr);
}
```
最后,在 `main` 函数中调用 `create_circle` 和 `josephus_circle` 函数来解决约瑟夫环问题。
```C
int main() {
int n = 5, m = 2;
Node *head = create_circle(n);
josephus_circle(head, m);
return 0;
}
```
阅读全文