#include "2.2.h"
int main()
{
LNode * L;
int n, s, m;
printf("有n个人,从s开始,数到m出列,请依次输入n,s,m的值:\n");
cin >> n >> s >> m;
InitList(L, n);
DispList(L,n);
printf("\n");
Josephu(L, n, s, m);
return 0;
}
void DispList(LNode* L, int n) //输出循环链表
{
printf("循环链表:\n");
for (int i = 0; i < n; i++)
{
printf("%d ",L->data);
L = L->next;
}
}
bool InitList(LNode*& L, int n) //初始化循环单链表,data值为1,2,3,4,...
{
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL)
return false;
L->next = L;
L->data = 1;
LNode* p;
for (int i = n; i >1; i--)
{
p = (LNode*)malloc(sizeof(LNode));
if (p == NULL)
return false;
p->next = L->next;
L->next = p;
p->data = i;
}
}
bool Josephu(LNode*& L, int n,int s,int m) //n个人,从s开始,数到m出列
{
LNode* p = L;
LNode* q;
q = (LNode*)malloc(sizeof(LNode));
for (int i = 1; i <= n; i++)
{
p = (LNode*)malloc(sizeof(LNode));
if (p == NULL)
return false;
if (p->data == s)
break;
p = p->next; //找出s的位置,并用p记录
}
printf("依次出列的顺序为:\n");
for (int i = 0; i < n; i++) //n次出列
{
p = (LNode*)malloc(sizeof(LNode));
if (p == NULL)
return false;
int j = 1;
while (j < m)
{
p = p->next; //依次报数,当j=m时,结束循环,找到相应的p结点
j++;
}
printf("%d ", p->data);
//将当前数据域输出,并修改当前数据域为下一结点的数据域,并修改当前的数据域为下一结点的数据域,
//同时指向下一结点的下一结点,用来删除当前结点
q = p->next; //用q保存p的下一结点
p->data = p->next->data;//p的数据域改为下一结点的数据域
p->next = p->next->next;//指向下一结点
free( q);
}
}