约瑟夫问题:N个人围成一圈,从第一个开始报数,第M个人出列,不断循环, 按顺序输出出列人的编号。例如N=6,M=5,出列人的序号为5,4,6,2,3,1. ——————————————————————————————————用单向循环链表解决比较好! 展示代码
#include<stdio.h>
#include<stdlib.h>
struct linklist
{
int data;
struct linklist* next;
};
int main()
{
int n,m,i,j;
scanf("%d",&n);
struct linklist* head=(struct linklist*)malloc(sizeof(struct linklist));
struct linklist* p;
head->next=NULL;
p=head;
for(i=0;i<n-1;i++)
{
struct linklist* s=(struct linklist*)malloc(sizeof(struct linklist));
p->next=s;
s->data=i+1;
s->next=NULL;
p=s;
}
p->next=NULL;
struct linklist* q=(struct linklist*)malloc(sizeof(struct linklist));
p->next=q;
q->next=head->next;
q->data=n;
scanf("%d",&m);
struct linklist* p0=(struct linklist*)malloc(sizeof(struct linklist));
p0=head;
p=p0->next;
i=1;
while(p0->next!=p0)
{
p0=p0->next;
p=p0->next;
i++;
if(i>=m&&i%m==0)
{
printf("%d ",p->data);
p0->next=p->next;
free(p);
p=p0->next;
i++;
}
}
printf("%d",p->data);
free(p);
}
有问题,有漏洞欢迎大家指出。 (心血来潮,第一篇博客)
|