简介:本程序使用双向循环链表实现了约瑟夫环 ,查的数m 大于 n 也是可以的。
下面的程序可以直接复制使用,也可以下载压缩包。代码都没有问题
0引言:
约瑟夫环的题目:来自网址:https://max.book118.com/html/2017/0114/83642198.shtm
本程序的基本思想和上图所介绍的基本一致,使用的是 双向循环链表 来实现的。
1:程序 :包含一个 .h 程序,两个.c 程序,可以复制直接使用。
也可以在下方的进行下载压缩包,环境:Visual Studio2019
程序1:huan.h ,结构体和函数的声明
extern int M;
int addition(int *add_number,int len);
typedef struct circle {
int number; // 计数器 count = m 则执行删除
struct circle* pre;
struct circle* p;
}Circle;
// 初始化 头插法
Circle* CreatHead();
// 插入数据 尾插法
void End_Insert(Circle* List );
// 在任意地方插入任何数据
void Any_Insert(Circle* List , int Any , int data);
// 打印
void printCircle(Circle* p);
// 在任意地方删除
Circle* Any_Del( Circle *List, int Any);
//终极Boss:约瑟夫环问题
void Del_OnePerson(Circle* List);
程序2:约瑟夫.cpp : 上面.h文件中所声明的函数的定义(实现)
#include
#include "huan.h"
using namespace std;
int M = 0;
int addition(int* add_number, int len)
{
int sum = 0;
while(len--)
{
sum += add_number[len];
}
return sum;
}
// 初始化 返回头指针
Circle* CreatHead()
{
int x,temp = 2;
Circle* Head , *node ,*L;
Head = new Circle;
Head->number = 1;
Head->p = Head->pre = Head;
L = Head;
cout << "输入你的约瑟夫环的总人数:";
cin >> x;
x--;
while (x--)
{
node = new Circle;
node->number = temp++;
//
L->p = node;
node->pre = L;
//
node->p = Head;
Head->pre = node;
//
L = node;
}
return Head;
}
// 插入数据 尾插法
void End_Insert(Circle *List )
{
int sum = 1;
Circle* temp = List;
while (temp->p != List){
temp = temp->p;
sum++;
}
Circle* node = new Circle;
node->number = sum+1;
// 前面
temp->p = node;
node->pre = temp;
// 后面
node->p = List;
List->pre = node;
}
// 在任意地方插入任何数据
void Any_Insert(Circle* List, int Any, int data)
{
Circle* temp = List;
while ( Any-- )
temp = temp->p;
Circle* node = new Circle;
node->number = data;
//
temp->pre->p = node;
node->pre = temp->pre;
//
node->p = temp;
temp->pre = node;
}
// 在任意地方删除
Circle* Any_Del(Circle* List, int Any)
{
Circle* temp = List;
if (Any == 1)
{
temp->pre->p = temp->p;
temp->p->pre = temp->pre;
Circle* L = List->p;
return L;
}
else {
while (--Any && temp->p != List)
{
temp = temp->p;
}
temp->pre->p = temp->p;
temp->p->pre = temp->pre;
return List;
}
}
// 打印
void printCircle( Circle* List)
{
Circle* temp = List;
while (temp->p != List)
{
cout << temp->number << endl;
temp = temp->p;
}
cout << temp->number << endl;
}
// 删除:出去一个人 并打印
void Del_OnePerson(Circle* List)
{
int count = M;
Circle* temp = List;
Circle* node = temp;
while ( node ->p != node )
{
while (--count )
{
temp = temp->p;
}
cout << "出圈的人:" << temp->number << endl;
node = Any_Del( temp , 1);
temp = node;
count = M;
}
cout << "出圈的人:" << temp->number << endl;
}
程序3:main函数,没什么东西,调用函数并实现
// BigWord_efu.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "huan.h"
#include
using namespace std;
void test() {
Circle* num;
num = CreatHead();
int Point = 0, data = 0;
// 在末尾插入
End_Insert(num);
printCircle(num);
// 在头上插入
cout << "任意地方,输入你要插入的地方和数据:";
cin >> Point >> data;
Any_Insert(num, Point, data);
printCircle(num);
cout << "任意地方,输入你删除的地方:";
cin >> Point;
printCircle(Any_Del(num, Point));
}
int main()
{
int a[4] = { 1,2,3,4 }, len = sizeof(a)/sizeof(int);
cout << "sum of a is:" << addition(a, len) << endl;
std::cout << "Hello World!\n";
Circle* num;
int Point = 0 , data = 0;
// 创建了
num = CreatHead();
printCircle(num);
cout << "输入约瑟夫环查到 多少结束 ?:";
cin >> M;
// 约瑟夫环开始循环
Del_OnePerson( num );
}
2:结果演示:只要输入2个量,1. 总人数 (我用的 12 );2. 查的数 ( 我用的 17)
PS : 上面的文件复制可用,或者可以直接下载 最上方 的压缩包