猴子选大王(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

相关文章

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

JAVA中while循环的使用与注意事项

《JAVA中while循环的使用与注意事项》:本文主要介绍while循环在编程中的应用,包括其基本结构、语句示例、适用场景以及注意事项,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录while循环1. 什么是while循环2. while循环的语句3.while循环的适用场景以及优势4. 注意

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

poj3750约瑟夫环,循环队列

Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。 Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用