首页 > 其他分享 >循环链表实现约瑟夫问题

循环链表实现约瑟夫问题

时间:2024-09-19 18:49:46浏览次数:12  
标签:LNode int 约瑟夫 链表 循环 del 内存 new next

问题描述

利用循环链表实现:读入 2 个整数 A 和 B,然后输出 2 个整数 C 和 D。

其中 A 表示人数,这些人的 id 分别为1,2,3,. . . A,他们按照id依次围成一圈。

从id为1的人开始报数,报到B的人退出圈,然后从下一个人开始重新报数,报到 B的人又退出圈,

如此反复,直到剩下2人为止。C和D为剩下的2人的id。

输入描述

在一行中输入大于0且不超过1000的整数A和B,要求A大于B。

输出描述

在一行中输出C和D,由空格隔开,要求D大于C。

样例输入
41 3                  
样例输出
16 31
      

注意 

分配内存可以采用new和malloc两种方法。

删除结点需要释放内存,以免内存泄漏。

内存泄漏是指向系统申请分配内存进行使用(new),可是使用结束却不归还(delete),导致申请到的内存无法再次访问(地址丢失),系统也不能再次将它分配给需要的程序。内存泄漏本身不会产生什么危害,真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。

new与malloc的部分区别
new和deletemalloc和free
属性C++中的关键字库函数
使用无需标明申请的内存大小,new会根据new的类型分配内存申请空间需要表明申请内存的大小
内存位置自由存储区
返回类型内存分配成功时,返回对象类型的指针,类型严格与对象匹配,无须进行类型转换。在C++程序中使用new会比malloc安全可靠内存分配成功返回void * ,需要通过强制类型转换将void*指针转换成需要的类型
分配失败情况new内存分配失败时,会抛出bac_alloc异常,不会返回NULL。分配失败时如果不捕捉异常,程序就会异常退出malloc分配内存失败时返回NULL,可以通过判断返回值得知是否分配成功

表格数据来源:【C++】C++ new和malloc到底哪里不一样 - 李春港 - 博客园 (cnblogs.com)

完整代码

#include<stdio.h>
typedef int DataType;
//定义单链表
typedef struct LNode
{
	DataType data;   //数据域
	struct LNode* next;   //指针域
}LNode;   
//创建循环单链表
static LNode* CreateList(int a)
{
	LNode* head = new LNode;  //创建首元结点  new分配内存
	head->data = 1;  //首元结点数据域存放1
	LNode* p = head;
	for (int i = 2; i <= a; i++)
	{
		LNode* newnode = new LNode;  //创建新结点
		newnode->data = i;  
		p->next=newnode;
		p = newnode;
	}
	p->next = head;  //首尾闭合
	return head;  //返回首元结点
}
static void Operate(int a, int b)
{
	LNode* head = CreateList(a);  //接收首元结点
	LNode* p = head;  //用于遍历循环单链表
	LNode* del = head;  //标记需要删除的结点
	while (a > 2)
	{
		for (int i = 1; i < b; i++)
		{
			p = del;
			del = del->next;
		}
		//删除结点
		p->next = del->next;  
		delete(del);  //释放已删除结点内存
		del = p->next;
		a--;
	}
	int c = del->data;   //赋值便于比较
	int d = del->next->data;
	if (c > d)   //比较cd大小
		printf("%d %d\n", d, c);
	else
		printf("%d %d\n", c, d);
}
int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	Operate(a, b);
	return 0;
}

标签:LNode,int,约瑟夫,链表,循环,del,内存,new,next
From: https://blog.csdn.net/2301_78872692/article/details/142186564

相关文章

  • 【洛谷 P5730】【深基5.例10】显示屏 题解(数组+循环)
    【深基5.例10】显示屏题目描述液晶屏上,每个阿拉伯数字都是可以显示成的点阵的(其中X表示亮点,.表示暗点)。现在给出数字位数(不超过)和一串数字,要求输出这些数字在显示屏上的效果。数字的显示方式如同样例输出,注意每个数字之间都有一列间隔。输入格式第一行输入一个正整数,表示数......
  • 关于链表逆序的(递归方法)
    LinkNode*turnoff(LinkNode*head){head->next->next=head;head->next=NULL;returnhead;//这里我们需要返回新的头(head);}以上我们创建了一个简单但函数还不是递归的。上述我们不可以从头开始,要从尾巴开始;这个时候需要递归一下到最后一个节点。即:LinkNode*turnoff......
  • 探秘Python中的链表:从零开始的奇妙之旅
    引言链表之所以重要,是因为它提供了一种灵活的方式来存储和操作数据集合。不同于数组,链表允许我们在无需重新分配内存的情况下动态地添加或删除元素。这使得它成为处理不确定大小数据集的理想选择。此外,在某些特定场景下(如实现缓存机制),链表可以比其他数据结构表现得更加出色......
  • 探秘Python中的链表:从零开始的奇妙之旅
    引言链表之所以重要,是因为它提供了一种灵活的方式来存储和操作数据集合。不同于数组,链表允许我们在无需重新分配内存的情况下动态地添加或删除元素。这使得它成为处理不确定大小数据集的理想选择。此外,在某些特定场景下(如实现缓存机制),链表可以比其他数据结构表现得更加出色。基础......
  • 【快慢指针】突破环形链表
      ......
  • 聊聊事件循环
    事件循环>js是单线程,js引擎在执行时的原则:获取任务、执行任务。反复重复此过程,直到没有可执行的任务为止。任务分为同步任务和异步任务。异步任务分为宏任务和微任务。-js处理异步主要有微任务(microTask)和宏任务(macroTask),而从开始执行一个宏任务–>执行完这个宏任务中......
  • Spring Boot解决循环依赖
    一、前言环依赖是指两个或者多个bean互相依赖对方,从而形成一个闭环。例如:BeanA依赖于BeanB,而BeanB又依赖于BeanA。可能会导致Spring在尝试创建这些bean实例时出现问题,因为他们互相等待对方被创建,最终导致应用程序无法启动。Spring是如何发现这种循环依赖的问题的呢?通过依赖图来......
  • Spring 的循环依赖
    在Spring中,循环依赖是指两个或多个Bean相互依赖,导致在创建过程中出现了依赖死锁的问题。为了解决循环依赖,Spring引入了三级缓存机制。了解为什么需要三级缓存机制,首先要明白循环依赖是如何发生的,以及两级缓存为什么不足够。一、循环依赖是什么?假设有两个BeanA和B:A......
  • JavaScript 中循环数据、改变数据的几种方法
    将数组对象中的属性值取出并组成新的数组letarr=[{name:"张三",age:"1",sex:"男",grade:11},{name:"李四",age:"2",sex:"男",grade:12},{name:"王五",age:"3",sex:"男",gra......
  • 代码随想录Day3 | LeetCode 203. 移除链表元素、LeetCode 707. 设计链表、LeetCode 20
    LeetCode203.移除链表元素链表基础概念题,也可以用递归做,不过我们把递归的思想放在更能体现它的LeetCode206.反转链表#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,val=0,next=None):#self.val=val#self.next......