iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言数据结构中约瑟夫环问题如何解决
  • 383
分享到

C语言数据结构中约瑟夫环问题如何解决

2023-07-04 23:07:40 383人浏览 安东尼
摘要

本文小编为大家详细介绍“C语言数据结构中约瑟夫环问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言数据结构中约瑟夫环问题如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。问题描述约瑟夫环问题的

本文小编为大家详细介绍“C语言数据结构中约瑟夫环问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言数据结构中约瑟夫环问题如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

问题描述

约瑟夫环问题的一种描述是:将编号为1,2,...n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报道m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。设计一个程序求出出列顺序。

基本要求

利用单向循环链表存储结构模拟此过程,按照出列的顺序印出个人的编号。

测试数据

m的初值为20;n = 7,7个人的密码依次为:3,1,7,2,4,8,4,首先m值为6(正确的出列顺序应为6,1,4,7,2,3,5)。

实现思路1

用的是数组索引。结合一点点的算法知识。

#include<stdlib.h>#include<stdio.h>//#用数组索引的模式 int main(){int m;printf("请输入m的值:");scanf("%d",&m);int n;printf("请输入n的值:"); scanf("%d",&n);int a[100];for(int i = 0;i<n;i++){scanf("%d",&a[i]);}int cnt = 0;int cnt1 = 0;int i = 0;while(1){if (a[i]!=0){cnt++;if(cnt==m){m = a[i];a[i] = 0;cnt = 0;printf("%d ",i+1);cnt1++;}if(cnt1==n){break;}}i = (++i)%n;} }

实现思路2

利用单项循环链表的方式,上干货

运用的函数:

  • 创建链表

  • 取得链表的下标

  • 删除链表指定下标的元素

  • 得到第i个元素值

数据结构的定义:

  • 结构体 Lnode,成员包括:原始下标,元素值

  • 主函数的思路:

其中上面的函数都是参考《数据结构(C语言版)》上面。只是将创建链表的函数改成创建单向循环链表的函数。写代码主要时间消耗在主函数上。

主函数的思路:

创建一个指定大小(n)的循环链表,每一次循环得到第m个元素,记录此元素的下标,然后移动头结点到删除元素前面的结点,再把此时的头节点后面1一个结点给删除。依次遍历到n个。

#include<stdlib.h>#include<stdio.h>//用单项循环列表的方式 //数据类型的定义 typedef struct LNode{int data;//定义密码值 int index; //定义数据的下标 struct LNode *next;}LNode,*LinkList;int GetElem_L(LinkList L,int i ,int &e){LNode* p;//注意这里的*号 p = L->next;int j = 1;while(p&&j<i){p = p->next;++j;} if(!p || j>i){return -1;}e = p->data;//printf("%d ",e);return e;}//GetElem_Lint GetIndex_L(LinkList L,int i ,int &e){LNode* p;//注意这里的*号 p = L->next;int j = 1;while(p&&j<i){p = p->next;++j;} if(!p || j>i){return -1;}e = p->index;//printf("%d ",e);return e;}//GetIndex_Lint ListDelete_L(LinkList &L,int i,int &e){LNode* p;//注意这里的*号p  = L;int j = 0;while(p->next&&j<i-1){p = p->next;++j;}if(!(p->next)||j>i-1){return -1;}LNode* q;q = p->next;p->next = q->next;e = q->data;free(q);return e; }//ListDelete_Lvoid CreateList_L(LinkList &L,int n){L = (LinkList)malloc(sizeof(LNode));L->next = NULL;LNode* tmp = (LinkList)malloc(sizeof(LNode));tmp = L;for(int i = 0;i<n-1;++i){LNode* p = (LinkList)malloc(sizeof(LNode));scanf("%d",&p->data);p->index = i+1;p->next = tmp->next;tmp->next = p;tmp = tmp->next;}LNode* p = (LinkList)malloc(sizeof(LNode));          //注意这里的*号scanf("%d",&p->data);p->index = n;p->next = L->next;tmp->next = p;}//创建循环链表 int main(){int m;int cnt;printf("请输入m的值:");scanf("%d",&m);int n;printf("请输入n的值: "); scanf("%d",&n);LNode* L;//注意这里的*号CreateList_L(L,n);int e = 0 ;int index = 0;for(int i = 0;i<n;i++){GetElem_L(L,i+1,e);}for(int i = 0;i<n;i++){int l = 0;l = GetIndex_L(L,m,index);printf("%d ",l);int tmp = GetElem_L(L,m,e);for(int i = 0;i<m-1;i++){L = L->next;}ListDelete_L(L,1,e);m =  tmp;}}

结果

C语言数据结构中约瑟夫环问题如何解决

读到这里,这篇“C语言数据结构中约瑟夫环问题如何解决”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网其他教程频道。

--结束END--

本文标题: C语言数据结构中约瑟夫环问题如何解决

