约瑟夫(链表)(C语言)

用链表实现约瑟夫问题: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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值