#include "linklist.h"
/**
* 约瑟夫环:L为不带附带头结点的循环单链表的头指针
*/
void Jesuphus(LinkNode *&L, int n, int m) {
//请在下面编写代码
/******************Begin******************/
int count=0;//记录返回了多少数字
int i=2;//记录当前位置,根据题目可直接设置为2
LinkNode *pre=L,*p=pre->next;
while(count!=n) {
if(m==1){//当圈出元素为一时,实际直接等效为从1数到n
for(int i=1;i<=n;i++){
printf("%d ",i);
}
return;
}
if(i==m) { //如果次数积累到了圈出个数时
printf("%d ",p->data);
//输出圈出的位置
pre->next=p->next;
free(p);
//将节点圈出的节点删除
p=pre->next;
i=1; //记录归回一
count++; //圈出的元素个数加一
//指向下一个位置
} else { //如果不是要圈出的元素
pre=p;
p=p->next;
//指针往后移动
i++;//记录加一
}
}
/*******************End*******************/
}
//尾插法建立循环单链表
void CreateListR(LinkNode *&L, ElemType a[], int n) {
LinkNode *s, *r;
L = (LinkNode *)malloc(sizeof(LinkNode)); //创建头结点
L->data = a[0];
L->next = NULL;
r = L; //r始终指向终端结点,开始时指向头结点
for (int i = 1; i < n; i++) {
s = (LinkNode *)malloc(sizeof(LinkNode)); //创建新结点s
s->data = a[i];
r->next = s; //将结点s插入结点r之后
r = s;
}
r->next = L; //形成循环单链表
}
//输出循环单链表
void DispList(LinkNode *L) {
LinkNode *p = L;
while (p->next != L) {
printf("%d ", p->data);
p = p->next;
}
printf("%d\n", p->data); //打印最后一个结点的值
}
算法还不是很完善,还有很多纰漏,希望大家可以指正