枫叶龟多少钱一只:这个约瑟夫环的错误在哪里

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/27 20:47:46
程序为:
#include "stdio.h"
#include "malloc.h"

#define OK 1
typedef struct slnode{
int num;
int code;
struct slnode *next;
}slnode,*linklist;

slnode *create(int n){
int i;
slnode *L,*p,*q;
L=(linklist)malloc(sizeof(slnode));
L->next=NULL;
p=(linklist)malloc(sizeof(slnode));
L->next=p;
printf("code is:\n");
scanf("%d",&p->code);
p->num=1;
for(i=2;i<=n;i++){
q=p;
p=(linklist)malloc(sizeof(slnode));
q->next=p;
scanf("%d",&p->code);
p->num=i;
}
p->next=L->next;
return L;
}

int deal(linklist L,int m){
int i,k=m;
linklist q,p;
p=L->next;
while(p){
for(i=1;i<k-1;i++)p=p->next;
q=p->next;
printf("%d ",q->num);
k=q->code;
if(p==p->next)p=NULL;
else{p->next=q->next;
p=q->next;
free(q);
}
}return OK;
}

main(){
linklist L;
int n,m;
printf("qing shu ru ren shu:\n");
scanf("%d",&n);
printf("qing shu ru m:\n");
scanf("%d",&m);
L=create(n);
deal(L,m);
}

====================
约瑟夫问题描述:编号为1,2,3,……,n的n个人按顺时针方向围坐一圈。任选一个正整数作为报数上限m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。设计程序输出出列顺序。
---
我编了上面的程序,发现当输入七个人的密码分别是3,1,7,2,4,8,4。第一个执行的个数是20 时候,出来的结果不是6,1,4,7,2,3,5而是6,1,4,7,2,5,3;就是后面的3和5不对,为什么?请高手帮忙解释并且修改,(只需要修改deal这个函数便可),望高手解答!

for(i=1;i<k-1;i++)p=p->next
看看i<k-1改为i<k试试