为什么得不到正确结果?

时间:2022-02-26 08:05:22
编写了个程序,用单链表解决以下问题:围绕着山顶有10个圆形排列的洞,狐狸要吃兔子,兔子说:“可以,但是必须找到我。我就藏身在这10个洞中,你先到1号洞找,第二次隔一个洞(3号洞)找,第三次隔两个洞(6号洞)找,以后如此类推,次数不限。”但是狐狸从早到晚进进出出了1000次,仍旧没有找到兔子,问兔子究竟藏在哪个洞中?
代码如下:
#include<stdio.h>
#include<stdlib.h>
#define LISTSIZE 10
struct linklist
{
int data;
struct linklist *next;
};
linklist *initlist(linklist *L)
{
int i;
linklist *head,*s;
head=NULL;
for(i=0;i<LISTSIZE;i++)
{
s=(linklist *)malloc(sizeof(linklist));
s->data=1;
s->next=head;
head=s;
}
return head;
}
int Rabbit(linklist *L)
{
int i=2,current=0;
linklist *p;
p=L;
(*p).data=0;
while((p->next!=NULL)&&i<=1000)
{
p->next=(p+current*sizeof(linklist))->next;
p->data=0;
current=(current+i)%LISTSIZE;
i++;
}
printf("\n兔子可能藏在如下洞中:");
if(p->next!=NULL)
{
if(p->data==1)
printf("此洞是第%d号洞",p->data);
p=p->next;
}
return 1;
}
void main()
{
linklist a;
linklist *L=&a;
L=initlist(L);
Rabbit(L);
}
程序编译和连接均通过,但是运行的时候没有反应,只显示一句“兔子可能藏身在如下洞中:”然后就停止了。为什么啊?高手指点一二~~

16 个解决方案

#1


怎么没人响应?自己顶一个~~

#2


if(p->next!=NULL) 

if(p->data==1) 
printf("此洞是第%d号洞",p->data); 
p=p->next; 

这句该用一个循环吧?

#3


/*################################################################################################################################################################################
狐狸要吃兔子,兔子说:“可以,但是必须找到我。我就藏身在这10个洞中,你先到1号洞找,第二次隔一个洞(3号洞)找,第三次隔两个洞(6号洞)找,以后如此类推,次数不限。”但是狐狸从早到晚进进出出了1000次,仍旧没有找到兔子,问兔子究竟藏在哪个洞中? 
################################################################################################################################################################################*/
#include <stdio.h>
int main()
{
    int i,hole = 0,x = 1,ret; //狐狸搜索的次数,间隔的洞,要找搜索的洞,位置
    int record[10]; //存储10个洞
    for (i = 0;i < 1000;i ++)
    {
        ret = x%10;
        if (ret == 0) ret = 10; //求余,确定要实际检索的洞口
        record[ret - 1] = 1;  //对相应的洞口打上标记1
        hole ++;x = x + hole + 1;
    }
    printf("The rabbit may be in those holes:\n");
    for (i = 0;i < 10;i ++)
        if (record[i] != 1) printf("NO.%2d hole\n",i + 1);//遍历数组,把没有标记的洞打印出来(他们都是地址)
    return 1;
}
我的编译环境是Linux kernel 2.6.28 gcc 4.3

#4


  顶一个吧~~

#5


我把循环问题改正了,但是还是不行,程序仍旧会出错,但是错不在编译连接,不知道到底怎么回事~~改过的代码:
#include<stdio.h>
#include<stdlib.h>
#define LISTSIZE 10
struct linklist
{
int data;
struct linklist *next;
};
linklist *initlist(linklist *L)
{
int i;
linklist *head,*s;
head=NULL;
for(i=0;i<LISTSIZE;i++)
{
s=(linklist *)malloc(sizeof(linklist));
s->data=1;
s->next=head;
head=s;
}
return head;
}
int Rabbit(linklist *L)
{
int i=2,current=0;
linklist *p;
p=L;
(*p).data=0;
while((p->next!=NULL)&&i<=1000)
{
p->next=(p+current*sizeof(linklist))->next;
p->data=0;
current=(current+i)%LISTSIZE;
i++;
}
printf("\n兔子可能藏在如下洞中:");
p=L;
while((p->next)!=NULL)
{
if(p->data==1)
printf("此洞是第%d号洞",p->data);
p=p->next;
}
return 1;
}
void main()
{
linklist a;
linklist *L=&a;
L=initlist(L);
Rabbit(L);
}

