算法的基本思想:
利用链表和数组,约瑟夫环问题中的数据时人所在的位置,而这个数据时存在”第一元素、最后元素“,并且
存在唯一的前驱和后继,符合线性表的特点,由于需要模拟约瑟夫环的出列问题,可以采用顺序表来实现
线性表,完成出列顺序的输出,核心算法主要分两步:
1、确定需要删除的位置
利用链表和数组,约瑟夫环问题中的数据时人所在的位置,而这个数据时存在”第一元素、最后元素“,并且
存在唯一的前驱和后继,符合线性表的特点,由于需要模拟约瑟夫环的出列问题,可以采用顺序表来实现
线性表,完成出列顺序的输出,核心算法主要分两步:
1、确定需要删除的位置
2、设置并删除该位置
#include<iostream>
#include <stdlib.h>
using namespace std;
typedef struct RNode{//链表结点,结构体设定链表结点内容
int data;//位置
struct RNode *next;
}LinkList;
LinkList *CreateR(int a[],int n)//创建约瑟夫环,L:链表头指针,为创建循环链表
{
LinkList *head,*r,*s;
int i;
head = (LinkList *)malloc(sizeof(LinkList));//开辟新结点
head->next = NULL;
head->data = a[0];
r = head;
for(i =1;i<n;i++)//做循环链表
{
s = (LinkList *)malloc(sizeof(LinkList));//开辟新结点、复制
s->data = a[i];
r->next = s;
r= s;
}
r->next = head;
return head;
}
void Joseph(LinkList *head,int m)//函数实现剔除过程
{
int i=0,j=0;
LinkList *L = head;
while(L->next!=L)
{
i = i+1;
j = (i+1)%m;
if (j==0)
{
cout<<L->next->data<<"\n";
L->next = L->next->next;
}
L = L->next;
i++;
}
cout<<L->data;
}
int main()
{
int m=0,n=0;
int a[1000];
int i;
cout<<"Please enter the value of m:";
cin>>m;
cout<<"Please enter the value of n:";
cin>>n;
if (n<=0||m<=0)
{
cout<<"Input Error\n";
system("Pause");
return 0;
}
for (i =0;i<n;i++)
{
a[i] = i+1;
}
LinkList *head = CreateR(a,n);
Joseph(head,m);
return 0;
}