数据结构项目——使用循环链表实现约瑟夫环(循环和双向链表实现)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 数据结构项目——使用循环链表实现约瑟夫环(循环和双向链表实现)

已知有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;
}

结果为:


相关实践学习
小试牛刀,一键部署电商商城
SAE 仅需一键,极速部署一个微服务电商商城,体验 Serverless 带给您的全托管体验,一起来部署吧!
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
5月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
144 30
|
5月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
205 25
|
6月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
275 5
|
7月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
8月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
754 9
|
8月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
186 59
|
1月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
23 0
栈区的非法访问导致的死循环(x64)
232.用栈实现队列,225. 用队列实现栈
在232题中,通过两个栈(`stIn`和`stOut`)模拟队列的先入先出(FIFO)行为。`push`操作将元素压入`stIn`,`pop`和`peek`操作则通过将`stIn`的元素转移到`stOut`来实现队列的顺序访问。 225题则是利用单个队列(`que`)模拟栈的后入先出(LIFO)特性。通过多次调整队列头部元素的位置,确保弹出顺序符合栈的要求。`top`操作直接返回队列尾部元素,`empty`判断队列是否为空。 两题均仅使用基础数据结构操作,展示了栈与队列之间的转换逻辑。
|
6月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
301 77
|
5月前
|
算法 调度 C++
STL——栈和队列和优先队列
通过以上对栈、队列和优先队列的详细解释和示例,希望能帮助读者更好地理解和应用这些重要的数据结构。
81 11