数据结构约瑟夫环问题

时间:2024.3.31

数据结构实验报告


题目:约瑟夫环问题

                               

一.设计内容

[问题描述]

约瑟夫环问题的一种描述是:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人手持一个密码(正整数)。一开始任选一个整数作为报数上限值,从第一人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,将它的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去直到所有人全部出列为止。试设计程序实现之。

[基本要求] 

利用循环链表存储结构模拟此过程,按照出列的顺序打印各人的编号。

[实验提示]

程序运行后首先要求用户指定初始报数上限值。然后读取各人的密码。设n<=30。

程序执行后,要求用户在计算机终端上显示“提示信息”后,用键盘输入“提示信息”中规定的命令,以“回车符”为结束标志。相应的输入数据和运算结果显示在其后。

二、设计目的

1. 达到熟练掌握C++语言的基本知识和技能;

2. 能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。

3.把课本上的知识应用到实际生活中,达到学以致用的目的。

三、系统分析与设计(确定程序功能模块)

1、为实现上述程序的功能,应以有序链表表示集合。

基本操作:

InitList(&L)

    操作结果:构造一个空的有序表L。

DestroyList(&L)

  初始条件:有序表L已存在。

  操作结果:销毁有序表L。

ListEmpty(L)

初始条件:有序表L已存在。

操作结果:若L为空表,则返回TRUE,否则返回FALSE。

ListLength(L)

初始条件:有序表L已存在。

操作结果:返回L中数据元素个数。

GetElem(L,i)

初始条件:有序表L已存在,并且1≤i≤ListLength(L)。

操作结果:返回L中第i个数据元素。

LocatePos(L,e)

初始条件:有序表L已存在,e和有序表中元素同类型的值。

操作结果:若L中存在和e相同的元素,则返回位置;否则返回0。

InsertElem(&L,e)

初始条件:有序表L已存在

操作结果:在L中,按有序关系插入值和e相同的数据元素。

DeleteElem(&L,i)

初始条件:有序表L已存在。

操作结果:删除L中第i个数据元素。

ListTraverse(L,visit())

初始条件:有序表L已存在。

操作结果:依次对L的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。

} ADT OrderedList

2、本程序包含两个模块:

       (1)主程序模块:

         void main(){

              初始化;

              调用函数(接受命令,处理命令)}

       (2)有序表单元模块——实现有序表的抽象数据类型。

        (3)输出函数模块——有序表的输出。

四、源程序代码

#include"stdio.h"

#include"malloc.h"

//1.元素类型,结点类型和指针类型

 typedef struct LNode         //定义结构体,

{

 int num,pwd;                 //num用来存储人的序号,pwd用来存储人的密码

 struct LNode *next;

};

struct LNode *head,*p,*pt;    //定义结点

//2、  创建循环链表函数

int creatLinkList(int n)      //参数n传递人数,

{

   int i;

   head=(struct LNode*)malloc(sizeof(struct LNode));

                         //创建一个带头结点的链表

   if(!head)  {return 0;}    //创建不成功,返回0

   p=head;

   for(i=1;i<n;i++)

  {

     pt=(struct LNode*)malloc(sizeof(struct LNode));

     if(!pt)  {return 0;}

     p->next=pt;

     p=pt;

  }

    p->next=head;    //构成循环链表

    pt=head;

    return 0;

}

//3.创建输入密码函数

 int enterPwd(int n)        //参数n传递人数

{

   int i,j;

   printf("\n请输入密码: \n");

    for( i=1;i<=n;i++)

    {

       scanf("%d",&j);

       pt->num=i;        //num存储人的序号

       pt->pwd=j;         //pwd存储人的密码

       pt=pt->next;

    }

    pt=p;

    return j;

}

 //4、创建输出函数

 int outList(int m,int n)    //参数m、n传递报数上限值和人数

{

   int i,a;

   for(i=1;i<=n;i++)         //用一个for循环搜索循环链表

   {

      for(a=1;a<m;a++)      //删除结点

      {

        pt=pt->next;

      }

      p=pt->next;

      m=p->pwd;

      printf("%d ",p->num);    //输出人的序号

      pt->next=p->next;

      free(p);          //释放动态申请的结点空间

   }

   return 0;

}

 //主函数

void main()

{   int m,n;   //m为报数上限值,n为人数

    printf("\n参数m、n传递报数上限值和人数;\n");

    printf("\n请输入 m 和 n: \n");

    scanf("%d %d",&m,&n);

    creatLinkList( n);  //调用创建链表函数

    enterPwd( n);       //调用输入密码函数

    printf("\n出队的人依次是:\n");

    outList( m,n);      //调用输出链表函数

}

五、测试结果及功能说明

 

输入报数上限值为m为6 ,人数n为7;

7个人数密码依次是1,2,3,4,5,6,7;

出队的人号码依次是:6,5,4,3,2,1,7

六、设计体会

数据结构是一门比较抽象的课程,但是也是一门最基础的课程学的过程。在现实生活的应用也非常广泛通过设计该实验让我更加深刻的掌握了掌握了,有关链表的知识,同时也认识到了自己在平时学习当中的盲点,通过这次实验发现了自己在数据结构这门功课上存在严重的不足。链表中的指针理解不够,运用不够熟练,常常出现一些莫名其妙的问题,调试费时太多。今后一定会多编程,多思索。在以后的学习过程中还需要不断的完善学习,希望能把数据结构这门课学习的更加深入,更加透彻。最后,非常感谢老师在实验的过程所提供的帮助和指导。

 

                                         

                                         


