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

相关文章

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.