鱼C论坛

 找回密码
 立即注册
查看: 1175|回复: 6

[已解决]第45节课课堂程序

[复制链接]
发表于 2021-3-20 21:05:16 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 HZX0229 于 2021-3-20 21:18 编辑

大佬们帮忙看看有啥问题?
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. struct Book{
  4.     char title[128];
  5.     char author[40];
  6.     struct Book *next;
  7. };
  8. void addbook(struct Book **);
  9. //void Getinput(struct Book *);
  10. void printbook(struct Book *);
  11. void releaselibrary(struct Book *);



  12. void addbook(struct Book **library)
  13. {
  14.     struct Book *book, *temp;

  15.     book = (struct Book *)malloc(sizeof(struct Book));

  16.     if (book = NULL)
  17.     {
  18.         printf("内存分配错误!\n");
  19.         exit(1);
  20.     }

  21.     printf("请输入书名:");
  22.     scanf("%s", book->title);
  23.     printf("请输入作者:");
  24.     scanf("%s", book->author);

  25.     if (*library != NULL)
  26.     {
  27.         temp = *library;
  28.         *library = book;
  29.         book->next = temp;
  30.     }
  31.     else{
  32.         *library = book;
  33.         book->next = NULL;
  34.     }
  35. }

  36. void printbook(struct Book *library)
  37. {
  38.     struct Book *book;
  39.     int count = 1;

  40.     book = library;
  41.     while (book != NULL)
  42.     {
  43.         printf("BOOK%d\n", count++);
  44.         printf("书名:%s\n", book->title);
  45.         printf("作者:%s\n", book->author);
  46.         book = book->next;
  47.     }

  48. }

  49. void releaselibrary(struct Book *library)
  50. {
  51.     struct Book *book;

  52.     while (library != NULL)
  53.     {
  54.         book = library;
  55.         library = library->next;
  56.         free(book);
  57.     }
  58. }


  59. int main()
  60. {
  61.     struct Book *library = NULL;
  62.     int ch;

  63.     while (1)
  64.     {
  65.         printf("请问是否需要录入书籍(Y/N):");
  66.         do {
  67.             ch = getchar();
  68.         }while (ch != 'Y' && ch != 'N');

  69.         if (ch == 'Y')
  70.         {
  71.             addbook(&library);
  72.         }
  73.         else{
  74.             break;
  75.         }
  76.     }

  77.     printf("请问是否需要打印图书信息(Y/N):");
  78.     do{
  79.         ch = getchar();

  80.     }while (ch != 'Y' && ch != 'N');

  81.     if (ch == 'Y')
  82.     {
  83.         printbook(library);
  84.     }

  85.     releaselibrary(library);

  86.     return 0;
  87. }
复制代码


第45节课,课堂程序,

能编译成功,但是输入第一个书名后直接退出了
最佳答案
2021-3-21 09:36:00
void addbook(struct Book **library)
{
    struct Book *book, *temp;

    book = (struct Book *)malloc(sizeof(struct Book));

    if (book = NULL)               这个赋值符号 改成 关系符号看看
    {
        printf("内存分配错误!\n");
        exit(1);
    }
屏幕截图(1).png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-20 22:26:47 | 显示全部楼层
本帖最后由 shiwobuhaoma 于 2021-3-20 22:29 编辑
  1. void printbook(struct Book *library)
  2. {
  3.     struct Book *book;
  4.     int count = 1;

  5.     book = library;
  6.     while (*book != NULL)// book 如果不带*,代表的是book指针的地址,所以要带*,意思是取book指针指向的变量里面的值
  7.     {
  8.         printf("BOOK%d\n", count++);
  9.         printf("书名:%s\n", book->title);
  10.         printf("作者:%s\n", book->author);
  11.         book = book->next;
  12.     }

  13. }

  14. void releaselibrary(struct Book **library)//这里二级指针指向一级指针*library的地址
  15. {
  16.     struct Book *book;

  17.     while (*library != NULL)//同上,这里要带*,*library是一级指针,代表main函数中的library
  18.     {
  19.         book = *library;
  20.         *library = (*library)->next;
  21.         free(book);
  22.     }
  23. }

  24. releaselibrary(&library);//这里传链表的地址,因为*library是一级指针,传一级指针的地址,所以函数定义的时候,参数要用一个二级指针接收
复制代码


注意:结果我没验证,你可以试试。替我验证一下,记得回复!我也是现学现卖。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-20 22:58:01 | 显示全部楼层
shiwobuhaoma 发表于 2021-3-20 22:26
注意:结果我没验证,你可以试试。替我验证一下,记得回复!我也是现学现卖。

book,本身是个变量,book就表示一个四字节的地址,*book就表示地址里面的值,NULL是指针的宏定义,只能作用于指针,所以不加*。
**library代表main中library指针的的地址,形参中*library 和 main中library表示的是同一个地址,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-20 23:20:14 | 显示全部楼层
本帖最后由 shiwobuhaoma 于 2021-3-20 23:24 编辑
HZX0229 发表于 2021-3-20 22:58
book,本身是个变量,book就表示一个四字节的地址,*book就表示地址里面的值,NULL是指针的宏定义,只能 ...


struct Book *book;
book = library;
让book指针指向library(library是一级指针,指向链表的头结点),所以book也是指向链表头结点的指针

while(*book != NULL)//意思是判断,头结点是否为空,book指针指向的地址里面的值是否为空



while(book != NULL)//意思是判断,book指针变量,自己在内存中的地址,是否为空


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

使用道具 举报

 楼主| 发表于 2021-3-21 08:18:07 | 显示全部楼层
shiwobuhaoma 发表于 2021-3-20 23:20
struct Book *book;
book = library;
让book指针指向library(library是一级指针,指向链表的头结 ...

详情见NULL指针,在二十几章,NULL是一个指针的宏定义,作用于变量是会报错的,
而且这里用*book 也不知道表示的是啥,要么(*book).title,要么(*book).author, 单写*book, 目前没见过
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-21 09:36:00 | 显示全部楼层    本楼为最佳答案   
void addbook(struct Book **library)
{
    struct Book *book, *temp;

    book = (struct Book *)malloc(sizeof(struct Book));

    if (book = NULL)               这个赋值符号 改成 关系符号看看
    {
        printf("内存分配错误!\n");
        exit(1);
    }
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-21 16:35:10 | 显示全部楼层
HZX0229 发表于 2021-3-21 08:18
详情见NULL指针,在二十几章,NULL是一个指针的宏定义,作用于变量是会报错的,
而且这里用*book 也不知 ...

指针这块我还要再去学学
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 22:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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