约瑟夫环 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JDK8新特性-Stream流[通俗易懂]

    JDK8新特性-Stream流[通俗易懂]JDK8新特性-Stream流,本教程附有非常多的例子,看完肯定能懂Stream流!

    2022年9月26日
    7
  • java pfx_如何在Java中读取.pfx文件的内容?

    java pfx_如何在Java中读取.pfx文件的内容?我有file.pfx文件,还有一个私钥.如何在Java中读取file.pfx中的证书?我用过这段代码:importjava.security.*;importjava.security.cert.Certificate;importjava.security.cert.X509Certificate;importjava.security.cert.CertificateException…

    2022年6月7日
    77
  • golang map转json

    golang map转json““//maptojsonpackagemainimport(“encoding/json”“fmt”)funcmain(){s:=[]map[string]interface{}{}m1:=map[string]interface{}{“name”:”John”,”age”:10}m2:=map[string]interface{}{“

    2022年6月20日
    34
  • Windows下使用cmd进入MySQL

    Windows下使用cmd进入MySQL安装mysql后使用cmd命令行进入mysql

    2022年6月6日
    55
  • 文本分类算法之–KNN算法的简介「建议收藏」

    文本分类算法之–KNN算法的简介「建议收藏」1、KNN算法的简介kNN算法就是找到k个最相似的样本,这些样本所在的类,就是当前文档的所属的类。如下图:绿色圆圈表示你想分类的文本,其他是已知类别的样本。图中其他形状和绿色圆圈的距离代表了相似度。如果k=3,就是取3个最相似的文本,那么1个蓝色框,2红色三角被选中,因为红色三角多,则绿色圆圈所属的类就是红色三角所在的类。如果k=5,3个蓝色框和2个红色三角选中,那么就属于蓝色框所

    2022年5月11日
    49
  • docker 修改容器时间_docker开放容器端口

    docker 修改容器时间_docker开放容器端口前言用docker搭建的Jenkins环境时间显示和我们本地时间相差8个小时,需修改容器内部的系统时间查看时间查看系统时间date-R进入docker容器内部,查看容器时间dockere

    2022年7月31日
    8

发表回复

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

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