#6


不知道你调试程序了没

#7


/*
原程序的主要错误是:
  1。函数Rabbit中p->next=(p+current*sizeof(linklist))->next;用于结构数组,但不适合本程序的链表结构;
  2。printf("此洞是第%d号洞",p->data); 将总是输出1而不是洞号。
现修改如下:
*/
#include <stdio.h> 
#include <stdlib.h> 
#define LISTSIZE 10 
typedef struct linklist 

  int data; 
  struct linklist *next; 
  int number; 
} linklist; 

linklist *initlist(void) 

  int i; 
  linklist *head,*s; 
  head = NULL; 
  for(i=0;i <LISTSIZE;i++) 
  { 
    s=(linklist *)malloc(sizeof(linklist)); 
    s->data=1; 
    s->next=head;
    s->number = LISTSIZE-i;
    head = s;
  }
  return head; 


int Rabbit(linklist *L) 

  int i=1; 
  linklist *p; 
  p=L; 
  //(*p).data=0; 
  for (i = 1; i < 1000; i++)  //while((p->next!=NULL) && i <=1000) 
  { 
    int j;
    p->data=0; 
    for (j = 0; j < (i+1); j++)
    {
      if (p->next) p = p->next;
      else p = L;
    }
  } 
  printf("\n兔子可能藏在如下洞中:\n"); 
  p=L;
  while(p) //(p->next)!=NULL
  { 
    if(p->data==1)
    {
      printf("此洞是第%d号洞\n",p->number);//printf("此洞是第%d号洞\n",p->data); 
    }
    p=p->next; 
  } 
  return 1; 
}

void main() 

  //linklist a; 
  linklist *L; //=&a; 
  L=initlist(); //L=initlist(L); 
  Rabbit(L); 

#8


函数Rabbit中有2句应改为:

int i;
for (i = 1; i <= 1000; i++) 

#9


//我没读你的程序就修改了你的程序,一直修了2个小时,从中学到很多东西,特别是关于指针的运用,最后是得出了答案,2,4,7,9
不知道对不对,我使用pelles c 6.00编译.32位windows 2000.谢谢楼主.
#include <stdio.h>
#include <stdlib.h>
#define LISTSIZE 10
struct linklist
{
    int data;
    struct linklist *next;
};
struct linklist *initlist(void)
{
    int i;
    struct linklist *head,*s;
    head=NULL;
    for (i=0;i <LISTSIZE;i++)
    {
        s=(struct linklist *)malloc(sizeof(struct linklist));
        s->data=1;
        s->next=head;
        head=s;
    }

    for ( i=1 ; s; s = s->next,i++) { //初始化兔子洞号码,并将这些洞改成循环链表.
        s->data = i;
        printf("%d ", i);
        if (s->next == NULL) break;
    }
    s->next = head;  //首尾相接.
    printf("\n");
    return head;

}
//跳过指定数量的兔子洞.
struct linklist *skip(struct linklist *p, int q) { 
    p = p->next;
    for (; q!=0; q--) {
        //printf("skip %d\n", p->data);
        p = p->next;
    }
    return p;

}

void Rabbit(struct linklist *L)
{
    int i=1;
    int b=0;
    struct linklist *p, *it= NULL;
    p=L;

    while ( i <=1000)
    {
        printf("%d ", p->data&~0x80000000);
        p->data |= 0x80000000; //找到的置标志位.
        p = skip(p, i);

        i++;
    }
    p=L;
    printf("\nThe Rabbit mybe:");
    i = 10;
    while (i)
    {
        if (p->data>0) {
            printf(" %d.",p->data);
b = 1;
}
        p=p->next;
        i--;
    }
    if (b == 0) printf("Rabbit is not found!\n");

}
int main(int argc, char* argv[])
{
    struct linklist *L;
    L=initlist();
    Rabbit(L);

    return 0;
}

