约瑟夫环 OJ

约瑟夫环 OJ循环链表的应用,并且应为不带头节点的循环链表,首先创建一个循环链表,在函数JOHEPHUS中进行操作,主要就是用for找到要删除的元素(注意p==1单独考虑,for中p至少为2),删除元素并输出直至链表为空。for(j=1;j<=p-1;j++)把寻找报数的位置和寻找要删除的节点的前驱结合在一个循环中,减少时间复杂度,因为第一次写我是在主函数中用r指向找到的要删除的节点,然后传入de…

大家好,又见面了,我是你们的朋友全栈君。

约瑟夫环 OJ

循环链表的应用,并且应为不带头节点的循环链表,首先创建一个循环链表,在函数JOHEPHUS中进行操作,主要就是用for找到要删除的元素(注意p==1单独考虑,for中p至少为2),删除元素并输出直至链表为空。

for(j=1;j<=p-1;j++)把寻找报数的位置和寻找要删除的节点的前驱结合在一个循环中,减少时间复杂度,因为第一次写我是在主函数中用r指向找到的要删除的节点,然后传入delete(&L,r)中删除,而在delete中,需要从头找r的前驱,再修改指针,会发现这其中两个寻找的过程是重复进行的,所以基于函数功能的思想将它结合在一起,放入JOHEPHUS中,

第一次写加入了initList,但由于没有头节点,只是将头指针赋为空指针,并没有意义,而调用函数会使时间增长,可以将这一步放入到creat函数中,判空函数也完全可以有while(cur.next!=cur)来表示,当然这个函数判断是否只剩一个元素了,也完全不用重新写delete,

#include<stdio.h>
#include<stdlib.h>
#define error -1
typedef struct LNode{

   int num;
   struct LNode *next;
}LNode,* Link;

void creat_list(Link *L,int n){

   *L=NULL;
   int i;
   LNode * s=(LNode * )malloc(sizeof(LNode));
   (*s).num=1;
   (*s).next=s;
   (*L)=s;   
  if(n>=2)
  {

   for(i=2;i<=n;i++)
    {

       LNode * w=(LNode * )malloc(sizeof(LNode));
       (*w).num=i;
       (*s).next=w;
       (*w).next=(*L);
       s=w;
    }
  }
}

void JOHEPHUS(Link *L,int n,int p){

    int j;
    LNode * cur=*L;
    LNode *r;
   if(p==1){

       while(n-1){

       printf(“%d “,(*cur).num);
       cur=(*cur).next;
       n–;
       }
     printf(“%d”,(*cur).num);
     }
  else//p>=2
{

  while((*cur).next!=cur)
  {

     for(j=1;j<=p-1;j++)
    {

      r=cur;
      cur=(*cur).next;
     }
     printf(“%d “,(*cur).num);
    (*r).next=(*cur).next;
    free(cur);
    cur=(*r).next;
  }//while
  printf(“%d”,(*cur).num);
}//else
}//JOHEPHUS

int main()
{

 int p,n;
 Link  L;
 LNode * cur;
if(scanf(“%d %d”,&n,&p)!=EOF)
{

   if(p>=1&&p<=5000 &&n>=1&&n<=3000)
    {

     creat_list(&L,n);
     JOHEPHUS(&L,n,p);
     }//if
}//if
return 0;
}
 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139594.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月29日 下午3:16
下一篇 2022年5月29日 下午3:16


相关推荐

  • python安装教程[通俗易懂]

    python安装教程[通俗易懂]python安装教程本章节我们将向大家介绍如何在本地搭建Python开发环境。Python可应用于多平台包括Linux和MacOSX。你可以通过终端窗口输入"python&

    2022年7月5日
    21
  • 狂神说Linux_狂神说博客园

    狂神说Linux_狂神说博客园Linux在服务器端,很多大型项目都是部署在Linux服务器上利用VM + Centos7搭建本地Linux系统你可以使用 man [命令]来查看各个命令的使用文档,如 :man cp。概念云服务器就是一个远程电脑Linux中一切皆文件根目录/,所有的文件都挂载在这个节点下/bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令。/boot: 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev : dev是Device(设备

    2022年8月9日
    12
  • 工业大数据的价值体现_如何分析转型带来的价值

    工业大数据的价值体现_如何分析转型带来的价值工业视角的转变        如果说前三次工业革命分别从机械化、规模化、标准化、和自动化等方向大幅度地提高了生产力,那么第四次工业革命与前面三次最大的区别在于:不再以制造端的生产力需求为出发点,而是将客户端价值作为整个产业链的核心,改变以往的工业价值链从生产端向消费端、上游向下游推动的模式,从客户端的价值需求出发提供客制化的产品和服务,并以此作为整个产业链的共同目标使整个产业链的各个环节实现协同优…

    2026年4月15日
    7
  • oracle数据库去重查询_oracle查询去重数据

    oracle数据库去重查询_oracle查询去重数据oracle数据库中有如下一张表,包含id,loginid,name,researchtime等字段,其中name字段中的数据有重复,查询数据时要重复数据只取一条,利用row_number()over(partitionby列orderby列desc)方法实现1:selecta.,row_number()over(partitionbya.nameorderbyres…

    2022年10月1日
    6
  • 大数据与云计算,物联网三者的区别和关联是_云计算侧重于数据分析

    大数据与云计算,物联网三者的区别和关联是_云计算侧重于数据分析大数据与云计算  为解决互联网应用对大规模计算能力、数据存储能力的迫切需求,云计算的概念被提出。云计算是一种分布式计算平台,通过虚拟技术将海量的硬件资源和虚拟资源虚拟成虚拟资源池,并根据需求任务的大小,向虚拟资源池获取相应的计算和存储资源。  在大数据处理的需求下,出现了许多优秀的云计算平台,例如Apache开源的Hadoop、Google的MapReduce、微软的Dryad等。  在处…

    2022年10月6日
    6
  • 文心一言如何接入DeepSeek?宝藏教程来了,手把手教你搞定!

    文心一言如何接入DeepSeek?宝藏教程来了,手把手教你搞定!

    2026年3月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号