鱼C论坛

 找回密码
 立即注册
查看: 1493|回复: 14

[已解决]单链表的这个代码错误在哪?

[复制链接]
发表于 2020-3-6 09:34:30 | 显示全部楼层 |阅读模式

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

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

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

void addBook(struct Book **library);
void getinput(struct Book *book);
void printfbook(struct Book *library);
void freelibrary(struct Book *book);
struct Book{
        char title[128];
        char author[40];
        struct Book *next;
};

void getinput(struct Book *book){
        printf("请输入书名[title]\n");
        scanf("%s",book->title);
        printf("请输入作者[author]\n");
        scanf("%s",book->author);
}

void addBook(struct Book **library){
        struct Book *book,*temp;
        book=NULL;
        temp=NULL;
        book=(struct Book*)malloc(sizeof(struct Book));
        if(book==NULL){
                printf("内存分配失败了");
                exit(1);
        }
        else{
                getinput(book);
        }
        if (*library != 0)                 
        {                                
                temp = *library;
                *library = book;
                book->next = temp;
        }
        else                           
        {
                *library = book;
                book->next = NULL;
        }
}

void printfbook(struct Book *library){
        struct Book *book;
        book=library;
        int i=1;
        while(book!=NULL){
        printf("您录入的第%d本书的书名是:%s\n",i,book->title);
        printf("您录入的第%d本书的作者是:%s\n",i,book->author);       
        i++;
        book=book->next;
        }
       
}

void freelibrary(struct Book *library){
        struct Book* temp;//temp跳出函数之后会自动释放,所以不用操心他的存在
        while(library!=NULL){
        temp=library->next;
        free(library);
        library=temp;
        }
}

int main(){
        struct Book *library=NULL;
        addBook(&library);
        char ans;


        while(1){
                printf("是否继续录入书本?Y/N\n");
                scanf("%s",&ans);
        if(ans=='Y'){
                printf("请继续录入书本信息\n");
                addBook(&library);
        }
        else{
        break;
        }
        }
       
        printf("是否打印目录?Y/N\n");
        scanf("%s",&ans);
                if(ans=='Y'){
                        printf("开始打印书目\n");
                        printfbook(library);
                }
                else{
                        printf("再见了您累");
                }
        freelibrary(library);
        return 0;
}



运行之后,打印的书名和作者会乱码。并显示单链表.EXE已停止工作。  麻烦帮我看看错误在哪,查了半天没看出来。
最佳答案
2020-3-6 15:06:41
main函数换成这个,除了排版一共改了4处地方,功能应该正常
  1. int main(void)
  2. {
  3.         struct Book *library = NULL;
  4.         addBook(&library);
  5.         char ans;


  6.         while(1)
  7.         {
  8.                 printf("是否继续录入书本?Y/N\n");
  9.                 getchar();           //加入这个回收enter键
  10.                 scanf("%c", &ans); //char类型,不是字符串,别用%s
  11.                
  12.                 if(ans == 'Y')
  13.                 {
  14.                                 printf("请继续录入书本信息\n");
  15.                         addBook(&library);
  16.                 }
  17.                 else
  18.                 {
  19.                         break;
  20.                 }
  21.         }
  22.         
  23.         printf("是否打印目录?Y/N\n");
  24.         
  25.         getchar();           //加入这个回收enter键
  26.         scanf("%c", &ans); //一样的,char类型
  27.         
  28.         if(ans=='Y')
  29.         {
  30.                 printf("开始打印书目\n");
  31.                 printfbook(library);
  32.         }
  33.         else
  34.         {
  35.                 printf("再见了您累");
  36.         }
  37.         
  38.         freelibrary(library);
  39.         
  40.         return 0;
  41. }
复制代码




小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-6 09:56:49 | 显示全部楼层
不要把结构体变量和结构体指针定义在函数里,要么放在main里,要么
放在结构体定义的地方
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 13:05:55 | 显示全部楼层
qiuyouzhi 发表于 2020-3-6 09:56
不要把结构体变量和结构体指针定义在函数里,要么放在main里,要么
放在结构体定义的地方

不好意思,还是不太明白?能稍微具体点吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 13:06:52 | 显示全部楼层
召唤师 发表于 2020-3-6 13:05
不好意思,还是不太明白?能稍微具体点吗?


