1056: 约瑟夫问题(指针)
Description
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
Input
初始人数n
Output
最后一人的初始编号
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode{
int data;
struct ListNode *next;
}ListNode,*LinkList;
//创建链表
LinkList Creat_List(int num){
LinkList p,p_temp,head;
head=(LinkList)malloc(sizeof(struct ListNode));
head->next=head;
p=head;
for(int i=1;i<=num;i++){
p_temp=(LinkList)malloc(sizeof(struct ListNode));
p_temp->data=i;
p_temp->next=p->next;
p->next=p_temp;
p= p_temp;
}
p->next=head->next;
p=p->next;
free(head);
return p;
}
LinkList Josephus(LinkList p){
LinkList p_temp;
while(p!=NULL&&p->next!=p){
if(p->next!=p){
p_temp=p->next->next;
p->next->next=p_temp->next;
p=p_temp->next;
}
}
printf("%d\n",p->data);
return p;
}
int main(){
int n;
scanf("%d",&n);
LinkList p=Creat_List(n);
p=Josephus(p);
return 0;
}