构建一个简略的图书馆系统,添加图书并,输出图书表
首先说一下指针
addbook指针中的二阶指针原因:我们要把指针的地址传过去,才能通过通过函数改变指针的指向,因为函数的值传递原因(个人其他博客里面有解释)。
其次releasebook函数为什么也用二阶函数,因为malloc函数,和free函数申请和释放空间都要通过地址,所以在你通过调用函数来申请和释放空间时要调用指针的地址,所以要用二阶函数。
关于理解addbook函数中的二阶指针对应关系,下图应该会给你灵感:
》
下面是代码,当然和视频中的不太一样,因为这是我在看过视频之后自己写的。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
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);
}
}