小甲鱼单链表一

构建一个简略的图书馆系统,添加图书并,输出图书表
首先说一下指针
addbook指针中的二阶指针原因:我们要把指针的地址传过去,才能通过通过函数改变指针的指向,因为函数的值传递原因(个人其他博客里面有解释)。
其次releasebook函数为什么也用二阶函数,因为malloc函数,和free函数申请和释放空间都要通过地址,所以在你通过调用函数来申请和释放空间时要调用指针的地址,所以要用二阶函数。
关于理解addbook函数中的二阶指针对应关系,下图应该会给你灵感:
小甲鱼单链表一_第1张图片

下面是代码,当然和视频中的不太一样,因为这是我在看过视频之后自己写的。

#include
#include
#include
struct library
{
    char bookname[500];
    char author[500];
    struct library* next;
};
void addbook(struct library** first);
void printbook(struct library* first);
void releasespace(struct library** first);

int main()
{
    struct library* first = NULL;//注意对指针初始化。
    /*我当时就是忘了,找了好久,顺便提一下,vs2010,的运行错误提示还是很有用的*/
    char ch;
    while (1)
    {
        printf("请问是否需要添加图书信息:(Y/N)");//思考一下为什么这一行代码不能放在do里面。
        do
        {
            scanf("%c", &ch);//scanf输入单个字符时还是会吸收回车,和空格的(我吐了)
           /*但是为什么没影响呢,下面会说的*/
        } while (ch != 'Y' && ch != 'N');
        if (ch == 'Y')
            addbook(&first);
        else
            break;
    }//这个外面是while里面是do-while还是很有东西的
    /*这个东西的精巧之处不好说就简略说一下,最好你还是调试一下理解,就是因为scanf吸收空格和回车,所以第一次这个ch
    会是字符,而第二次回事回车,而且不会输入那个printf里面的内容,因为他在do外面(我开始还小看了这个while和do-while结构/呜呜呜)
    下面那个结构也差不多*/
    while (1)
    {
        printf("请问是否需要打印图书信息(Y/N):");
        do
        {
            scanf("%c", &ch);
        } while (ch != 'Y' && ch != 'N');
        if (ch == 'Y')
            printbook(first);
        else
            break;
    }
    releasespace(&first);
    return 0;
}
void addbook(struct library** first)
{
    struct library* book, * temp;//注意这个*temp只要一阶就行显而易见吧。
    book = (struct library*)malloc(sizeof(struct library));
    printf("请输入需要添加图书的名字:");
    scanf("%s", book->bookname);
    printf("请输入图书作者:");
    scanf("%s", book->author);
    if (*first == NULL)
    {
        *first = book;
        book->next = NULL;
    }
    else
    {
        temp = *first;
        *first = book;
        book->next = temp;
    }
}
void printbook(struct library* first)
{
    struct library* book;
    book = first;
    while (book != NULL)
    {
        printf("书的名字:%s", book->bookname);
        printf("书的作者:%s", book->author);
        book = book->next;
    }
}
void releasespace(struct library** first)//注意这个函数,申请空间之后不用了,或是删除内容了都要释放的,别忘了当然要用二阶指针。
{
    struct library* temp;//为什么再定义一个**book不行
    while (*first != NULL)
    {
        temp = *first;
        *first = (*first)->next;
        free(temp);
    }
}

你可能感兴趣的:(小甲鱼单链表一)