实验报告1—约瑟夫环

时间:2024.4.20

华北水利水电学院约瑟夫环 实验报告

2010~20##学年  第 一   学期     09   计算机科学与技术 专业

班级: 2009119   学号: 200911902 姓名: 万婷婷  

一、   实验目的

   要求设计一个程序模拟约瑟夫环问题过程,求出出列编号序列。

二、实验要求

1)利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。

2)建立输入处理输入数据,输入m的初值,n ,输入每个人的密码,建立单循环链表。

3)建立一个输出函数,将正确的输出序列

4)测试数据:m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4

三、实验内容

基本算法以及分析:

本程序主要是以建立单循环链表的形式,建立起一个约瑟夫环,然后根据之前创立的结点,输入结点里的一些数据,如下

typedef struct Node

        {

        int Index;                 在当前环中所处的位置,即编号

        int Password;              在当前环中的所带的密码

        struct Node *next;

        }JosephuNode;

程序有主函数开始,首先,提示输入创建约瑟夫环环数以及每个环上所带的密码。然后,利用单循环链表建立起约瑟夫环,p ->next = head->next;就是将最后一个结点的后继指向头结点的下一个结点, 然后主函数调用Josephu函数,并实现如下功能:

编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。

四、程序源代码

1.约瑟夫环问题

#include<iostream.h>

#include<malloc.h>

#include<stdio.h>

typedef struct LNode

{

       int M;//当前出局人的编号

       int Password;//当前出局人所带密码

       struct LNode *next;

}JosephuNode;

void Josephu(int n,int m)

{

       int i,j,password;

       JosephuNode *head,*p,*q,*L;

       head=p=(JosephuNode *)malloc(sizeof(JosephuNode));

      

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

       {

        q=(JosephuNode *)malloc(sizeof(JosephuNode));

        p->next=q;

              q->M=i;

              printf("请输入第%d号所带密码:",      i);

              scanf("%d",&password);

              q->Password=password;

              p=q;

             

       }

   p->next=head->next;

       free(head);

       L=q->next;

       printf("出列者的编号顺序是:");

   while(p!=L)

       {

           for(j=1;j<m;j++)

              {

              p=L;

              L=L->next;

              }

       p->next=L->next;

       printf("%d,",L->M);

       m=L->Password;

       free(L);

       L=p->next;

       }

       printf("%d \n", p->M);

       free(L);

      

}

void main()

{

       int n,m;

       printf(".............约瑟夫环问题..........\n");

       printf("输入的n和m值不小于1:\n");

       printf("请输入参加的人数n:");

       scanf("%d",&n);

       printf("请输入起始报数上限值m:");

       scanf("%d",&m);

       Josephu(n,m);

}

五、运行结果

六、小结(不少于100字)

     通过这次实验,使我更加知道自己的不足和需要加强的地方,指针仍然是自己需要去加强巩固的地方。每次看到自己写的程序和网上的比较发现自己需要完善程序,而不只是编出而已,必须让自己的程序运行结果一目了然。数据结构让我感觉很有意思,让我没有了学习c语言和c++的茫然和烦恼,实验也很贴近每章学习的内容,很有效的巩固了我们的知识。


第二篇:约瑟夫环代码及实验报告


约瑟夫环问题实验报告

一、问题描述

设编号为1-n的n(n>0)个人按顺时针方向围成一圈.首先第1个人从1开始顺时针报数.报m的人(m 为正整数).令其出列。然后再从他的下一个人开始,重新从1顺时针报数,报m的人,再令其出列。如此下去,直到圈中所有人出列为止。求出列编号序列。

二、需求分析

1、需要基于线性表的基本操作来实现约瑟夫问题

2、需要利用数组来实现线性表

3、测试用例

输入:10,3

输出:3 6 9 2 7 1 8 5 10 4

三、概要设计

抽象数据类型

为实现上述程序的功能,应以整数存储用户的输入,以及计算出的结果。 算法的基本思想

利用数组来代表一个环,然后模拟报号出圈的过程,直到所有人都出圈。 程序的流程

程序由三个模块组成:

(1) 输入模块:完成两个正整数的输入,存入变量n和m中。

(2) 计算模块:计算这n个数的输出序列

(3) 输出模块:屏幕上显示这n个数的输出序列。

四、详细设计

程序代码:

#include<stdio.h>

#include<stdlib.h>

typedef struct node{

int number;

int psw;

struct node *next;

}Lnode ,*Linklist;

void insert( Linklist * list , Linklist q , int e1 ,int e2 )

{

Linklist p;

p=( Linklist )malloc( sizeof( Lnode ) ); //给链表分配预存空间 p->number=e1;

p->psw=e2;

if(!*list)

{

*list=p; //如果链表为空,则就将 p作为头结点; p->next=NULL;

}

else

{

p->next=q->next; //插入节点 q

q->next=p;

}

}

