c语言链表实现约瑟夫环的代码,每隔任意元素删除一个,逐步输出各个删除元素
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define N 10
struct lnode
{
int i;
struct lnode *next;
};
void cutoff(struct lnode *head, int n, int total)
{
struct lnode *pp,*qq=head;
int i;
if(total==0)
return ;
n=n%total;
if(n==0)
n=total;
for(i=0; i<n; i++)
{ pp=qq;
qq=qq->next;
}
pp->next=qq->next;
printf("%d ",qq->i );
free(qq);
cutoff(pp,n,total-1);
}
int main(void)
{
struct lnode *head,*p1,*p2;
int m,n;
head=NULL;
for(int i=0; i<10; i++)
{
p1=(struct lnode*)malloc(sizeof(struct lnode));
puts("输入一个数组中的值:");
scanf("%d",&m);
p1->i=m;
if(head==NULL)
{
head=p1;
p2=p1;
}
else
{
p2->next=p1;
p2=p1;
}
}
p2->next=head;
puts("每隔几个数删除一个?:");
scanf("%d",&n);
int h=10;
cutoff(p2,n,h);
return 0;
}
以上是链表实现方法,下面是数组实现的方法
#include<stdio.h>
void main()
{
int a[50];
int i,n,k,m;
scanf("%d",&n);
for(i=0;i<n;i++)
a[i]=i+1;
k=0;
m=0;
i=0;
while(m<n-1)
{
if(a[i]!=0) k++;
if(k==3)
{
//printf("%d \n",a[i]);
//for(int j=0;j<=n-1;j++)
// printf("%d ",a[j]);
a[i]=0;
k=0;
m++;
}
i++;
if(i==n) i=0;
}
for(i=0;i<n;i++)
if(a[i]!=0)
printf("最后一个编号为:%d ",a[i]);
}