单向循环链表解决约瑟夫环问题

单向循环链表解决约瑟夫环问题

/*
这段代码的功能是使用单向循环链表来实现约瑟夫环问题
*/
#include<stdio.h>
#include<stdlib.h>
typedef int ElemTppe;
typedef struct node{
 ElemTppe data;
 struct node*next;
}LNode,*LinkList;
//使用引用类型来创建不带表头的单向循环链表,给数据域中的元素值分别赋值为1.2.3
void Creat_cycle_LinkList(LinkList&Head,int length)
{
 int flag=0;
 LinkList Newp;
 //创建头节点
 Head=(LinkList)malloc(sizeof(LNode));
 Head->data=1;
 Head->next=Head;
 for(int i=length;i>1;i--){
  Newp=(LinkList)malloc(sizeof(LNode));
  Newp->data=i;
  Newp->next=Head->next;
  Head->next=Newp;
 }
}
//输出单向循环链表
void Print_LinkList(LinkList Head)
{
 int flag=1;//使用标志flag达到输出一次链表的目的
 for(LinkList p=Head;p->next!=Head->next||flag;p=p->next){
  flag=0;
  printf("%d\t",p->data);
 }
}
//实现约瑟夫环问题的主要代码
void main_cycle_LinkList(LinkList&Head,int n)
{
 int cnt=0,loop=0;//计数器
 LinkList p=Head,q;
 while(p!=p->next){
  cnt=cnt+1;
  //删除
  if(!(cnt%(n-1))){
   loop++;
   q=p->next;
   p->next=q->next;
   printf("第%d次删除的节点是%d\n",loop,q->data);
   free(q);
  }
  p=p->next;
 }
 printf("最后选出来的首领是 %d\n",p->data);
}
int main()
{
 LinkList Head;
 int length,n;
 printf("Please input your game children length :");
 scanf("%d",&length);
 //创建链表
 Creat_cycle_LinkList(Head,length);
 //输出链表
 Print_LinkList(Head);
 //约瑟夫环问题主代码
 printf("\nPlease input your game number n:");
 scanf("%d",&n);
 main_cycle_LinkList(Head,n);
 return 0;
}

运行结果
在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值