首页 > 编程语言 >大二算法实验一用循环链表解决约瑟夫环

大二算法实验一用循环链表解决约瑟夫环

时间:2023-11-06 16:46:09浏览次数:25  
标签:Node head NULL int 一用 next 链表 大二

题目 约瑟夫(Joeph)问题的一种描述是:编号为 1,2,…,n 的 n 个人按顺时针方向围坐一圈, 每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值 m,从第一个人开始 按顺时针方向自 1 开始顺序报数,报到 m 时停止报数。报 m 的人出列,将他的密码作为新 的 m 值,从他在顺时针方向上的下一个人开始重新从 1 报数,如此下去,直至所有人全部 出列为止。试设计一个程序求出出列顺序。 [基本要求] 利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。 [测试数据] m 的初值为 20;密码:3,1,7,2,4,8,4(正确的结果应为 6,1,4,7,2,3,5)。 [实现提示] 程序运行后首先要求用户指定初始报数上限值,然后读取各人的密码。设 n≤30。 分析: 1.此题我遇到的难点在于输出的是拥有密码的人的编号而不是他所持的密码,我刚开始想的是用数组记录拥有这个密码的人的编号,但这个方法在遇到两个重复的数字的时候就会失效,实际只要在结构体中多加一个数据即可。 2.循环链表的头结点容易出错,注意循环的方式。

#include<bits/stdc++.h>
using namespace std;
typedef struct node{
    int date;
    int shunxu;//用以储存编号
    struct node *next;
}Node;
int main(){
    int m,n,a[100000];
    cin>>n>>m;
    Node *head=NULL,*p=NULL,*r=NULL;
    head=(Node*)malloc(sizeof(Node));
    if(NULL==head){
        cout<<"Memory Failed";
        return 0;
    }//创建失败
    for(int i=1;i<=n;i++){cin>>a[i];
    
    }
    /*cout<<"*"<<endl;
    for(int i=1;i<=n;i++){cout<<a[i]<<endl;}
    cout<<"*"<<endl;*/
    p=head;//P指针指到头结点
    for(int i=1;i<=n;i++){
        //cin>>a;
        r=(Node*)malloc(sizeof(Node));
        r->date=a[i];
        r->shunxu=i;
        r->next=NULL;
        p->next=r;
        p=r;
    }
    p->next=head->next;//将末端指到头,形成循环链表,注意头结点没数据所以指到头结点的下一个
    p=head->next;//P指针指向第一个数据
    while(p->next!=p){
        for(int i=1;i<m;i++){//因为指向的是第一个数据相当于第一个人已经读过了
             r=p;
            p=p->next;//cout<<"#"<<p->date<<" ";
        }
        m=p->date;//cout<<p->date<<'$';
        cout<<p->shunxu;
        r->next=p->next;//删除结点
        p=p->next;
    }cout<<r->shunxu;
    

}

 

   

标签:Node,head,NULL,int,一用,next,链表,大二
From: https://www.cnblogs.com/zhengmou/p/17813094.html

相关文章

  • 大二快乐日记10.30
    MySQL的数据类型有大概可以分为5种,分别是整数类型、浮点数类型和定点数类型、日期和时间类型、字符串类型、二进制类型等。注意:整数类型和浮点数类型可以统称为数值数据类型。1)数值类型整数类型包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,浮点数类型包括FLOAT和DOUB......
  • 大二快乐日记10.31
    Java中常见运行时异常异常类型 说明ArithmeticException 算术错误异常,如以零做除数ArraylndexOutOfBoundException 数组索引越界ArrayStoreException 向类型不兼容的数组元素赋值ClassCastException 类型转换异常IllegalArgumentException 使用非法实参调用方法lIIegalStateExcept......
  • 大二快乐日记10.18
    2.@WebServlet实现单一映射在@WebServlet注解中,一般使用value属性实现Servlet单一映射,代码如下。纯文本复制packagenet.biancheng.www;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.serv......
  • 大二快乐日记10.16
    2.配置多个<url-pattern>子元素从Servlet2.5开始,<servlet-mapping>元素可以包含多个<url-pattern>子元素,每个<url-pattern>代表一个虚拟路径的映射规则。因此,通过在一个<servlet-mapping>元素中配置多个<url-pattern>子元素,也可以实现Servlet的多重映射。以ser......
  • 大二快乐日记10.17
    1.配置多个<servlet-mapping>元素Servlet2.5规范之前,<servlet-mapping>元素只允许包含一个<url-pattern>子元素,若要实现Servet的多重映射,只能通过配置多个<servlet-mapping>元素实现。以serveltDemo为例,在web.xml中配置两个<servlet-mapping>元素,代码如下所示......
  • 大二快乐日记10.20
    在MySQL中,可以使用ALTERDATABASE来修改已经被创建或者存在的数据库的相关参数。修改数据库的语法格式为:ALTERDATABASE[数据库名]{[DEFAULT]CHARACTERSET<字符集名>|[DEFAULT]COLLATE<校对规则名>}语法说明如下:ALTERDATABASE用于更改数据库的全局特性。使用A......
  • 大二快乐日记10.24
    3.@WebServlet实现多重映射Servlet3.0增加了对@WebServlet注解的支持,我们可以在urlPatterns属性中,以字符串数组的形式指定一组映射规则来实现Servlet的多重映射。以servletDemo为例,在@WebServlet注解的urlPatterns属性中添加一组虚拟路径,代码如下。纯文本复制pac......
  • 大二快乐日记10.23
    在MySQL中,当需要删除已创建的数据库时,可以使用DROPDATABASE语句。其语法格式为:DROPDATABASE[IFEXISTS]<数据库名>语法说明如下:<数据库名>:指定要删除的数据库名。IFEXISTS:用于防止当数据库不存在时发生错误。DROPDATABASE:删除数据库中的所有表格并同时删除数据库。使......
  • 大二快乐日记10.25
    匹配优先级Servlet虚拟路径的匹配优先级顺序为:全路径匹配(精确匹配)>目录匹配>扩展名匹配>缺省匹配(默认匹配)。Servlet容器会从优先级高的虚拟路径开始匹配,匹配成功后就会立刻将请求交给相应的Servlet进行处理,不会再关注其他虚拟路径是否匹配成功。......
  • 大二快乐日记10.27
    Tomcat中的缺省Servlet在Tomcat安装目录的\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将它设置为缺省Servlet。<servlet><servlet-name>default</servlet-name><servlet-class>org.apache.catali......