15,440
社区成员
发帖
与我相关
我的任务
分享
#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define OVERFLOW -2
typedef int status;
typedef int ElemType;
typedef struct node{
int num; //洞穴编号
int store_num; //洞穴状态,0为已探索,1为未探索
struct node *next;
}SqList;
SqList *InitList_Sq(SqList *L,ElemType n){ //构造一个循环链表L
SqList *p,*q;
ElemType j;
for(j=0;j<n;j++)
{
q=(SqList *)malloc(sizeof(SqList));
q->num=j+1;
q->store_num=0;
q->next=NULL;
if(L==NULL)
L=q;
else
p->next=q;
p=q;
if(j==n-1)
q->next=L;
}
return L;
} //InitList_Sq
//n = cave number, k = times fox found
status Rabbit(SqList *L,ElemType k,ElemType n){ //构造狐狸逮兔子函数
int i,j=0,current=0;//定义一个当前洞口号的记数器,初始位置为第一个洞口
SqList *p=L;
for(i=1;i<=n;i++)
{ p->store_num=1;
p=p->next;
} //给每个洞作标记为1,表示狐狸未进之洞
L->store_num=0; //第一次进入第一个洞,标记进过的洞为0
p = L->next;
for(i=2;i<=k;i++){
current=(current+i)%n;
for(;j<n;j++)
{
if(p->num==current)
{
p->store_num=0;
break;
}
else
p=p->next;
}//标记进过的洞为0
}//第二次隔1个洞找,第三次隔2个洞找,以后如此类推,经过1000次
printf("\n兔子可能藏在如下的洞中:\n") ;
for(p = L, i=0;i<n;i++, p = p->next)
{
if(p->store_num==1)
printf(" \n此洞是第%d号洞 !",i+1); //输出未进过的洞号
}
p = L;
for(i = 0; i < n;p = p->next,i++)
{
printf("p[%d] : %d\n", i, p->store_num);
}
return OK;
}
int main()
{
ElemType n,k;
SqList *L = NULL;
printf("请依次输入洞穴数量和寻找次数:\n");
scanf("%d\n%d",&n,&k);
L=InitList_Sq(L,n);
Rabbit(L,k,n);
}
printf("\n兔子可能藏在如下的洞中:") ;
for(i=0;i<n;i++)
if(p->store_num==1)
printf(" \n此洞是第%d号洞 !",i+1); //输出未进过的洞号
return OK;
}
修改成如下
63 printf("\n兔子可能藏在如下的洞中:\n") ;
64 for(p = L, i=0;i<n;i++, p = p->next)
65 {
66 if(p->store_num==1)
67 printf(" \n此洞是第%d号洞 !",i+1); //输出未进过的洞号
68 }