数据结构的一道题(约瑟夫环),麻烦看一下哪错啦???
约瑟夫环问题(运行不出结果来,麻烦各位大虾们看一看,谢谢。。。)【问题描述】
编号为1,2,...,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。现在给定一个随机数m>0,从编号为1的人开始,按顺时针方向1开始顺序报数,报到m时停止。报m的人出圈,同时留下他的密码作为新的m值,从他在顺时针方向上的下一个人开始,重新从1开始报数,如此下去,直至所有的人全部出列为止。
【基本要求】
利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
【测试数据】
M的初始值为20;n等于7,7个人的密码依次为:3,1,7,2,4,8,4。
输出为:6,1,4,7,2,3,5
#include <stdio.h>
#include <malloc.h>
typedef struct LNode{
int number;
int password;
struct LNode *next;
}linklist;
void insert(linklist *q)
{
linklist *p;
p=(linklist*)malloc(sizeof(linklist));
scanf("%d%d",&p->number,&p->password);
p->next=q->next;
q->next=p;
q=q->next;
}
void Delete(linklist *q,int m,int n)
{
int x;
x=m%n;
while(q->next!=q)
{
while(q->number!=x-1)
{
q=q->next;
}
printf("%d\t",q->next->number);
m=q->next->password;
q->next=q->next->next;
}
printf("%d\n",q->number);
}
void main()
{
linklist *q;
int m,n,i;
printf("The first password is :");
scanf("%d",&m);
printf("The total number is:");
scanf("%d",&n);
if(n>30||n<0)
printf("Error!");
q=(linklist*)malloc(sizeof(linklist));
q->next=q;
scanf("%d%d",&q->number,&q->password);
for(i=1;i<=n-1;i++)
{
insert(q);
}
q=q->next;
Delete(q,m,n);
}