猴子选大王(c语言,循环链表)

2023-11-09 04:31

本文主要是介绍猴子选大王(c语言,循环链表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述:
n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从第q号猴子开始沿顺时针方向从q开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。
输入:输入两个整数n和m,1<=m<=n<=100。
输出:输出猴王的编号
样例输入
7 4 3
样例输出
4
样例说明:n=7 m=4 n=3
代码思想:一共四个函数,
第一个函数:创建链表,得到头结点
第二个函数:显示链表(方便测试)
第三个函数:p,q分别指向头结点和尾节点。第一次找到尾节点(这里可以自己优化),第二次循环得到第p个猴子的位置。第三次嵌套循环,外面循环是到最后一只猴子为止,内部循环是从p开始计数一直到第m只猴子为止并将结点删除。

代码示例

#include<stdio.h>
#include<stdlib.h>
int main()
{int m,n,p;scanf("%d %d %d",&n,&m,&p);printf("%d",Monkey(n,m,p));return 0;
}
/*猴子选大王*/
//链表结构
struct linkNode{int data;struct linkNode *next;
};
struct linkNode* LinkList(int n);
void pri_LinkList( struct linkNode *head,int n);//打印链表
int delete_Monkey(struct linkNode *head,int m,int n,int p);//删去选中的猴子
int Monkey(int n,int m,int p);
struct linkNode* LinkList(int n){struct linkNode *head,*p=NULL,*index=NULL;int i;//注意head也要head=  (struct linkNode*)malloc(sizeof(struct linkNode));index=head;head->data=1;head->next=head;for(i=2;i<n+1;i++){p=  (struct linkNode*)malloc(sizeof(struct linkNode));p->data=i;index->next=p;index=index->next;}index->next=head;
return head;
}
void pri_LinkList( struct linkNode *head,int n)
{struct linkNode *p;p=head;int i;printf("猴子的顺序为:");for(i=0;i<n;i++){printf("%d ",p->data);p=p->next;}printf("\n");
}
int delete_Monkey(struct linkNode *head,int m,int n,int p){int i,j,k;struct linkNode *h,*q;//一个确定m的位置,两个用于删除指针q=h=head;//遍历到头结点的前一个结点for(k=1;k<n;k++)h=h->next;//  printf("h的位置为%d:\n",h->data);//到达第p只猴子的位置for(k=1;k<p;k++){q=q->next;h=h->next;}//  printf("%d\n",q->data);//遍历只剩一只猴子for(i=n;i>2;i--){//找到第m只猴子并删除for(j=1;j<m;j++){h=h->next;q=q->next;}printf("除去的猴子为%d:\n",q->data);h->next=q->next;free(q);q=h->next;}return q->data;}
int Monkey(int n,int m,int p)
{int index;//创建循环链表struct linkNode *head;head=LinkList(n);pri_LinkList(head,n);index=delete_Monkey(head,m,n,p);//遇到m个时就删除return index;
}

输出结果:

在这里插入图片描述
最近在学c语言。百度了很多都是用数组写的,但是范围比较小,因此自己用链表实现。
多练习的点:创建链表不够熟练。


这篇关于猴子选大王(c语言,循环链表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/373979

相关文章

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换