鱼C论坛

 找回密码
 立即注册
查看: 2027|回复: 1

[已解决]链表问题

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

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

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

x
本帖最后由 我叫MD 于 2019-4-6 19:47 编辑

本人今天刚刚学到小甲鱼课程的第45讲(链表1)
下面是小甲鱼的代码(代码比较多,还望多多见谅),运行没问题

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. //定义一个结构体 (单链表的声明)
  4. struct Book                                    
  5. {
  6.         char title[128];
  7.         char author[128];
  8.         struct Book *next;
  9. };

  10. //录入信息(填充书名)
  11. void getInput(struct Book *book)
  12. {
  13.         printf("请输入书名:");
  14.         scanf("%s",book->title);
  15.         printf("请输入作者:");
  16.         scanf("%s",book->author);
  17. }

  18. void addBook(struct Book **library)
  19. {
  20.         struct Book *book,*temp;
  21.        
  22.         book = (struct Book*)malloc(sizeof(struct Book));
  23.         if(book == NULL)
  24.         {
  25.                 printf("内存空间分配失败\n");
  26.                 exit(1);
  27.         }
  28.        
  29.         getInput(book);
  30.        
  31.         if(*library != NULL)
  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. //打印书籍
  44. void printlibrary(struct Book *library)
  45. {
  46.         struct Book *book;
  47.         int count = 1;
  48.        
  49.         book = library;
  50.         while(book != NULL)
  51.         {
  52.                 printf("第%d本书\n",count);
  53.                 printf("书名:%s\n",book->title );
  54.                 printf("作者:%s\n",book->author );
  55.                 book = book->next;
  56.                 count++;  
  57.         }
  58. }

  59. //释放addBook函数中结构体指针(book)申请的内存空间
  60. void releaselibrary(struct         Book *library)
  61. {
  62.         struct Book *temp;
  63.         while(library != NULL)
  64.         {
  65.                 temp = library;
  66.                 library = library->next;
  67.                 free(temp);
  68.         }
  69. }


  70. int main()
  71. {
  72.         struct Book *library = NULL;
  73.        
  74.         //录入3本书的信息
  75.         for(int i = 1; i <= 3; i++)
  76.         {
  77.                 addBook(&library);
  78.         }
  79.        
  80.         printlibrary(library);
  81.         releaselibrary(library);
  82.        
  83.         return 0;
  84. }
复制代码



然后是我的代码
我的代码是把addBook函数的参数修改了一下,由
  1. void addBook(struct Book **library)
复制代码

这样变成了
  1. void addBook(struct Book *library)
复制代码


然后下面由
  1.         if(*library != NULL)
  2.         {
  3.                 temp = *library;
  4.                 *library = book;
  5.                 book->next = temp;
  6.         }
  7.         else
  8.         {
  9.                 *library = book;
  10.                 book->next = NULL;
  11.         }
复制代码

这样变成了
  1.         if(library != NULL)
  2.         {
  3.                 temp = library;
  4.                 library = book;
  5.                 book->next = temp;
  6.         }
  7.         else
  8.         {
  9.                 library = book;
  10.                 book->next = NULL;
  11.         }
复制代码


然后main函数中传入对应的参数,其他完全一样,我写的这个就不打印,希望大神给解释一下
最佳答案
2019-4-6 19:56:53
本帖最后由 jackz007 于 2019-4-6 20:10 编辑

      原程序传入参数是指向指针的指针,意图是有可能修改这个值
  1. void addBook(struct Book **library)
  2. . . . . . .
  3.                *library = book ;    // 修改指针 library 指向地址的内容,其实就是修改 main() 中的指针 library 的值。
  4. . . . . . .
  5. int main()
  6. . . . . . .
  7.                 addBook(&library);  // 以指针 library 的地址为参数调用函数意图是有可能在函数中修改指针 library 的值
复制代码

      楼主修改成指针,使这种可能不再存在。
  1. void addBook(struct Book *library)
  2. . . . . . .
  3.                 library = book;  // 修改指针 library 本身的值,不会把影响传递回 main() 函数。
复制代码

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

使用道具 举报

发表于 2019-4-6 19:56:53 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-4-6 20:10 编辑

      原程序传入参数是指向指针的指针,意图是有可能修改这个值
  1. void addBook(struct Book **library)
  2. . . . . . .
  3.                *library = book ;    // 修改指针 library 指向地址的内容,其实就是修改 main() 中的指针 library 的值。
  4. . . . . . .
  5. int main()
  6. . . . . . .
  7.                 addBook(&library);  // 以指针 library 的地址为参数调用函数意图是有可能在函数中修改指针 library 的值
复制代码

      楼主修改成指针,使这种可能不再存在。
  1. void addBook(struct Book *library)
  2. . . . . . .
  3.                 library = book;  // 修改指针 library 本身的值,不会把影响传递回 main() 函数。
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
AniYPc421 + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 06:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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