C语言约瑟夫指针代码实现
时间: 2023-11-06 20:58:20 浏览: 97
约瑟夫问题C语言代码实现过程
5星 · 资源好评率100%
以下是使用指针实现约瑟夫问题的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct _node {
int value;
struct _node *next;
} Node;
Node *createList(int n) {
Node *head = NULL, *prev = NULL, *new_node = NULL;
int i;
for (i = 1; i <= n; i++) {
new_node = (Node *)malloc(sizeof(Node));
new_node->value = i;
new_node->next = NULL;
if (head == NULL) {
head = new_node;
} else {
prev->next = new_node;
}
prev = new_node;
}
prev->next = head;
return head;
}
void josephus(int n, int m) {
Node *head = createList(n);
Node *p = head, *prev = NULL;
int i;
while (p->next != p) {
for (i = 1; i < m; i++) {
prev = p;
p = p->next;
}
prev->next = p->next;
printf("%d ", p->value);
free(p);
p = prev->next;
}
printf("%d\n", p->value);
free(p);
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
josephus(n, m);
return 0;
}
```
在这个实现中,我们使用了一个链表来表示所有的人。在创建链表时,我们将最后一个人的next指向了第一个人,使得链表形成了一个环。
接着,在约瑟夫问题的解法中,我们使用两个指针p和prev来遍历链表。当p指向第m个人时,我们将prev的next指向p的next,然后释放p的内存。最后,我们将p指向prev的下一个人,重新开始遍历。当链表中只剩下一个人时,我们输出该人的编号并释放其内存。
需要注意的是,在释放节点的内存时,我们应当先将p指向p的next,再释放p的内存。这是因为在释放p之后,我们无法再访问p的next指针,因此需要在释放p之前,先将其next指针保存下来。
阅读全文