这里提供约瑟夫环问题的c++代码和思路,其实这个问题用数组解决足矣,但是为了应用数据结构的顺序表,这里给出两种顺序表的代码。
c++1:

/*
约瑟夫环问题:设编号为1,2,3,……,n的n(n>0)个人按顺时针
方向围坐一圈,m为任意一个正整数。从第一个人开始顺时针方
向自1起顺序报数,报到m时停止并且报m的人出列,再从他的下一
个人开始重新从1报数,报到m时停止并且报m的人出列。如此下去,
直到所有人全部出列为止。要求设计一个程序模拟此过程,对任意给
定的m和n,求出出列编号序列。实验要求:用顺序表实现。
*/
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct
{
int *a;//这里想让数组成员长度是可变的,可以把它先写成一个指针。
//  实例化成一个结构体变量时再对其进行动态分配空间
int length;
}list;//命名为list类
void Creatlist(list *&L,int *p,int n)//这里我们需要对指针变量L进行操作(赋值等),所以要引用L的地址
{
L=(list*)malloc(sizeof(list));/*为结构体指针申请空间。这里L是一个指针,
为什么要分配空间呢?因为这个指针指向的
结构体需要空间,我们要创造这样一个空间
*/
L->a=(int*)malloc(sizeof(int)*n);//为可变数组成员申请空间
int i=0,k=0;
printf("队列序号为:\n");
while(i<n)
{
L->a[k]=p[i];//把数组中的数值转移到顺序表list中
printf("%d ",L->a[k]);
k++;i++;
}
printf("\n");
L->length=k;
}
void chose(list *&L,int m)//这是选择出列序号的函数,m是给定出列序号
{
int k=0;//这是数组下标
printf("出列序号为:\n");
for(int i=1;L->length>0;i++)//循环查找,每m个元素就输出这个元素,实际上也可以用模除来实现,但这样更直观。
{                            //循环条件是长度要大于零
if(k+1>L->length)//当循环到最后一个元素时,回到第一个元素
{
k=0;
}
if (i==m)//当找到
{
printf("%d ",L->a[k]);
for(int j=k;j+1<=L->length;j++)//后面所有元素整体向前挪一个单位
{
L->a[j]=L->a[j+1];
}
L->length--;//元素拿出来长度要减一
i=0;//找到这个元素后序号要从1开始重新计数,循环每次加一,所以这里赋0
continue;//找到后重新开始
}
k++;//这里数组下标要一直加一,但是当找到后后面的元素回向前挪,此时角标不能加一
//,当前元素就是序号1所以不能放到循环括号里
}
printf("\n");
}
int main()
{
int *p;
int n,m,j=1;
printf("请输入人数:");
scanf("%d",&n);
p=(int*)malloc(n*sizeof(int));//创建一个数组用来存放1到n,这里没有指定大小,我们动态分配空间
while(j<=n)
{
p[j-1]=j;
// printf("%d",p[j-1]);
j++;
}
list *l1;//定义一个结构体指针,按理要进行分配内存空间,这样也可以,但是我们也可以在调用的函体数里作这件事
Creatlist(l1,p,n);
printf("请输入要出列的序号:\n");
scanf("%d",&m);
chose(l1,m);
system("pause");
}

 

c++2:
#include<stdio.h>

#include<stdlib.h>

#define Maxsize 30

struct SqList

{

    int Data[Maxsize];

    int length;

};

 

typedef struct SqList SqList;

void InitList(SqList *&L)

{

    L = (SqList *)malloc(sizeof(SqList));

    L->length = 0;

}

 

void CreateList(SqList *&L)

{

 int i;

 int people;

 printf("请输入队列总人数:\n");

 scanf("%d",&people);

 printf("\n");

 printf("队列序号是:\n");

 for (i=0; i<people; i++)

 {

    L->Data[i] = i + 1;

   

    printf("%d ", L->Data[i]);

 }

 printf("\n");

 L->length = people;

}

void DisplayList(SqList *L)

{

    int m, i, j;

    int k=0;

    printf("\n");

    printf("请输入第几个报数的人出列: \n");

    scanf("%d", &m);

    printf("\n");

    printf("出列次序依次是:\n");

    for (i=L->length; i>0; i--)

    {

       k=(k+m-1)%i;

       printf("%d ",L->Data[k]);

       for (j=k;j<i-1; j++)

       {

           L->Data[j] = L->Data[j+1];

       }

       L->length = L->length - 1;

    }

    printf("\n");

}

 

int main()

{

 SqList *L;

 InitList(L);

 CreateList(L);

 DisplayList(L);

}

 


0 条评论

发表回复

Avatar placeholder

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