约瑟夫问题(用链表解决)(个人方法,较为复杂,欢迎指正):
~~ ~~
题目内容:n只猴子(n<100)要选大王,选举方法如下:所有猴子按1,2,3,……, n编号围坐一圈,从第1号开始按照1,2,……, m报数,凡报到m号的退出圈外,如此循环报数,直到圈内剩下一只猴子时,这只猴子就是大王。编程一个程序实现上述过程,n和m由键盘输入。
输入:猴子的数量n及报数的最大数字
输出:退出圈外的猴子编号序列(每数字后紧跟1个空格)
样例 输入: 5 3
输出: 3 1 5 2 4
#include<stdio.h>
#include<malloc.h>
struct cell{
int num;
struct cell *next;
};
struct cell *found(int n){
struct cell *p,*head,*rear;
head=NULL;
rear=NULL;
int i;
for(i=1;i<=n;i++){
p=(struct cell *)malloc(sizeof(struct cell));
p->next=NULL;
p->num=i;
if(head==NULL){
head=p;
rear=p;
}
else{
rear->next=p;
rear=p;
}
}
return head;
};
void put(struct cell *head,int m){
int i;
struct cell *p,*p0;
p=head;
p0=head;
while(head->next!=NULL){
i=1;
for(;i<=m-1;i++){
if(p==p0){
p=p->next;
}
else{
if(p->next==NULL){
p=head;
p0=p0->next;
}
else if(p0->next==NULL){
p0=head;
p=p->next;
}
else if((p->next!=NULL)&&(p0->next!=NULL)) {
p=p->next;
p0=p0->next;
}
}
}
if(p==head){
head=head->next;
printf("%d ",p->num);
p=head;
}
else if(p->next==NULL){
p0->next=NULL;
printf("%d ",p->num);
p=head;
}
else if(p!=head&&p->next!=NULL){
p0->next=p->next;
printf("%d ",p->num);
p=p->next;
}
}
printf("%d",head->num);
free(head);
}
void main(){
struct cell *sss;
int n,m;
scanf("%d%d",&n,&m);
sss=found(n);
put(sss,m);
}