约瑟夫环C语言求大神纠错,其编号为1,2,…,n(n & gt;0)个人顺时针坐成一圈,每个人拿着一个正整数密码。
# include & ltstdlib.h & gt
typedef结构Jonse
{
长码;
struct Jonse * next
} Jonse
jonse * Create(long n);//创建约瑟夫环
Jonse* JonseOut(Jonse*,long,long,long,long);//执行约瑟夫的生死游戏
Jonse* Create(long n) //创建一个循环链表,并给链表的code字段赋值。
{
Jonse *h,* p;
h =(Jonse *)malloc(sizeof(Jonse));
p = h;
for(long I = 1;我& lt= n;i++)
{
p->;code = I;
如果(我& ltn)
{
p->;next =(Jonse *)malloc(sizeof(Jonse));//分配空间
p = p-& gt;接下来;
}
}
p->;next = h;
返回p;//返回指向循环链表结尾的指针。
}
Jonse * Jonse out (Jonse * h,long n,long b,long m,long s)//* h链表末尾总人数B起始位置M死亡人数S剩余人数。
{
琼斯*p,*q,* r;
q = h;
p = h-& gt;接下来;
r = h-& gt;接下来;
long i,flag = 0;//flag记录死亡人数。
Char A[]= "第一个";
Char B[]= "死者的位置是:";
for(I = 1;我& ltb;I++) //让指针指向开始位置。
{
q = p;
p = p-& gt;接下来;
}
while(flag & lt;南北走向)
{
for(长k = 1;k & ltm;K++) // loop使指针指向要删除的节点的位置。
{
q = p;
p = p-& gt;接下来;
}
flag++;
printf("%s%d%s ",A,flag,B);
printf("%d\n ",p-& gt;码);
如果(q->;代码& gtp->;代码& amp& ampp->;代码& lt(p->;下一个)-& gt;Code) //判断要删除的节点是否是第一个节点。
{
r = r-& gt;接下来;
}
q->;next = p-& gt;接下来;//删除死节点
免费(p);
p = NULL
p = q-& gt;接下来;
}
printf(" \ n ");
Printf("最后剩下的人数:");
printf("%d ",s);
printf(" person \ n ");
Printf("剩余活人的位置是:");//输出幸存者的位置
for(long I = 1;我& lt= s;i++)
{
printf("%d\t ",r-& gt;码);
r = r-& gt;接下来;
}
printf(" \ n ");
返回0;
}
int main()
{
长n,b,h,s;
jonse * p;
Printf("请输入生死游戏总人数:");
scanf("%d ",& ampn);//输入生死游戏总数,赋给n。
Printf("请输入游戏开始的地点:");
scanf("%d ",& ampb);//输入游戏的起始位置,赋给b。
Printf("请输入死亡人数:");
scanf("%d ",& amph);//输入死亡号,赋给h。
Printf("请输入剩余幸存者人数:");
scanf("%d ",& amps);//输入幸存者人数,分配给s。
printf(" \ n ");
p = Create(n);//创建循环链表
JonseOut(p,n,b,h,s);//玩一场生死游戏
}