这是我写的问题:编号为123……n个人按照顺时针方向围坐一圈每个人持有一个密码(正整数)。开始时任选一个整数作为报数上限值m从第一个起顺时针自1顺寻报数报到m时停止报m的人出列将其密码作为新的m值从其顺时针方向的下一个开始重新从1报数直至所有人的全部出列为止。试着设计一个程序,求出出列顺寻。
这是我的代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
int key;
struct node* next;
}Node,*Linklist;
//声明函数
int In_List();
int CreatList();
int find();
Node *p=NULL;
Node *r=NULL;
Linklist L;
//初始化
int In_List()
{
L=(Linklist)malloc(sizeof(Node));
L->data=1;
printf("第一人的密码是:");
scanf("%d",&L->key);
L->next=NULL;
p=L;
return 0;
}
//建立链表
int CreatList()
{
int n;
int i=2;
printf("参与人数:");
scanf("%d",&n);
while(i<=n)
{
r=(Node*)malloc(sizeof(Node));
p->next=r;
r->data=i;
printf("请问第%d个人的密码是:",i);
scanf("%d",&r->key);
printf("----------\n");
p=r;
i++;
}
p->next=L;
p=L;
return 0;
}
//实现约瑟夫环
int find(int m)
{
int i;int b;
for(i=1;i<m;i++)
{
r=p;
p=p->next;
}
printf("%d",p->data);
system("pause");
r->next=p->next;
b=p->key;
free(p);
p=r->next;
return b;
}
//主函数
int main()
{
int m;int a;
printf("第一次的报数是:");
scanf("%d",&m);
In_List();
CreatList();
a=find(m);
while(p->next!=p)
{
find(a);
}
if(p->next=p)
{
printf("%d",p->data);
system("pause");
}
return 0;
}
问题是输入总人数为5五人密码为13241第一次报数为2输出结果应该是25134但是我的输出是25413.我看了几遍逻辑也没发现问题,为什么呢?

