初学者求教,请问这个代码错在哪

小白爱编程 2019-03-26 08:33:24
#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 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 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兔子可能藏在如下的洞中:") ; for(i=0;i<n;i++) if(p->store_num==1) printf(" \n此洞是第%d号洞 !",i+1); //输出未进过的洞号 return OK; } void main(){ ElemType n,k; SqList *L = NULL; printf("请依次输入洞穴数量和寻找次数:\n"); scanf("%d\n%d\n",&n,&k); L=InitList_Sq(L,n); Rabbit(L,k,n); }
...全文
215 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiamianshiye 2019-03-29
  • 打赏
  • 举报
回复
结果正确的话就可以结贴了。
小白爱编程 2019-03-28
  • 打赏
  • 举报
回复
引用 6 楼 jiamianshiye_16_com的回复:
我运行改过后的代码是正常的。运行环境Ubuntu14, gcc4.8.4

#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);
}
                                   
谢谢老哥
jiamianshiye 2019-03-27
  • 打赏
  • 举报
回复
我运行改过后的代码是正常的。运行环境Ubuntu14, gcc4.8.4

#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);
}
                                   
jiamianshiye 2019-03-26
  • 打赏
  • 举报
回复
你在最终输出结果时需要将所有的兔子洞状态都遍历一次,所以修改如下:
    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         }
小白爱编程 2019-03-26
  • 打赏
  • 举报
回复
引用 3 楼 jiamianshiye_16_com的回复:
老弟,贴出你的题目以及运行结果。然后贴出来你的期望运行结果。
这个就是典型的狐狸逮兔子
小白爱编程 2019-03-26
  • 打赏
  • 举报
回复
老哥,我现在在外面,晚上发,多谢大哥
jiamianshiye 2019-03-26
  • 打赏
  • 举报
回复
老弟,贴出你的题目以及运行结果。然后贴出来你的期望运行结果。
小白爱编程 2019-03-26
  • 打赏
  • 举报
回复
引用 1 楼 jiamianshiye_16_com的回复:
你在最终输出结果时需要将所有的兔子洞状态都遍历一次,所以修改如下:
    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         }
大哥,改过后还是不行

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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