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


相关推荐

  • mysql查看表结构的命令_数据库查看表命令

    mysql查看表结构的命令_数据库查看表命令一、简单描述表结构,字段类型desctabl_name;显示表结构,字段类型,主键,是否为空等属性,但不显示外键。二、查询表中列的注释信息select*frominformation_schema.columnswheretable_schema=’db’  #表所在数据库andtable_name=’tablename’; #你要

    2022年9月9日
  • minipcie串口卡_minipcie接口定义图解

    minipcie串口卡_minipcie接口定义图解简介LCminiPCIe系列miniPCIe接口CAN卡,具有1~2路CAN通道和一路PCIExpressmini接口,插到工控机或单板电脑的PCIExpressmini卡槽上,快速扩展出1~2路CAN通道。CAN接口电气隔离高达2500VDC,具有优秀的EMC性能,可靠性测试项目:ESD接触放电8KV、浪涌±1KV、脉冲群±2KV,工业级,通过CE-EMC和FCC认证。配套测试软件L…

    2022年9月8日
  • mysql是mpp数据库_mysql迁移mpp数据库Greenplum[通俗易懂]

    mysql是mpp数据库_mysql迁移mpp数据库Greenplum[通俗易懂]1.场景描述因兄弟项目中mysql有点扛不住了,要做sql优化,但是业务有点小复杂,优化起来有点麻烦(sql嵌套有点多),便想着用Mpp数据库Greenplum测试下,看性能和复杂度怎么样,趟趟水。2.解决方案初步的想法是:因为mysql和postgresql(Greenplum建立在postgresql之上,i’m软件老王)都是使用的标准sql,直接把mysql的建表语句在Greenplum…

    2022年10月31日
  • Oracle12c错误01017,ORACLE12.2中用户无法登陆报ORA-01017的解决办法

    Oracle12c错误01017,ORACLE12.2中用户无法登陆报ORA-01017的解决办法ORACLE12.2中用户无法登陆报ORA-01017的解决办法错误现象:在ORACLE12.2中创建一个用户linfy后,登陆:SQL>showpdbs;CON_IDCON_NAMEOPENMODERESTRICTED——————————————————-…

    2022年5月23日
  • linux rpm 卸载 java_linux下用rpm 安装卸载jdk「建议收藏」

    linux rpm 卸载 java_linux下用rpm 安装卸载jdk「建议收藏」1、如果linux是centos的话,请先卸载openjdkjava-version,会有下面的信息:卸载默认的用root用户登陆到系统,打开一个终端输入#rpm-qa|grepgcj显示内容其中包含下面两行信息#java-1.4.2-gcj-compat-1.4.2.0-27jpp#java-1.4.2-gcj-compat-devel-l.4.2.0-27jpp卸载#rpm-…

    2022年9月15日
  • Delphi XE3 下安装ActiveX控件「建议收藏」

    Delphi XE3 下安装ActiveX控件「建议收藏」http://blog.csdn.net/lee576/article/details/1770744此英文文章来自codegear官方网站,但是是讲在BDS2006 下如何安装,我在delphi2007下用此方法,一样通过,原文如下 Description:HowtoimportanActiveXcontrolinBDS2006?Answer/S

    2022年5月14日

发表回复

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

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