为什么得不到正确结果?

haitanshangdeyu 2009-06-07 09:20:49
编写了个程序,用单链表解决以下问题:围绕着山顶有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);
}
程序编译和连接均通过,但是运行的时候没有反应,只显示一句“兔子可能藏身在如下洞中:”然后就停止了。为什么啊?高手指点一二~~
...全文
82 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
haitanshangdeyu 2009-06-09
  • 打赏
  • 举报
回复
非常感谢你的程序。我对照着看了看。本来这个就是由一个线性表的改编过来的,所以开始的时候不会控制指针。看了你的程序收获很大。多谢~~
haitanshangdeyu 2009-06-09
  • 打赏
  • 举报
回复
调试了,但是总是会出现错误,提示程序必须关闭~~
haitanshangdeyu 2009-06-09
  • 打赏
  • 举报
回复
我也觉得数组算比较好一些,可是这是数据结构的一道作业题,老师的要求是用单链表,我也没有办法~~多谢你了~~
logiciel 2009-06-08
  • 打赏
  • 举报
回复
三楼用的是数组而不是单链表.如果不限定用单链表那么解空间就大多了.
ylbhz 2009-06-07
  • 打赏
  • 举报
回复
/*################################################################################################################################################################################
狐狸要吃兔子,兔子说:“可以,但是必须找到我。我就藏身在这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
ljhhh0123 2009-06-07
  • 打赏
  • 举报
回复
真丢人,我才发现三楼的大哥代码写得最简洁漂亮.
顶三楼!!!
Nio96 2009-06-07
  • 打赏
  • 举报
回复
感觉 rabbit的算法有点问题,不是很明白。
ljhhh0123 2009-06-07
  • 打赏
  • 举报
回复
如果是用单链表的话在跳过洞的时候做判断,如果到最后了就从头来.
再次感谢楼主对我的引导.谢谢.
ljhhh0123 2009-06-07
  • 打赏
  • 举报
回复
//我没读你的程序就修改了你的程序,一直修了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;
}

cxcco1986 2009-06-07
  • 打赏
  • 举报
回复
if(p->next!=NULL)
{
if(p->data==1)
printf("此洞是第%d号洞",p->data);
p=p->next;
}

这句该用一个循环吧?
haitanshangdeyu 2009-06-07
  • 打赏
  • 举报
回复
怎么没人响应?自己顶一个~~
logiciel 2009-06-07
  • 打赏
  • 举报
回复
函数Rabbit中有2句应改为:

int i;
for (i = 1; i <= 1000; i++)
logiciel 2009-06-07
  • 打赏
  • 举报
回复
/*
原程序的主要错误是:
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);
}
allen1986 2009-06-07
  • 打赏
  • 举报
回复
不知道你调试程序了没
haitanshangdeyu 2009-06-07
  • 打赏
  • 举报
回复
我把循环问题改正了,但是还是不行,程序仍旧会出错,但是错不在编译连接,不知道到底怎么回事~~改过的代码:
#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);
}
woods2001 2009-06-07
  • 打赏
  • 举报
回复
顶一个吧~~

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