#10


如果是用单链表的话在跳过洞的时候做判断,如果到最后了就从头来.
再次感谢楼主对我的引导.谢谢.

#11


感觉 rabbit的算法有点问题,不是很明白。

#12


真丢人,我才发现三楼的大哥代码写得最简洁漂亮.
顶三楼!!!

#13


三楼用的是数组而不是单链表.如果不限定用单链表那么解空间就大多了.

#14


我也觉得数组算比较好一些,可是这是数据结构的一道作业题,老师的要求是用单链表,我也没有办法~~多谢你了~~

#15


调试了,但是总是会出现错误,提示程序必须关闭~~

#16


非常感谢你的程序。我对照着看了看。本来这个就是由一个线性表的改编过来的,所以开始的时候不会控制指针。看了你的程序收获很大。多谢~~

#1


怎么没人响应?自己顶一个~~

#2


if(p->next!=NULL) 

if(p->data==1) 
printf("此洞是第%d号洞",p->data); 
p=p->next; 

这句该用一个循环吧?

#3


/*################################################################################################################################################################################
狐狸要吃兔子,兔子说:“可以,但是必须找到我。我就藏身在这10个洞中,你先到1号洞找,第二次隔一个洞(3号洞)找,第三次隔两个洞(6号洞)找,以后如此类推,次数不限。”但是狐狸从早到晚进进出出了1000次,仍旧没有找到兔子,问兔子究竟藏在哪个洞中? 
################################################################################################################################################################################*/
#include <stdio.h>
int main()
{
    int i,hole = 0,x = 1,ret; //狐狸搜索的次数,间隔的洞,要找搜索的洞,位置
    int record[10]; //存储10个洞
    for (i = 0;i < 1000;i ++)
    {
        ret = x%10;
        if (ret == 0) ret = 10; //求余,确定要实际检索的洞口
        record[ret - 1] = 1;  //对相应的洞口打上标记1
        hole ++;x = x + hole + 1;
    }
    printf("The rabbit may be in those holes:\n");
    for (i = 0;i < 10;i ++)
        if (record[i] != 1) printf("NO.%2d hole\n",i + 1);//遍历数组,把没有标记的洞打印出来(他们都是地址)
    return 1;
}
我的编译环境是Linux kernel 2.6.28 gcc 4.3

#4


  顶一个吧~~

#5


我把循环问题改正了,但是还是不行,程序仍旧会出错,但是错不在编译连接,不知道到底怎么回事~~改过的代码:
#include<stdio.h>
#include<stdlib.h>
#define LISTSIZE 10
struct linklist
{
int data;
struct linklist *next;
};
linklist *initlist(linklist *L)
{
int i;
linklist *head,*s;
head=NULL;
for(i=0;i<LISTSIZE;i++)
{
s=(linklist *)malloc(sizeof(linklist));
s->data=1;
s->next=head;
head=s;
}
return head;
}
int Rabbit(linklist *L)
{
int i=2,current=0;
linklist *p;
p=L;
(*p).data=0;
while((p->next!=NULL)&&i<=1000)
{
p->next=(p+current*sizeof(linklist))->next;
p->data=0;
current=(current+i)%LISTSIZE;
i++;
}
printf("\n兔子可能藏在如下洞中:");
p=L;
while((p->next)!=NULL)
{
if(p->data==1)
printf("此洞是第%d号洞",p->data);
p=p->next;
}
return 1;
}
void main()
{
linklist a;
linklist *L=&a;
L=initlist(L);
Rabbit(L);
}

#6


不知道你调试程序了没

#7


/*
原程序的主要错误是:
  1。函数Rabbit中p->next=(p+current*sizeof(linklist))->next;用于结构数组,但不适合本程序的链表结构;
  2。printf("此洞是第%d号洞",p->data); 将总是输出1而不是洞号。
现修改如下:
*/
#include <stdio.h> 
#include <stdlib.h> 
#define LISTSIZE 10 
typedef struct linklist 

  int data; 
  struct linklist *next; 
  int number; 
} linklist; 

