鱼C论坛

 找回密码
 立即注册
查看: 2147|回复: 5

本人写的程序,搜索时错误识别不了,找了很久没找到问题所在,是编译器问题吗,求...

[复制链接]
发表于 2019-9-4 01:50:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<stdlib.h>
struct DATE
{
int year;
int math;
int day;
};
struct BOOK
{
  char title[128];
  char author[40];
  float price;
  struct DATE data;
  char pulic[40];
  struct BOOK* next;

};
void  luru(struct BOOK* x)
{
static int count=0;
count++;

for(int i=1;i<count;i++)
{ x=x->next;}

printf("请输入主题: ");
scanf("%s",x->title);
printf("请输入作者:");
scanf("%s",x->author);
printf("请输入价格: ");
scanf("%f",&x->price);
printf("请输入日期如(2017 3 14):");
scanf("%d%d%d",&x->data.year,&(x->data.math),&(x->data.day));
printf("请输入出版社:");
scanf("%s",x->pulic);
//return x;
}
void daying(struct BOOK* x)
{
while(x!=NULL)
{
printf("主题:%s\n ",x->title);
printf("作者:%s\n ",x->author);
printf("价格:%. 2f\n",x->price);
printf("日期:%d-%d-%d\n ",x->data.year,x->data.math,x->data.day);

printf("出版社:%s\n ",x->pulic);
x=x->next;
}

}

/*struct BOOK* addhead(struct BOOK** p)
{
   struct BOOK* team;
   struct BOOK* book=NULL;
   book=(struct BOOK*)malloc(sizeof(struct BOOK));
  if(book==NULL)
  {
   printf("申请内存失败");
   exit(EXIT_SUCCESS);
  }
else
  {
     team=*p;
  *p=book;
     book->next=team;
  }
  return *p;
}*/
struct BOOK* addlow(struct BOOK** p)
{
   static struct BOOK* team;
   struct BOOK* book=NULL;
   book=(struct BOOK*)malloc(sizeof(struct BOOK));
  if(book==NULL)
  {
   printf("申请内存失败");
   exit(EXIT_SUCCESS);
  }
else
  {
     if(*p==NULL)
     {
       *p=book;
       book->next=NULL;
     }
else
{
  team->next=book;
  book->next=NULL;
}
team=book;
  }
  return *p;
}

void rest(struct BOOK*p)
{
  struct BOOK* am;
while(p!=NULL)
{
   am=p;
p=p->next;
   free(am);
}
}

struct BOOK*sousuo(struct BOOK*p,char*c)
{
while(1)
{
  if((!strcmp(c,p->title))||(!strcmp(c,p->author)))
   {
   return p;
   }
  if(p==NULL)
  {
  return p;
  }
  p=p->next;
}
}
void sousuoresoult(struct BOOK*x,char*c)
{
   if(x!=NULL)
{
  do
  {
    printf("主题:%s\n ",x->title);
printf("作者:%s\n ",x->author);
printf("价格:%. 2f\n",x->price);
    printf("日期:%d-%d-%d\n ",x->data.year,x->data.math,x->data.day);
    printf("出版社:%s\n ",x->pulic);
x=x->next;
  }while(sousuo(x,c)!=NULL);
}
else
{
   printf("搜索失败\n");
}
}



