#include//定义结点
struct point
{
int num ; //当前结点所在位置,从0开始算起,依次类推
int sign ; //标志位,检查是否被查找过,0代表未被查找,1代表已经被查到过
struct point *next ;
};
int main(void)
{
int n , m; // n 代表洞 , m代表跨越查找步长
printf("please input number n and m : \n");
scanf("%d",&n);
scanf("%d",&m);
struct point *p = NULL;
struct point *s = NULL;
//循环遍历,依次创建 n 个结点
for(int i = 0 ; i < n ; i++)
{
if(i == 0) //创建第一个结点
{
p = (struct point * )malloc(sizeof(struct point)) ;
p->num = i;
p->sign = 0;
p->next = p;
}
else //在第一个结点基础上,继续创建余下结点
{
s = (struct point * )malloc(sizeof(struct point)) ;
s->num = i;
s->sign = 0;
s->next = p->next ;
p->next = s;
p = s;
}
}
p = p->next ; //将 p指正回归到最开始那个结点
struct point *q = NULL;
q = p ;
int count = 0;
//开始遍历查找
while(q->sign == 0)
{
q->sign = 1;
count++; //统计找到结点数
int j = 0;
while( j < m) //向前推m步
{
q = q->next;
j++; //控制步长
}
}
if(count < n) //如果count小于 n ,说明有可躲藏点
{
printf("yes, the rabbit have chance of survival, it can hide in the following position:\n");
int j = 0 ;
while( j < n) //输出标志位sign为0的所有结点
{
if(p->sign == 0)
{
printf("%d\t",p->num);
}
p = p->next;
j++;
}
printf("\n");
}
else
{
printf("no, the rabbit had no chance of survival\n");
}
//开始销毁链表
q = p->next ;
count = 0;
while(count < n-1)
{
free(p);
p = q;
q= p->next;
count++;
}
free(p);
return 0;
}