你不是在函数里写了一堆struct什么的吗?
把他们放到结构体定义的地方
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 13:18:17 | 显示全部楼层
qiuyouzhi 发表于 2020-3-6 13:06
你不是在函数里写了一堆struct什么的吗?
把他们放到结构体定义的地方

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

void addBook(struct Book **library);
void getinput(struct Book *book);
void printfbook(struct Book *library);
void freelibrary(struct Book *book);
struct Book{
        char title[128];
        char author[40];
        struct Book *next;
}*book,*temp;

void getinput(struct Book *book){
        printf("请输入书名[title]\n");
        scanf("%s",book->title);
        printf("请输入作者[author]\n");
        scanf("%s",book->author);
}

void addBook(struct Book **library){
        //struct Book *book,*temp;
        book=NULL;
        temp=NULL;
        book=(struct Book*)malloc(sizeof(struct Book));
        if(book==NULL){
                printf("内存分配失败了");
                exit(1);
        }
        else{
                getinput(book);
        }
        if (*library != 0)                 
        {                                
                temp = *library;
                *library = book;
                book->next = temp;
        }
        else                           
        {
                *library = book;
                book->next = NULL;
        }
}

void printfbook(struct Book *library){
//        struct Book *book;
        book=library;
        int i=1;
        while(book!=NULL){
        printf("您录入的第%d本书的书名是:%s\n",i,book->title);
        printf("您录入的第%d本书的作者是:%s\n",i,book->author);       
        i++;
        book=book->next;
        }
       
}

void freelibrary(struct Book *library){
        //struct Book* temp;//temp跳出函数之后会自动释放,所以不用操心他的存在
        while(library!=NULL){
        temp=library->next;
        free(library);
        library=temp;
        }
}

int main(){
        struct Book *library=NULL;
        addBook(&library);
        char ans;


        while(1){
                printf("是否继续录入书本?Y/N\n");
                scanf("%s",&ans);
        if(ans=='Y'){
                printf("请继续录入书本信息\n");
                addBook(&library);
                    }
        else{
             break;
             }
        }
       
        printf("是否打印目录?Y/N\n");
        scanf("%s",&ans);
                if(ans=='Y'){
                        printf("开始打印书目\n");
                        printfbook(library);
                }
                else{
                        printf("再见了您勒");
                }
        freelibrary(library);
        return 0;
}

这样也不行好像。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 13:28:35 | 显示全部楼层
召唤师 发表于 2020-3-6 13:18
#include
#include
# include

