C语言约瑟夫指针代码实现
时间: 2023-11-02 11:12:41 浏览: 43
以下是一个C语言的约瑟夫指针代码实现,其中使用了双向循环链表结构体:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *prev, *next;
} Node, *LinkList;
LinkList createList(int n) {
LinkList head, p, q;
int i;
head = (LinkList)malloc(sizeof(Node));
head->data = 1;
head->prev = head->next = head;
q = head;
for (i = 2; i <= n; i++) {
p = (LinkList)malloc(sizeof(Node));
p->data = i;
p->prev = q;
p->next = q->next;
q->next->prev = p;
q->next = p;
q = p;
}
return head;
}
void josephus(LinkList L, int m) {
LinkList p = L, q;
int i;
while (p != p->next) {
for (i = 1; i < m; i++) {
p = p->next;
}
q = p->next;
p->prev->next = p->next;
p->next->prev = p->prev;
printf("%d ", p->data);
free(p);
p = q;
}
printf("%d\n", p->data);
free(p);
}
int main() {
int n, m;
LinkList L;
printf("请输入总人数和报数的数:");
scanf("%d%d", &n, &m);
L = createList(n);
josephus(L, m);
return 0;
}
```
该代码中,`createList`函数用于创建一个双向循环链表,其中头结点的`data`字段表示第一个人的编号,其他结点的`data`字段表示从第二个人开始的编号。`josephus`函数用于模拟约瑟夫问题的过程,每次遍历到第`m`个结点,将其从链表中删除并打印出其编号。最后,当链表中只剩下一个结点时,直接输出其编号即可。