int main()
{
char ch,shu[80];
struct BOOK*p=NULL;
struct BOOK* dg;
while(1)
{
     do
     {
        printf("是否录入书籍(Y/N):");
       }while((ch=getchar())!='y'&&ch!='n');
    p=addlow(&p);
     luru(p);
   getchar();
      do
     {
       printf("是否录入完毕(Y/N):");
     }while((ch=getchar())!='y'&&ch!='n');
if(ch=='y')
{
break;
}      
getchar();
}
daying(p);
printf("请输入你想搜索的书如(作者/书名):");
scanf("%s",shu);
dg=sousuo(p,shu);
sousuoresoult(dg,shu);

rest(p);
return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-4 11:18:01 | 显示全部楼层
本帖最后由 superbe 于 2019-9-4 11:24 编辑

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct DATE
{
        int year;
        int math;
        int day;
};

struct BOOK
{
        char title[128];
        char author[40];
        float price;
        struct DATE data;
        char pulic[40];
        struct BOOK* next;
};

void  luru(struct BOOK* x)
{
        static int count=0;
        count++;
        for(int i=1;i<count;i++)
        {
                x=x->next;
        }

        printf("请输入主题: ");
        scanf("%s",x->title);
        printf("请输入作者:");
        scanf("%s",x->author);
        printf("请输入价格: ");
        scanf("%f",&x->price);
        printf("请输入日期如(2017 3 14):");
        scanf("%d%d%d",&x->data.year,&(x->data.math),&(x->data.day));
        printf("请输入出版社:");
        scanf("%s",x->pulic);
        //return x;
}

void daying(struct BOOK* x)
{
        while(x!=NULL)
        {
                printf("主题:%s\n ",x->title);
                printf("作者:%s\n ",x->author);
                printf("价格:%.2f\n",x->price);        //去掉了%. 2f中间的空格
                printf("日期:%d-%d-%d\n ",x->data.year,x->data.math,x->data.day);
                printf("出版社:%s\n ",x->pulic);
                x=x->next;
        }
}

/*struct BOOK* addhead(struct BOOK** p)
{
        struct BOOK* team;
        struct BOOK* book=NULL;
        book=(struct BOOK*)malloc(sizeof(struct BOOK));
        if(book==NULL)
        {
                printf("申请内存失败");
                exit(EXIT_SUCCESS);
        }
        else
        {
                team=*p;
                *p=book;
                book->next=team;
        }
        return *p;
}*/

struct BOOK* addlow(struct BOOK** p)
{
        static struct BOOK* team;
        struct BOOK* book=NULL;
        book=(struct BOOK*)malloc(sizeof(struct BOOK));
        if(book==NULL)
        {
                printf("申请内存失败");
                exit(EXIT_SUCCESS);
        }
        else
        {
                if(*p==NULL)
                {
                        *p=book;
                        book->next=NULL;
                }
                else
                {
                        team->next=book;
                        book->next=NULL;
                }
                team=book;
        }
        return *p;
}

void rest(struct BOOK*p)
{
        struct BOOK* am;
        while(p!=NULL)
        {
                am=p;
                p=p->next;
                free(am);
        }
}

struct BOOK* sousuo(struct BOOK *p,char *c)
{
        while(1)
        {
                if(p==NULL)                //两个if块交换了位置
                {
                        return p;
                }
                if((!strcmp(c,p->title))||(!strcmp(c,p->author)))
                {
                        return p;
                }
                p=p->next;
        }
}

void sousuoresoult(struct BOOK *x,char *c)
{
        if(x!=NULL)
        {
                do
                {
                        printf("主题:%s\n ",x->title);
                        printf("作者:%s\n ",x->author);
                        printf("价格:%.2f\n",x->price);        //去掉了%. 2f中间的空格
                        printf("日期:%d-%d-%d\n ",x->data.year,x->data.math,x->data.day);
                        printf("出版社:%s\n ",x->pulic);
                        x=x->next;
                }while((x=sousuo(x,c))!=NULL);        //原来是while(sousuo(x,c)!=NULL);
        }
        else
        {
                printf("搜索失败\n");
        }
}

int main()
{
        char ch,shu[80];
        struct BOOK*p=NULL;
        struct BOOK* dg;
        while(1)
        {
                do
                {
                        printf("是否录入书籍(Y/N):");
                }while((ch=getchar())!='y'&&ch!='n');
                p=addlow(&p);
                luru(p);
                getchar();
                do
                {
                        printf("是否录入完毕(Y/N):");
                }while((ch=getchar())!='y'&&ch!='n');
                if(ch=='y')
                {
                        break;
                }      
                getchar();
        }
        daying(p);
        printf("请输入你想搜索的书如(作者/书名):");
        scanf("%s",shu);
        dg=sousuo(p,shu);
        sousuoresoult(dg,shu);

        rest(p);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-4 12:46:29 | 显示全部楼层
superbe 发表于 2019-9-4 11:18
#include
#include
#include

谢谢大哥

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-4 13:20:13 | 显示全部楼层
superbe 发表于 2019-9-4 11:18
#include
#include
#include

为什么要把两个if 调换位置呢,有什么不同吗,求大神指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-4 13:39:05 | 显示全部楼层
本帖最后由 superbe 于 2019-9-4 13:42 编辑

如果不交换位置,你只输一本书试下就会出错...
因为sousuoresoult里执行x=x->next后x=NULL,然后再执while()里的sousuo(x,c),这行if((!strcmp(c,p->title))||(!strcmp(c,p->author)))就会出错(p=NULL)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-4 16:19:35 | 显示全部楼层
superbe 发表于 2019-9-4 13:39
如果不交换位置,你只输一本书试下就会出错...
因为sousuoresoult里执行x=x->next后x=NULL,然后再执while ...

谢谢大哥,明白了,我只考虑了条件不足是不不会执行if,没考虑到当p==NULL时,是不能执行p->... 。谢谢啦?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-20 23:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表