linklist *initlist(void) 

  int i; 
  linklist *head,*s; 
  head = NULL; 
  for(i=0;i <LISTSIZE;i++) 
  { 
    s=(linklist *)malloc(sizeof(linklist)); 
    s->data=1; 
    s->next=head;
    s->number = LISTSIZE-i;
    head = s;
  }
  return head; 


int Rabbit(linklist *L) 

  int i=1; 
  linklist *p; 
  p=L; 
  //(*p).data=0; 
  for (i = 1; i < 1000; i++)  //while((p->next!=NULL) && i <=1000) 
  { 
    int j;
    p->data=0; 
    for (j = 0; j < (i+1); j++)
    {
      if (p->next) p = p->next;
      else p = L;
    }
  } 
  printf("\n兔子可能藏在如下洞中:\n"); 
  p=L;
  while(p) //(p->next)!=NULL
  { 
    if(p->data==1)
    {
      printf("此洞是第%d号洞\n",p->number);//printf("此洞是第%d号洞\n",p->data); 
    }
    p=p->next; 
  } 
  return 1; 
}

void main() 

  //linklist a; 
  linklist *L; //=&a; 
  L=initlist(); //L=initlist(L); 
  Rabbit(L); 

#8


函数Rabbit中有2句应改为:

int i;
for (i = 1; i <= 1000; i++) 

#9


//我没读你的程序就修改了你的程序,一直修了2个小时,从中学到很多东西,特别是关于指针的运用,最后是得出了答案,2,4,7,9
不知道对不对,我使用pelles c 6.00编译.32位windows 2000.谢谢楼主.
#include <stdio.h>
#include <stdlib.h>
#define LISTSIZE 10
struct linklist
{
    int data;
    struct linklist *next;
};
struct linklist *initlist(void)
{
    int i;
    struct linklist *head,*s;
    head=NULL;
    for (i=0;i <LISTSIZE;i++)
    {
        s=(struct linklist *)malloc(sizeof(struct linklist));
        s->data=1;
        s->next=head;
        head=s;
    }

    for ( i=1 ; s; s = s->next,i++) { //初始化兔子洞号码,并将这些洞改成循环链表.
        s->data = i;
        printf("%d ", i);
        if (s->next == NULL) break;
    }
    s->next = head;  //首尾相接.
    printf("\n");
    return head;

}
//跳过指定数量的兔子洞.
struct linklist *skip(struct linklist *p, int q) { 
    p = p->next;
    for (; q!=0; q--) {
        //printf("skip %d\n", p->data);
        p = p->next;
    }
    return p;

}

void Rabbit(struct linklist *L)
{
    int i=1;
    int b=0;
    struct linklist *p, *it= NULL;
    p=L;

    while ( i <=1000)
    {
        printf("%d ", p->data&~0x80000000);
        p->data |= 0x80000000; //找到的置标志位.
        p = skip(p, i);

        i++;
    }
    p=L;
    printf("\nThe Rabbit mybe:");
    i = 10;
    while (i)
    {
        if (p->data>0) {
            printf(" %d.",p->data);
b = 1;
}
        p=p->next;
        i--;
    }
    if (b == 0) printf("Rabbit is not found!\n");

}
int main(int argc, char* argv[])
{
    struct linklist *L;
    L=initlist();
    Rabbit(L);

    return 0;
}

#10


如果是用单链表的话在跳过洞的时候做判断,如果到最后了就从头来.
再次感谢楼主对我的引导.谢谢.

#11


感觉 rabbit的算法有点问题,不是很明白。

#12


真丢人,我才发现三楼的大哥代码写得最简洁漂亮.
顶三楼!!!

#13


三楼用的是数组而不是单链表.如果不限定用单链表那么解空间就大多了.

#14


我也觉得数组算比较好一些,可是这是数据结构的一道作业题,老师的要求是用单链表,我也没有办法~~多谢你了~~

#15


调试了,但是总是会出现错误,提示程序必须关闭~~

#16


非常感谢你的程序。我对照着看了看。本来这个就是由一个线性表的改编过来的,所以开始的时候不会控制指针。看了你的程序收获很大。多谢~~