循环链表
。cpp
#include <iostream>
#include <string>
using namespace std;
typedef int ElemType;
typedef struct NODE {
ElemType data;
NODE* next;
}node, * pnode;
void creat_CL_R(pnode& CL, int n) {
CL = new node;//分配一个结点
CL->data = 1;
CL->next = CL;//后加的
pnode current = CL;
cout << "尾插法创建约瑟夫环" << endl;
for (int i = 2; i <= n; i++) {
//从第二个结点开始
pnode temp = new node;//一个新结点
temp->data = i;//新结点赋值
//尾插
current->next = temp;
current = current->next;
}
current->next = CL;//endnode的下一个始终为firstnode
}
void bianli(pnode CL) {
pnode p = CL;
while (p->next != CL) {
cout << p->data << ' ';
p = p->next;
}
cout << p->data;
cout << endl;
}
//删除
pnode delete_code(pnode& CL, int code) {
pnode current = CL;
pnode prior = nullptr;
int i = 1;
while (current->next != current) {
int j = 1;
while (j < code) {
prior = current;
current = current->next;
j++;
}//找到第3个结点
//删除该结点
prior->next = current->next;
pnode temp = current;
cout << "第" << i << "个自杀的人的编号为:";
cout << temp->data << ' ';
current = current->next;
delete temp;
i++;
cout << endl;
}
return current;
}
int main(){
pnode CL;//头指针
cout << "请输入约瑟夫环的总人数:";
int n;
cin >> n;
cout << "请输入每次被自杀的数字:";
int code;
cin >> code;
creat_CL_R(CL, n);
cout << "遍历并打印约瑟夫环:" << endl;
bianli(CL);
pnode s = delete_code(CL,code);
cout << "约瑟夫的编号为:" << s->data << endl;
return 0;
}