本文链接: https://www.lsjlt.com/news/348314.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言数据结构中约瑟夫环问题如何解决
    本文小编为大家详细介绍“C语言数据结构中约瑟夫环问题如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言数据结构中约瑟夫环问题如何解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。问题描述约瑟夫环问题的...
    99+
    2023-07-04
  • C语言数据结构中约瑟夫环问题探究
    目录问题描述基本要求测试数据实现思路1实现思路2结果数据结构开讲啦!!! 本专栏包括: 抽象数据类型线性表及其应用栈和队列及其应用串及其应用数组和广义表树、图及其应用存储管理、查找和...
    99+
    2023-01-12
    C语言约瑟夫环 C语言约瑟夫环问题
  • 如何实现C语言版约瑟夫问题算法
    这篇文章主要为大家展示了“如何实现C语言版约瑟夫问题算法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现C语言版约瑟夫问题算法”这篇文章吧。1、问题描述:    &nb...
    99+
    2023-06-22
  • C语言如何实现一个约瑟夫环
    本篇内容主要讲解“C语言如何实现一个约瑟夫环”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何实现一个约瑟夫环”吧!C语言约瑟夫环的实现一、典故:   &nb...
    99+
    2023-06-17
  • Java数据结构与算法之双向链表、环形链表及约瑟夫问题深入理解
    目录一、双向链表二、环形链表及其应用:约瑟夫问题环形链表图示构建一个单向的环形链表思路遍历环形链表约瑟夫问题一、双向链表 使用带head头的双向链表实现 - 水浒英雄排行榜管理单向链...
    99+
    2024-04-02
  • 如何解决C语言中for循环问题
    本篇内容主要讲解“如何解决C语言中for循环问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决C语言中for循环问题”吧!今天分享一下C语言中的for循环中我们常常忽略的小问题。举一个小...
    99+
    2023-06-07
  • 详解如何在Go语言中循环数据结构
    目录如何在Go中循环字符串如何在Go中循环map结构如何在Go中循环Struct数组是存储类似类型数据的强大数据结构。您可以通过索引识别和访问其中的元素。 在Golang中,您可以通...
    99+
    2024-04-02
  • python中的循环结构问题如何解决
    这篇文章主要讲解了“python中的循环结构问题如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中的循环结构问题如何解决”吧!python循环结构Python中循环结构有两...
    99+
    2023-07-05
  • c语言怎么解决素数环问题
    素数环问题是指在一个圆环上排列一组互不相同的素数,使得任意两个相邻的素数之和也是素数。解决素数环问题的一种方法是使用回溯法。以下是一...
    99+
    2023-08-08
    c语言
  • C语言实例真题讲解数据结构中单向环形链表
    目录1、例题引入2、何为带环链表3、题解思路4、拓展问题目录 1、例题引入 链接直达: 环形链表 题目: 2、何为带环链表  正常的单链表每个节点顺次链接,最后一个节点指...
    99+
    2024-04-02
  • C++数据结构背包问题怎么解决
    在C++中,可以使用数组或者链表来实现背包问题的解决。 首先,定义一个结构体或者类来表示物品,包括物品的重量和价值等信息。 然后,定...
    99+
    2023-10-24
    C++
  • C++中常见的数据结构问题及解决方法
    C++中常见的数据结构问题及解决方法数据结构是计算机科学中最基础、最核心的概念之一。在C++编程中,我们常常需要使用各种数据结构来解决实际问题。然而,有时候我们可能会遇到一些问题,如如何初始化一个栈或者链表,如何在二叉树中进行查找等。本文将...
    99+
    2023-10-22
    解决方法 - 链表 (Linked List) 数据结构问题 - 数组 (Array) - 栈和队列 (Stack an
  • C++中数据结构问题及解决方案的讨论
    C++中数据结构问题及解决方案的讨论导语:在C++编程中,数据结构是一个重要的概念,它能够帮助我们以一种有组织的方式存储和管理数据。然而,当面临复杂的问题时,我们可能会遇到一些困难,如何合理地选择和使用数据结构成为一个关键的问题。本文将介绍...
    99+
    2023-10-22
    链表 例如数组 队列等。
  • C++中数据结构问题和解决方案的讨论
    C++中数据结构问题和解决方案的讨论数据结构是计算机科学中非常重要的概念之一,它是存储和组织数据的方式和方法。在C++编程中,我们经常会遇到各种各样的数据结构问题,比如如何高效地存储和操作数据,如何实现各种常见数据结构等等。本文将探讨C++...
    99+
    2023-10-22
    数据结构: 数据 解决方案: 解决 讨论: 讨论
  • 如何理解C语言数据结构中线性表的链式存储结构
    如何理解C语言数据结构中线性表的链式存储结构,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.什么是线性表的链式存储结构 —链表存储结点:包括元素本身的信息,还有元素之间的关系...
    99+
    2023-06-21
  • Go语言中如何处理并发数据结构操作的问题?
    Go语言中如何处理并发数据结构操作的问题?在并发编程中,经常会遇到需要对共享数据结构进行操作的情况,如何安全高效地管理这些并发操作是一个重要的问题。Go语言提供了一些机制来处理并发数据结构操作,包括锁、通道和原子操作等。本文将通过具体的代码...
    99+
    2023-10-22
    数据结构 操作 并发
  • C语言结构体中内存对齐的问题理解
    目录前言思考结构体在内存中开辟空间时内存对齐的规则为什么存在内存对齐1.平台的原因2.性能的原因前言 学C的同学应该知道~ 想精通C语言就不得不面对—指针与内存 续上次指...
    99+
    2024-04-02
  • 如何解决R语言循环慢的问题
    小编给大家分享一下如何解决R语言循环慢的问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计...
    99+
    2023-06-14
  • 如何用Go语言解决LeetCode中的大数据问题?
    随着算法竞赛的兴起,越来越多的人开始关注算法题目,其中LeetCode作为一个知名的算法题库备受关注。在LeetCode中,有很多题目都存在大数据的问题,这时我们就需要使用一些高效的语言来解决这些问题。Go语言作为一门高效的编程语言,非常适...
    99+
    2023-09-26
    大数据 日志 leetcode
  • C语言从猜数字游戏中理解数据结构
    目录1 猜数字游戏-问题描述2 问题分析3 问题解决3.1 猜一次3.2 直到猜到为止3.3 限定猜10次3.4 处理特殊情况3.5 猜下一个数1 猜数字游戏-问题描述 这个游戏一点...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作