video45 单链表的头插法
//video 45 单链表的头插法
#include <stdio.h>
#include <stdlib.h>
struct Book;//声明
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)//两个*,两层解引用。指向book的指针的指针。前插法,插入结构体的函数。因为需要更改head(library)的值,他本身就是一个指针,我们需要修改指针的值,所以是指针的指针。
{
struct Book *book, *temp;
book = (struct Book *)malloc(sizeof(struct Book));//在堆里面生成一个新的节点
if(book == NULL)//为什么有malloc就要有检查
{
printf("内存分配失败\n");
exit(1);//退出,stdlib。
}
getInput(book);//通过输入,填充信息域的内容
if(*library !=NULL)//判断是否为空,head就是library,book是新变量,book->next
{
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);
}
}
int main(void)
{
struct Book *library = NULL;//头指针,最初为null。再通过add插入新的节点。
int ch;
while(1)
{
printf("请问是否需要录入书籍信息(Y/N):");
do
{
ch=getchar();
}while(ch!= 'Y' && ch!= 'N');
if (ch=='Y')
{
addBook(&library)
}
else
{
break;
}
}
releaseLibrary(library);
return 0;
}```