哪有把声明写在结构体定义前面的。。。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. # include <malloc.h>

  4. struct Book{
  5.          char title[128];
  6.          char author[40];
  7.          struct Book *next;
  8. }*book,*temp;
  9.   void addBook(struct Book **library);
  10. void getinput(struct Book *book);
  11. void printfbook(struct Book *library);
  12. void freelibrary(struct Book *book);

  13. void getinput(struct Book *book){
  14.          printf("请输入书名[title]\n");
  15.          scanf("%s",book->title);
  16.          printf("请输入作者[author]\n");
  17.          scanf("%s",book->author);
  18. }

  19. void addBook(struct Book **library){
  20.          //struct Book *book,*temp;
  21.          book=NULL;
  22.          temp=NULL;
  23.          book=(struct Book*)malloc(sizeof(struct Book));
  24.          if(book==NULL){
  25.                  printf("内存分配失败了");
  26.                  exit(1);
  27.          }
  28.          else{
  29.                  getinput(book);
  30.          }
  31.          if (*library != 0)                 
  32.          {                                
  33.                  temp = *library;
  34.                  *library = book;
  35.                  book->next = temp;
  36.          }
  37.          else                           
  38.          {
  39.                  *library = book;
  40.                  book->next = NULL;
  41.          }
  42. }

  43. void printfbook(struct Book *library){
  44. //        struct Book *book;
  45.          book=library;
  46.          int i=1;
  47.          while(book!=NULL){
  48.          printf("您录入的第%d本书的书名是:%s\n",i,book->title);
  49.          printf("您录入的第%d本书的作者是:%s\n",i,book->author);        
  50.          i++;
  51.          book=book->next;
  52.          }
  53.          
  54. }

  55. void freelibrary(struct Book *library){
  56.          //struct Book* temp;//temp跳出函数之后会自动释放,所以不用操心他的存在
  57.         while(library!=NULL){
  58.          temp=library->next;
  59.          free(library);
  60.          library=temp;
  61.          }
  62. }

  63. int main(){
  64.          struct Book *library=NULL;
  65.          addBook(&library);
  66.          char ans;


  67.          while(1){
  68.                  printf("是否继续录入书本?Y/N\n");
  69.                  scanf("%s",&ans);
  70.          if(ans=='Y'){
  71.                  printf("请继续录入书本信息\n");
  72.                  addBook(&library);
  73.                      }
  74.          else{
  75.               break;
  76.               }
  77.          }
  78.          
  79.          printf("是否打印目录?Y/N\n");
  80.          scanf("%s",&ans);
  81.                  if(ans=='Y'){
  82.                          printf("开始打印书目\n");
  83.                          printfbook(library);
  84.                  }
  85.                  else{
  86.                          printf("再见了您勒");
  87.                  }
  88.          freelibrary(library);
  89.          return 0;
  90. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 13:58:37 | 显示全部楼层
qiuyouzhi 发表于 2020-3-6 13:28
哪有把声明写在结构体定义前面的。。。

你说的这个我知道了,但是还是不行……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 13:59:27 | 显示全部楼层
召唤师 发表于 2020-3-6 13:58
你说的这个我知道了,但是还是不行……

可我这里编译过了啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 14:18:50 | 显示全部楼层
qiuyouzhi 发表于 2020-3-6 13:59
可我这里编译过了啊

编译完 输入两本书的内容,打印一下可以吗?我编译可以啊,运行不行啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 15:06:41 | 显示全部楼层    本楼为最佳答案   
main函数换成这个,除了排版一共改了4处地方,功能应该正常
  1. int main(void)
  2. {
  3.         struct Book *library = NULL;
  4.         addBook(&library);
  5.         char ans;


  6.         while(1)
  7.         {
  8.                 printf("是否继续录入书本?Y/N\n");
  9.                 getchar();           //加入这个回收enter键
  10.                 scanf("%c", &ans); //char类型,不是字符串,别用%s
  11.                
  12.                 if(ans == 'Y')
  13.                 {
  14.                                 printf("请继续录入书本信息\n");
  15.                         addBook(&library);
  16.                 }
  17.                 else
  18.                 {
  19.                         break;
  20.                 }
  21.         }
  22.         
  23.         printf("是否打印目录?Y/N\n");
  24.         
  25.         getchar();           //加入这个回收enter键
  26.         scanf("%c", &ans); //一样的,char类型
  27.         
  28.         if(ans=='Y')
  29.         {
  30.                 printf("开始打印书目\n");
  31.                 printfbook(library);
  32.         }
  33.         else
  34.         {
  35.                 printf("再见了您累");
  36.         }
  37.         
  38.         freelibrary(library);
  39.         
  40.         return 0;
  41. }
复制代码




小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 15:26:10 | 显示全部楼层
jzzc 发表于 2020-3-6 15:06
main函数换成这个,除了排版一共改了4处地方,功能应该正常

大哥,终于可以了,没想到啊。我排查了快一天了。谢啦。为什么不用getchar会出现这样的差异?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 15:32:54 | 显示全部楼层
召唤师 发表于 2020-3-6 15:26
大哥,终于可以了,没想到啊。我排查了快一天了。谢啦。为什么不用getchar会出现这样的差异?

导致出现exe停止应该是因为%c写成了%s,和getchar()应该没有关系,加getchar()是因为在输入完作者的信息后摁了回车,这导致scanf读取到了回车直接break了,所以加一个getchar()把这个回车给消灭掉,不让他影响我们的代码逻辑
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-6 15:48:27 | 显示全部楼层
jzzc 发表于 2020-3-6 15:32
导致出现exe停止应该是因为%c写成了%s,和getchar()应该没有关系,加getchar()是因为在输入完作者的信息 ...

有影响,不过我明白了,谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-6 15:52:09 | 显示全部楼层
召唤师 发表于 2020-3-6 15:48
有影响,不过我明白了,谢谢!

嗯嗯
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-2 05:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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