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