C++学习笔记(4):约瑟夫环的实现:双向循环链表方法

简介:本程序使用双向循环链表实现了约瑟夫环 ,查的数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 <iostream>
#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 <iostream>

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 : 上面的文件复制可用,或者可以直接下载 最上方 的压缩包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值