用链表实现约瑟夫问题:13个人围成一圈,从第1个人开始顺序报号1,2,3。凡报到3者退出圈子。找出最后留在圈子中的人原来的序号。
【输入要求】
无
【输出要求】
2行:
第1行,出圈的人的序号;
第2行:The last one is+最后留在圈子中的人的原来序号
提示:格式控制为%4d
【输入样例】
无
【输出样例】
3 6 9 12 2 7 11 4 10 5 1 8
The last one is 13
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(ListNode)
typedef struct su
{
int data;
struct su *next;
}ListNode;
ListNode *Creat_ListNode()
{
int i;
ListNode *h,*p1,*p2;
p2=h=malloc(LEN);
h->next=NULL;
for(i=1;i<=13;i++)
{
p1=malloc(LEN);
p1->data=i;
p1->next=NULL;
p2->next=p1;
p2=p1;
}
p2->next=h->next;
return h;
}
void Delete_ListNode(ListNode *p)//删除节点
{
ListNode *s;
s=p->next;
p->next=s->next;
printf("%4d",s->data);
free(s);
}
void Josephus(ListNode *h)
{
int k=0,n=13;
ListNode *p;
p=h;
while(n!=1)
{
p=p->next;
k++;
if(k==2)//删除当前节点的下一个节点
{
k=0;
Delete_ListNode(p);
n--;
}
}
printf("\nThe last one is %d\n",p->data);
}
int main()
{
ListNode *head;
head=Creat_ListNode();
Josephus(head);
return 0;
}