void creat( Linklist *jsp ,int n )

{

Linklist q=NULL ;

Linklist list=NULL; int i,e; printf( "\n请输入每个人手中的密码:\n " ); for( i=0 ; i<n ;i++ )

{

scanf("%d",&e);

insert( &list ,q ,i+1 ,e );

if( i==0 ) //第一次生成头结点 ,指向p q=list;

else

q=q->next; //q指向下一个节点

}

q->next=list; //形成一个循环链表

*jsp = list;

}

void shuchu( Linklist *jsp , int m )

{

Linklist q,p;

int i;

p=q=*jsp;

while( q->next !=p )

q=q->next; //q 指向 p 的前一个节点

printf( "\n出列的人的顺序编号:\n" );

while( p->next !=p ) // 判断循环结束的标志

{

for( i=0;i<m-1;i++ )

{ //P 指向要删除的节点,q指向p的前一个节点 q=p;

p=p->next;

}

q->next = p->next; //删除 p 指向的节点

printf("%d ",p->number);

m=p->psw; //重新定义一个报数上限

free(p); //释放 节点 p

p=q->next; //指向下一个节点

}

printf( "\n\n最后有一个的序号为 %d \n",p->number ); //读出最后 一个数据

}

int main()

{

Linklist jsp;

int n ,m;

printf( "请输入约瑟夫环问题的人数:\n" );

scanf("%d",&n); //输入约瑟夫环问题的总人数

creat(&jsp , n);

printf("\n请输入初始最大的出列序号\n");

scanf("%d",&m);

shuchu( &jsp , m );

system("pause");

return 0;

}

物理数据类型

队列元素及出列序列都以整型数组方式存储

算法的具体步骤

(1) 将队列里的元素编号

(2) 循环访问数组元素

(3) 第一个元素从1开始报数,报数编号与出列编号相同时出列,并

将该元素置为0

(4) 下一个元素重新从1开始报数,依次循环

输入和输出的格式

输入格式:n,m

输出格式1:在字符界面上输出这n个数的输出序列

输出格式2:将这n个数的输出序列写入到文件中

五、实验心得该实验利用数组实现线性表,算法简便,但产生很多不必要的消耗,下一步可以尝试采用单链表,双链表实现该问题。

更多相关推荐:
约瑟夫环实验报告

《数据结构与算法设计》实验报告实验一学院:自动化学院班级:学号:**一、实验目的1、熟悉VC环境,学习使用C语言利用链表的存储结构解决实际的问题。2、在编程、上机调试的过程中,加深对线性链表这种数据结构的基本概…

约瑟夫环问题 实验报告

数学与计算机学院约瑟夫环问题实验报告年级10级学号20xx434062姓名成绩专业电气信息计算机类实验地点主楼402指导教师史青宣实验项目约瑟夫环问题实验日期20xx年12月26日一实验目的本实验的目的是进一步...

约瑟夫环课程设计实验报告

数据结构课程设计报告课程名称课程设计题目姓名院系专业年级学号指导教师数据结构课程设计joseph环计算机学院20xx年12月18日目录1课程设计的目的22需求分析23课程设计报告内容31概要设计32详细设计33...

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

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

实验报告1约瑟夫环

郭艳慧实验一线性表081020数据结构实验报告班级学号姓名日期081020题目约瑟夫环一上机实验的问题和要求问题描述编号为1到n的n个人围成一圈每人带一个密码c以m为报数上限然后从第一个人开始顺时针自1开始报数...

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

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

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

20##级数据结构实验报告实验名称:实验线性表实现约瑟夫问题求解学生姓名:班级:班内序号:07学号:日期:20xx年10月31日1.实验要求【实验目的】1.熟悉C++语言的基本编程方法,掌握集成编译环境的调试方…

约瑟夫环实验报告

数据结构课程设计报告题目:约瑟夫环实验班级:成员:指导教师:完成日期:目录:实习报告要求...2约瑟夫环实验描述...3课程设计报告正文.4一.需求分析...4二.概要设计...4三.详细设计...61.各模块…

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

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

约瑟夫环C++实验报告

数据结构实验报告实验1线性表及其应用题目约瑟夫环软件工程2班林莉20xx1023一需求分析1本演示程序中人数n应为任意的首先应输入一个值赋给初始报数上限m程序应能自动保存出列人的序号和将出列的人所持的密码赋给m...

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

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

数据结构实验报告(约瑟夫环带密码问题)

数据结构实验报告班级计科0901班学号0908030106姓名王玲西安科技大学计算机科学与技术学院题目约瑟夫环问题一设计内容约瑟夫环问题的一种描述是编号为123n的n个人按顺时针方向围坐一圈每人手持一个密码正整...

约瑟夫环实验报告(35篇)