C语言单向循环链表实现约瑟夫环
题目描述
有n个人围成一圈,顺序从1开始排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。要求用循环链表实现。
输入格式
只有一个正整数n,保证n不超过1000。
输出格式
输出最后留下的人的原始编号。
请注意行尾输出换行。
样例输入
复制
10
样例输出
复制
4
#include<stdio.h>
#include<stdlib.h>
typedef struct LN{
int flag;//flag为每个人的记号
struct LN *next;
}*ln,LN; //这里用循环链表,head头结点内也有元素
ln delete_(ln);//报到3的那个结点删除
int main(){
ln head=(ln)malloc(sizeof(LN));
head->next=NULL;
int n;
scanf("%d",&n);
head->flag=n;
ln p=head;
for(int i=1;i<n;i++)
{
ln q=(ln)malloc(sizeof(LN));
q->next=NULL;
p->next=q;
p=q;
q->flag=i;
}
p->next=head;
int length=n;
ln l=head->next;
int countdown;
while(length!=1){
countdown=1;
while(1){
l=l->next;
countdown++;
if(countdown%2==0){//注意判定条件的是报道3的那个结点的前一个结点,因为没有采用双向循环链表
l=delete_(l);
length--;
break;
}
}
}
printf("%d",l->flag);
}
ln delete_(ln head){
ln p=head;
ln q=head->next;
p->next=q->next;
p=q->next;
free(q);
return p;
}