1.顺序表
#include<stdio.h>
void Joseph(int str[][2],int m,int n);
int main()
{
int m,n,i; //n表示环长,m表示是密码
int str[100][2]; //二维数组用来存储元素值和标志变量
printf("请输入环长和密码:");
scanf("%d,%d",&n,&m);
for(i=0;i<n;i++)
{
printf("请输入第%d个元素值:",i+1);
scanf("%d",&str[i][0]);
str[i][1]=1; //设标志变量为1
}
printf("\n");
Joseph(str,m,n);
return 0;
}
void Joseph(int str[][2],int m,int n)
{
int count=1,a=0,i; //a表示出环元素的个数,count计数是否达到密码值
for(i=0;i<n;)
{
if(str[i][1]==1)
{
if(count==m)
{
printf("%-3d",str[i][0]); //输出被选中的元素
count=1; //重新计数
str[i][1]=0; //将已输出的元素的标志变量变为0
a++;
}
else count++;
}
i++;
if(i==n&&a<n) i=0; //当输出的元素个数小于总个数时,继续循环
}
}
2.链队列
#include <stdio.h>
#include<malloc.h>
typedef struct Node
{
int data;
struct Node *next;
}Node;
void Joseph(Node *front,Node *r,int m,int n);
int main()
{
int m,n,i;
Node *front=NULL,*s,*r; //front为头结点,r为尾指针
printf("请输入环长和密码:");
scanf("%d,%d",&n,&m);
front=(Node *)malloc(sizeof(Node));
r=front;
for(i=1;i<=n;i++)
{
s=(Node *)malloc(sizeof(Node));
s->data=i;
r->next=s;
r=s;
}
r->next=NULL;
Joseph(front,r,m,n);
return 0;
}
void Joseph(Node *front,Node *r,int m,int n)
{
Node *p=front->next,*q,*a;
int count=1,i;
for(i=0;i<n;)
{
if(count<m && p->next != NULL)
{
a=p;
p=p->next;
front->next = p;
a->next=NULL;
r->next=a;
r=a;
count++;
}
else
{
printf("%-3d",p->data);
q=p;
p=p->next;
front->next=p;
free(q);
i++;
count=1;
}
}
}