C语言约瑟夫环的一个小问题 求高手解决一下。

#include<stdio.h>
#include<stdlib.h>

struct list
{
int num;
int code;
struct list *next;
};

struct list *creatList(int n){ //创建循环链表
struct list *p,*s,*head; //head头结点、s创建链表、p

int i,key;//key为密码
head=(struct list *)malloc(sizeof(struct list));
p=head;

for(i=1;i<=n;i++){

key=rand() % 100;
s=(struct list *)malloc(sizeof(struct list));
s->num=i;
s->code=key;
printf("第%d个人的密码:%d\n",s->num,s->code=key);
p->next=s;
p=s;
}

s->next=head->next;
s=head;
head=head->next;
free(s);
s=head;
return head;
}

void josephRing(struct list *p,int n){ //约瑟夫出列问题

struct list *head,*s;
int i,m=1,key;
printf("\n\n输入第一个报的数:\n");
scanf("%d",&key);
head=(struct list *)malloc(sizeof(struct list));
head=p;

while(n>0){

for(i=1;i<key;i++){
s=p; // ①
p=p->next;}

printf("%d:第%d号成员出列\n",m,p->num);
key=p->code;
m=m+1;

s->next=p->next; // ②
head=p->next;
free(p);
p=head;

n=n-1;
}
}

void main(){
struct list *A;
int n;
printf("Joseph问题求解算法的设计与实现\n \n");
printf("输入人的总个数:");
scanf("%d",&n); //n为人数

A=creatList(n);

josephRing(A,n);

} //为什么我把①②
删掉 运行的话就有bug了???求解

s=p; // ①

可换成
for(i=1;i<key-1;i++){
p=p->next;}
s=p;
p=p->next;
这是对s的初始化(指向第key项)
s->next=p->next; // ②

让第key出队
温馨提示:答案为网友推荐,仅供参考
相似回答