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


相关推荐

  • DreamWeaver CS5视频教程(建站必备)

    DreamWeaver CS5视频教程(建站必备)月云网赚论坛免费分享:(建站必备)DreamWeaverCS5视频教程,学完就可以做自己想要做的网网站了。01dreamweaver教程CS5视频教程_工具栏介绍02dreamweaver教程CS5视频教程_编码工具栏03dreamweaver教程CS5视频教程_“插入”面板104dreamweaver教程CS5视频教程“插入”面板205dreamweav

    2022年6月3日
    35
  • SQLldr_乔羽简介

    SQLldr_乔羽简介1.SQLLDR导入 1.1 简介 SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件(数据)迁移到ORACLE数据库中。SQL*LOADER是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)。 2.2 语法和参数语法:SQLLDRkeyword=value[,keyword=value,…];…

    2022年4月19日
    38
  • 自动化测试平台(八):列表组件公共化封装和用例项目管理功能开发

    自动化测试平台(八):列表组件公共化封装和用例项目管理功能开发上一章我们完成了整个用户管理模块的功能,能够正确的增、删、改、查用户。但其中有很多判断实际上是其他类似的模块也会有的,例如:1.创建用户后回到首页刷新列表;2.删除次页最后一条数据,回到前一页刷新列表;3.查询条件的格式化;—难道我们每写一个类似的模块,都要去写一遍这些重复的逻辑代码吗?显然是没必要的,所以我们需要将其抽离成公共列表组件提供给其他模块使用,避免大量的做重复的事情,并让代码更容易维护。本章还将完成用例项目管理功能,它主要用于管理不同类型(API、UI),不同项目

    2022年6月25日
    21
  • 查看informix数据库端口

    cd目录(/usr/informix/etc) view sqlhosts记下服务名到根目录下cdetcviewservices根据服务名查找端口号

    2022年4月7日
    43
  • 软件测试面试笔试题及答案_软件测试工程师面试题

    软件测试面试笔试题及答案_软件测试工程师面试题软件缺陷:1)软件未实现产品说明书要求的功能2)软件出现了产品说明书指明不应该出现的错误3)软件实现了产品说明书未提到的功能4)软件未实现产品说明书虽未明确提及但应该实现的目标5)软件难以理

    2022年8月6日
    3
  • allargsconstructor_constructor java

    allargsconstructor_constructor java接触Lombok@NoArgsConstructor,@RequiredArgsConstructor,@AllArgsContructor。是Lombok插件三种生成不同构造方法的注解,来完成项目中不同构造方法的需求。@NoArgsConstructor:生成一个无参数的构造方法@AllArgsContructor:?会生成一个包含所有变量@RequiredArgsCon…

    2025年10月5日
    3

发表回复

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

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