广告
淘宝内部优惠券
当前位置: 开发异常方案库» C/C++ » 求大佬帮我解释这段单链表代码,求求孩子吧,卡了三天了

求大佬帮我解释这段单链表代码,求求孩子吧,卡了三天了

开发异常方案库  收集整理于:2020-05-27 18:45:00  浏览:66次
#include <stdio.h> #include <stdlib.h> struct Book {     char title[128];     char author[40];     struct Book *next; }; void getInput(struct Book *book)   {     printf("请输入书名:");     scanf("%s", book->title);     printf("请输入作者:");     scanf("%s", book->author); } void addBook(struct Book **library)     //这里的参数是个二级指针,目的是为了修改指针的地址,但是这个函数里面只用到了一级指针,那为什么还要弄个二级指针作参数? {     struct Book *book, *temp;     book = (struct Book *)malloc(sizeof(struct Book));      //这里为什么用了malloc申请空间,目的是什么?不用有什么影响?     {         printf("内存分配失败了!\n");         exit(1);     }     getInput(book);        if (*library != NULL)     {         temp = *library;         *library = book;         book->next = temp;     }     else     {         *library = book;         book->next = NULL;     } } void printLibrary(struct Book *library) {     struct Book *book;     int count = 1;     book = library;     while (book != NULL)     {         printf("Book%d: ", count);         printf("书名:%s", book->title);         printf("作者:%s", book->author);         book = book->next;         count++;     } } void releaseLibrary(struct Book *library) {     while (library != NULL)     {         free(library);         library = library->next;     } } int main() {     struct Book *library = NULL;     int ch;     while (1)     {         printf("请问是否需要录入书籍信息(Y/N):");         do         {             ch = getchar();         } while (ch != 'Y' && ch != 'N');         if (ch == 'Y')         {             addBook(&library);               }         else         {             break;         }     }     printf("请问是否需要打印图书信息(Y/N):");     do     {         ch = getchar();     } while (ch != 'Y' && ch != 'N');     if (ch == 'Y')     {         printLibrary(library);        }     releaseLibrary(library);         return 0; }

------网友观点--------------------
题目是什么?有什么问题?

------网友观点--------------------
引用 1 楼 Tryagain2006 的回复:
题目是什么?有什么问题?
我都用红色字体标注了

------网友观点--------------------
void addBook(struct Book **library) //这里的参数是个二级指针,目的是为了修改指针的地址,但函数里面只用到了一级指针,那为什么还要弄个二级指针作参数? 这个问题是这样的。在 main 函数中 library 为指针,现在希望在子函数中 修改指针 library,所以子函数的参数就要使用二级指针。

------网友观点--------------------
book = (struct Book *) malloc(sizeof(struct Book)); //这里为什么用了malloc申请空间,目的是什么?不用有什么影响? book 是一个指向结构的指针,book要必须指向一个“实体”之后才能进行后续的操作,所以要为 book 分配一个空间,用来存储实际的数据。

------网友观点--------------------
引用 3 楼 Tryagain2006 的回复:
void addBook(struct Book **library) //这里的参数是个二级指针,目的是为了修改指针的地址,但函数里面只用到了一级指针,那为什么还要弄个二级指针作参数? 这个问题是这样的。在 main 函数中 library 为指针,现在希望在子函数中 修改指针 library,所以子函数的参数就要使用二级指针。
可是子函数中没有用到二级指针啊,全是一级指针

------网友观点--------------------
#include <stdio.h>
#include <stdlib.h>
struct Book
{
    char title[128];
    char author[40];
    struct Book *next;
};
void getInput(struct Book *book)
{
    printf("请输入书名:");
    scanf("%s", book->title);
    printf("请输入作者:");
    scanf("%s", book->author);
}
void addBook(struct Book **library)     //这里的参数是个二级指针,目的是为了修改指针的地址,但是这个函数里面只用到了一级指针,那为什么还要弄个二级指针作参数?
{
    struct Book *book, *temp;
    book = (struct Book *)malloc(sizeof(struct Book));      //这里为什么用了malloc申请空间,目的是什么?不用有什么影响?
    if (!book)  //不加这句是做啥,不想让程序运行了吗?
    {
        printf("内存分配失败了!\n");
        exit(1);
    }
    getInput(book);
    if (*library != NULL)
    {
        temp = *library;
        *library = book;
        book->next = temp;
    }
    else
    {
        *library = book;
        book->next = NULL;
    }
}
void printLibrary(struct Book *library)
{
    struct Book *book;
    int count = 1;
    book = library;
    while (book != NULL)
    {
        printf("Book%d: ", count);
        printf("书名:%s", book->title);
        printf("作者:%s", book->author);
        putchar(10);
        book = book->next;
        count++;
    }
}
//void releaseLibrary(struct Book *library)
void releaseLibrary(struct Book **library)
{
    struct Book *pcur = *library, *ptmp;
#if 0
    while (library != NULL)
    {
        free(library);
        library = library->next;
    }
#else
    while (pcur) {
        ptmp = pcur->next;
        free(pcur);
        pcur = ptmp;
    }
    *library = NULL;
#endif
}
int main()
{
    struct Book *library = NULL;
    int ch;
    while (1)
    {
        printf("请问是否需要录入书籍信息(Y/N):");
        do
        {
            ch = getchar();
            getchar();    //for '\n'
        } while (ch != 'Y' && ch != 'N');
        if (ch == 'Y')
        {
            addBook(&library);
            getchar();    //for '\n'
        }
        else
        {
            break;
        }
    }
    printf("请问是否需要打印图书信息(Y/N):");
    do
    {
        ch = getchar();
        getchar();    //for '\n'
    } while (ch != 'Y' && ch != 'N');
    if (ch == 'Y')
    {
        printLibrary(library);
    }
    releaseLibrary(&library);
    return 0;
}
供参考~ 注意getchar()和scanf("%c", xxx);比较特殊需要处理'\n' 建议对比代码找出自己的问题~

