算法:n个人围成一圈,每个人都有一个互不相同的密码,该密码是一个整数值,选择一个人作为起点,然后顺时针从1到k(k为起始点手中的密码值)数数。
数到k的人退出圈子,然后从下一个人开始继续从1到j(j为刚退出圈子人的密码数)数数,数到j的人退出圈子。
重复上述操作,直到最后一人
代码如下:
# include <stdio.h>
# include <stdlib.h> //free(),malloc()所在库文件
# define n 9 //数字个数
# define overflow 0 //判断溢出情况
int keyw[n]={4,7,5,9,3,2,6,1,8}; //欲处理数的数组
typedef struct lnode //声明结构体,包括两个成员,一个是数值,另一个是指向下个结点的指针
{
int keyword;
struct lnode *next;
}lnode,* linklist;
void joseph(linklist p,int m,int x) //定义约瑟夫环函数:p为循环列表头结点,m 为初始值,x为数组长度
{
linklist q; //声明变量
int i;
if(x==0)return;
q=p;
m%=x;
if(m==0)m=x;
for(i=1;i<=m;i++) //找到下一个结点
{
p=q;
q=p->next;
}
p->next=q->next;
i=q->keyword;
printf("%5d",q->keyword);
free(q);
joseph(p,i,x-1); //递归调用
}
int main()
{
int i,m;
linklist lhead,p,q;
lhead=(linklist)malloc(sizeof(lnode)); //申请结点空间
// if(!lhead) return overflow; 此处为判断溢出情况,可省略lhead->keyword=keyw[0];
lhead->next=NULL;
p=lhead;
for(i=1;i<9;i++) //创建循环列表
{
if(!(q=(linklist)malloc(sizeof(lnode))))return overflow;
q->keyword=keyw[i];
p->next=q;
p=q;
}
p->next=lhead;
printf("请输入初始值:\n");
scanf("%d",&m);
printf("输出顺序为:\n");
joseph(p,m,n);
printf("\n");
}
运行结果如下:。