循环单链表解决约瑟夫环_用链表解决约瑟夫环问题

循环单链表解决约瑟夫环_用链表解决约瑟夫环问题已知有5个人围坐在一张圆桌的周围,从编号为3的人开始顺时针数数,数到2的那个人出列淘汰,然后从出列的下个一人继续数,依次循环,直到只剩下最后一个人。(使用循环链表实现约瑟夫环)代码如下:#include “pch.h”#include<string>#include<fstream>#include<Windows.h>#include <i…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

已知有5个人围坐在一张圆桌的周围,从编号为3的人开始顺时针数数,数到2的那个人出列淘汰,然后从出列的下个一人继续数,依次循环,直到只剩下最后一个人。(使用循环链表实现约瑟夫环)

在这里插入图片描述
代码如下:

#include "pch.h"
#include<string>
#include<fstream>
#include<Windows.h>
#include <iostream>

using namespace std;

//循环链表基本实现

//typedef struct LNode
//{ 
   
// int date;
// LNode* next;
//}*LinkList;
//
新建单链表
//void InitList(LinkList &L)
//{ 
   
// L = new LNode;
// L->next = NULL;
//}
//
给链表增加节点
//void GetLinkList(LinkList &L, int n)
//{ 
   
// LNode *p;
// LNode *r;
// r = L;
// char filename[20] = { 0 };
//
// cout << "请输入单向有序链表"
// <<"数据文件名字(文件名+“.txt”),例如List.txt"
// << ".txt" << endl;
//
// gets_s(filename);
// fstream file;
// file.open(filename);
// if (!file)
// { 
   
// cout << "文件数据打开失败!" << endl;
// Sleep(5000);
// exit(0);
// }
// 
// while (!file.eof())
// { 
   
// p = new LNode;
// file >> p->date;
// p->next = NULL; //前插插
// r->next = p;
// r = p;
// n++;
//
// }
//
// file.close();
//}
//
//void OutPutList(LinkList L)
//{ 
   
// LNode *p;
// p = L->next;
// while (p)
// { 
   
// cout << p->date << " ";
// p = p->next;
// }
//}
//
链表合并函数
//void MergeLinkList(LinkList &la, LinkList &lb, LinkList &lc)
//{ 
   
// LinkList pa, pb, pc;
// pa = la->next;
// pb = lb->next;
// 
// lc = la;
// pc = lc;
// 
// //两段链表都有节点
// while (pa&&pb)
// { 
   
// if (pa->date<=pb->date)
// { 
   
// pc->next = pa;
// pc = pa;
// pa = pa->next;
// }
// else
// { 
   
// pc->next = pb;
// pc = pb; 
// pb=pb->next;
// }
//
// pc->next = pa ? pa : pb;
//
// }
//}
//
//int main()
//{ 
   
// LinkList la,lb, lc;
//
// InitList(la);
// GetLinkList(la, 1);
// OutPutList(la);
// cout << endl;
//
// InitList(lb);
// GetLinkList(lb, 1);
// OutPutList(lb);
// cout << endl;
//
// InitList(lc);
// MergeLinkList(la, lb, lc);
// OutPutList(lc);
//
// return 0;
//}
//


//约瑟夫环实现
typedef struct Person
{ 
   
	int numberdate;
	Person *next;
}*LinkPerson;

LinkPerson initList(int n)
{ 
   
	LinkPerson L = new Person;
	L->numberdate = 1;
	L->next = NULL;
	Person*p = L;

	for (int i = 2; i <= n; i++)
	{ 
   
		Person*body = new Person;
		body->numberdate = i;
		body->next = NULL;
		p->next = body;
		p = p->next;
	}
	p->next = L;		//首尾相接
	return L;
}

void KillPerson(LinkPerson L, int a, int b)
{ 
   	//a是编号,b是数几淘汰
	LinkPerson tail = L;
	while (tail->next != L)
	{ 
   
		tail = tail->next;
	}

	LinkPerson p = L;
	//把链表的开头给开始的那个人
	while (p->numberdate != a)
	{ 
   
		tail = p;
		p = p->next;
	}
	//当p->next=p时说明只剩下一个人,游戏结束
	while (p->next != p)
	{ 
   
		//重新写入剩下的游戏玩家
		for (int i = 1; i < b; i++)
		{ 
   
			tail = p;
			p = p->next;
		}
		//从链表上将p结点就删除了
		tail->next = p->next;
		cout << "被杀的人是" << p->numberdate << "号" << endl;
		delete p;
		p = tail->next;

	}
	cout << "最后胜出的是:" << p->numberdate << endl;
	delete p;
}

int main()
{ 
   
	int n, a, b;
	cout << "请输入玩家数:";
	cin >> n;
	cout << "请输入从几号玩家开始:";
	cin >> a;
	cout << "请输入每次步数:";
	cin >> b;

	Person *L= initList(n);
	KillPerson(L, a, b);
	return 0;
}


结果为:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170977.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ubuntu 18.04安装edge浏览器

    ubuntu 18.04安装edge浏览器1.先下载适用于Ubuntu的deb格式安装包2.使用sudodpkg-imicrosoft-edge-dev_****_amd64.deb,安装edge3.安装后会发现打不开,运行以下代码sudoaptinstallmicrosoft-edge-dev4.运行sudoaptinstallmicrosoft-edge-dev后,会出现错误:Unmetdependencies.Try’apt–fix-brokeninstall’withn…

    2022年7月21日
    14
  • android studio SDK 安装不成功

    android studio SDK 安装不成功第一次安装androidstudio出现的问题问题1:无法访问androidstudio官网解决:1:https://developer.android.google.cn/studio/install?hl=zh-cner.android.google.cn/studio/install?hl=zh-cn一定是要带google的地址才行,这是google给中国用的;2:访问到了还不一定行,有可能点击下载时页面还是报错了,这时候需要检查自己网络的原因,我就是因为连接了公司的网络导致下载不了

    2022年7月21日
    35
  • FPGA之ODDR「建议收藏」

    通过oddr把两路单端的数据合并到一路上输出上下沿同时输出数据上沿输出a路下沿输出b路 如果两路输入信号一路恒定为1,一路恒定为0,那么输出的信号实际上就是输入的时钟信号ODDRPrimitive:Adedicatedoutputregistertotransmitdualdatarate(DDR)signalsfromV

    2022年4月7日
    147
  • FM Bandwidth IQ Rate Sample Rate

    FM Bandwidth IQ Rate Sample Rate在labview中,编写FM的程序经常会涉及到以下几个名词,他们的关系是怎样的呢?BandwidthdeviationfrequencymodulatingfrequencyIQRateSampleRate首先关于带宽Bandwidth他是由以下公式决定的。请参考Carson’sRule。FMBandwidth=2(Δf + fm)

    2022年10月17日
    0
  • tracert工作原理简述_tracert三个时间

    tracert工作原理简述_tracert三个时间linux上为tracerouteTracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由。首先,tracert送出一个TTL是1的IP 数据包到目的地,当路径上的第一个路由器收到这个数据包时,它将TTL减1。此时,TTL变为0,所以该路由器会将此数据包丢掉,并送回一个「ICMPtimeexceeded」消息(包

    2022年9月25日
    0
  • pycharm for mac安装

    pycharm for mac安装http www xue51 com mac 5604 html 转载于 https www cnblogs com LeesinDong p 10835539 html

    2025年6月7日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号