------网友观点--------------------
引用 5 楼 weixin_45906870 的回复:
Quote: 引用 3 楼 Tryagain2006 的回复:
void addBook(struct Book **library) //这里的参数是个二级指针,目的是为了修改指针的地址,但函数里面只用到了一级指针,那为什么还要弄个二级指针作参数? 这个问题是这样的。在 main 函数中 library 为指针,现在希望在子函数中 修改指针 library,所以子函数的参数就要使用二级指针。
可是子函数中没有用到二级指针啊,全是一级指针
呵呵,你的基本概念有问题。

------网友观点--------------------
引用 7 楼 Tryagain2006 的回复:
Quote: 引用 5 楼 weixin_45906870 的回复:
Quote: 引用 3 楼 Tryagain2006 的回复:
void addBook(struct Book **library) //这里的参数是个二级指针,目的是为了修改指针的地址,但函数里面只用到了一级指针,那为什么还要弄个二级指针作参数? 这个问题是这样的。在 main 函数中 library 为指针,现在希望在子函数中 修改指针 library,所以子函数的参数就要使用二级指针。
可是子函数中没有用到二级指针啊,全是一级指针
呵呵,你的基本概念有问题。
???

------网友观点--------------------
引用 6 楼 自信男孩 的回复:
#include <stdio.h>
#include <stdlib.h>
struct Book
{
    char title[128];
    char author[40];
    struct Book *next;
};
void getInput(struct Book *book)
{
    printf("请输入书名:");
    scanf("%s", book->title);
    printf("请输入作者:");
    scanf("%s", book->author);
}
void addBook(struct Book **library)     //这里的参数是个二级指针,目的是为了修改指针的地址,但是这个函数里面只用到了一级指针,那为什么还要弄个二级指针作参数?
{
    struct Book *book, *temp;
    book = (struct Book *)malloc(sizeof(struct Book));      //这里为什么用了malloc申请空间,目的是什么?不用有什么影响?
    if (!book)  //不加这句是做啥,不想让程序运行了吗?
    {
        printf("内存分配失败了!\n");
        exit(1);
    }
    getInput(book);
    if (*library != NULL)
    {
        temp = *library;
        *library = book;
        book->next = temp;
    }
    else
    {
        *library = book;
        book->next = NULL;
    }
}
void printLibrary(struct Book *library)
{
    struct Book *book;
    int count = 1;
    book = library;
    while (book != NULL)
    {
        printf("Book%d: ", count);
        printf("书名:%s", book->title);
        printf("作者:%s", book->author);
        putchar(10);
        book = book->next;
        count++;
    }
}
//void releaseLibrary(struct Book *library)
void releaseLibrary(struct Book **library)
{
    struct Book *pcur = *library, *ptmp;
#if 0
    while (library != NULL)
    {
        free(library);
        library = library->next;
    }
#else
    while (pcur) {
        ptmp = pcur->next;
        free(pcur);
        pcur = ptmp;
    }
    *library = NULL;
#endif
}
int main()
{
    struct Book *library = NULL;
    int ch;
    while (1)
    {
        printf("请问是否需要录入书籍信息(Y/N):");
        do
        {
            ch = getchar();
            getchar();    //for '\n'
        } while (ch != 'Y' && ch != 'N');
        if (ch == 'Y')
        {
            addBook(&library);
            getchar();    //for '\n'
        }
        else
        {
            break;
        }
    }
    printf("请问是否需要打印图书信息(Y/N):");
    do
    {
        ch = getchar();
        getchar();    //for '\n'
    } while (ch != 'Y' && ch != 'N');
    if (ch == 'Y')
    {
        printLibrary(library);
    }
    releaseLibrary(&library);
    return 0;
}
供参考~ 注意getchar()和scanf("%c", xxx);比较特殊需要处理'\n' 建议对比代码找出自己的问题~
感谢,不过那个二级指针的问题我还是不懂

------网友观点--------------------
addBook(&library);  这里传进去的是library的地址,是这个指针本身的地址,如果子函数里只用 一个*,那么得到的是这个指针的地址,而不是它指向结构体的地址,所以要用 **
发布此文章仅为传递网友分享,不代表本站观点,若侵权请联系我们删除,本站将不对此承担任何责任。
软件开发 程序错误 异常 ybaby.netCopyright © 2020-2026  ybaby 版权所有  桂ICP备17004385号-2 网站地图