第二篇:约瑟夫环之数据结构


湘潭大学数学与计算科学学院

约瑟夫环之数据结构

源程序2

#include<iostream>

#include<cstdlib>

#include<iomanip>

using namespace std;

struct People{

int id;//人的编号

People *next;

};

void CreateList(intn,People *&head){//建立循环单向链表

People *p,*pre;//pre指当前节点的前一节点

for(int i=0;i<n;i++){

p=(People *)malloc(sizeof(struct People));

p->id=i;

if(!i) head=p;//第一个为头结点

else pre->next=p;

pre=p;

}

pre->next=head;

}

void Count(People *ph,intn,intm,int id){//出列

People *p=ph;

while(p->id<id-1)p=p->next;//从指定人开始出列,移动到指定的那个人那里 for(int i=0;i<n;i++){

if(!(i%m)){//m个人出列的提示

cout<<endl<<"第"<<(i+1)/m+1<<"组出列的人:"<<endl;

}

cout<<setw(4)<<left<<p->id+1;//出列

p=p->next;

}

cout<<endl<<"出列完毕!"<<endl;

}

void myfree(People *h,int n){//释放申请的内存

People *p=h->next;

while(n--){

free(h);

h=p;

p=p->next;

}

}

int main(){

intn,m,id;

cout<<"输入人数n:";

cin>>n;

cout<<"输入m:";

cin>>m;

cout<<"输入指定的第一个人:";

cin>>id;

if(n<=0||m<=0||id<=0){

cout<<"intput error!";

exit(0);

}

People *head;

CreateList(n,head);//建立循环单链表

Count(head,n,m,id);//n个人里从id那个人开始数m个人出列,直到没人 myfree(head,n);//释放内存

return 0;

}

题目2运行结果:

约瑟夫环之数据结构

更多相关推荐:
数据结构约瑟夫环课程设计实验报告

徐州工程学院信电工程学院数据结构课程设计学院课程设计报告课程名称数据结构课程设计报告专业班级学生姓名学号设计题目约瑟夫环指导教师设计起止时间年月日至年月日徐州工程学院信电工程学院数据结构课程设计徐州工程学院信电...

约瑟夫环数据结构实验报告

数据结构上机实验报告1需求分析1用一个循环链表实现n个人按顺时针排成一圈每个人看作一个节点每个节点都是一个结构体类型包含三个域序号域data密码域key指向下一个人的指针域next2程序开始时由用户任意输入人数...

数据结构实验报告1约瑟夫环

一上机实验的问题和要求约瑟夫环问题描述编号是12nngt0的n个人按照顺时针方向围坐一圈每人持有一正整数密码开始时任选一个正整数作为报数上限值m从某个人开始按顺时针方向自1开始顺序报数报到m时停止报数报m的人出...

数据结构约瑟夫环实验报告

数据结构实验报告实验课程线性表的应用专业年级班级姓名学号实验报告

数据结构实验报告约瑟夫环20xx053003

工程实践1项目报告20xx年12月成都信息工程学院计算机学院一问题描述约瑟夫环问题描述设有n个人围坐在圆桌周围现从某个位置i上的人开始报数数到m的人就站出来下一个人即原来的第m1个位置上的人又从1开始报数再是数...

数据结构实验报告一-约瑟夫环问题

实验1约瑟夫环问题1.需求分析(1)输入的形式和输入值的范围:每一次输入的值为两个正整数,中间用逗号隔开。若分别设为n,m,则输入格式为:n,m。不对非法输入做处理,即假设输入都是合法的。(2)输出的形式:输出…

数据结构与算法实验报告-约瑟夫环

题目约瑟夫环问题班级姓名学号完成日期20xx1228一需求分析1问题描述设有n个人围坐在一个圆桌周围现从第s个人开始报数数到第m的人出列然后从出列的下一个人重新开始报数数到第m的人又出列如此反复直到所有的人全部...

数据结构 约瑟夫环课程设计报告

课程设计报告一需求分析1本演示程序中利用单向循环链表存储结构模拟约瑟夫问题的进行程序运行后首先要求用户指定初始报数上限值然后读取个人的密码可设n30此题所用的循环链表中不需要头结点因此在程序设计中应注意空表和非...

约瑟夫环-数据结构

课程学号实验日期实验序号实验题目实验成绩实验评语北京电子科技学院BESTI实验报告数据结构班级20xx姓名20xx420指导老师实验一约瑟夫环约瑟夫Joeph问题的一种描述是编号为12n的n个人按顺时针方向围坐...

数据结构课程设计约瑟夫环报告

目录目录1任务书2正文4一数据结构定义41抽象数据类型42存储结构定义43基本操作5二解题过程71问题分解72模块结构73解题思路8三实现9四实验结果131实验数据132实验结果13五实验小结161数据结构使用...

数据结构约瑟夫环的课程设计报告

武汉工业学院数学与计算机学院数据结构课程设计设计题目约瑟夫环专业班级计算机6班学号100702129姓名王元指导教师李禹生20xx年9月3日1一选题背景题目约瑟夫环问题描述编号为12n的n个人按顺时针方向围坐圈...

约瑟夫环数据结构报告

课程设计论文任务书信息学院计算机专业一课程设计论文题目约瑟夫环程序设计二课程设计论文工作自20xx年12月29日起至20xx年1月10日止三课程设计论文地点5204四课程设计论文内容要求1本课程设计的目的1使学...

数据结构约瑟夫环实验报告(35篇)