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

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

/*
这段代码的功能是使用单向循环链表来实现约瑟夫环问题
*/
#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;
}

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

原文链接:加载失败,请重新获取