void releaseLibrary(struct Book *library)
{
struct Book *temp;
while (library != NULL) {
temp = library->next;
free(library);
library = temp;
}
} 谢谢分享 本帖最后由 清尘yt 于 2019-8-16 11:01 编辑
#include <stdio.h>
#include <stdlib.h>
//头插法单链表
struct Book
{
char title;
char author;
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));
if(book==NULL)
{
printf("内存分配失败了!");
exit(1);
}
getInput(book); //输入一个结构体节点的地址,好在里面改值
if(*library!=NULL) //单链表头插法的两种情况,相应的操作
{
temp=*library;
*library=book;
book->next=temp;
}
else
{
*library=book;
book->next=NULL;
}
}
void printBook(struct Book *library)
{
struct Book *book=library;
while(book!=NULL)
{
printf("书名是:%s\n",book->title);
printf("作者是:%s\n",book->author);
book=book->next; //遍历整个单链表,打印出所有的书籍!
}
}
void releaseBook(struct Book **library)
{ //遍历整个单链表进行逐一的释放空间
struct Book *temp;
while(*library!=NULL)
{
temp=*library;
*library=temp->next;
free(temp);
}
}
int main()
{
struct Book *library=NULL; //library是头指针,指向单链表第一个元素,即存储的是单链表第一个元素的地址
char ch;
/*addBook(&library); //若是通过library直接改值改不了,因为实参与形参单项传递,形参的改变不能影响实参,但如果传的是地址就可以改了
printf("添加书籍成功!现在打印:\n");
printf("书名是:%s\n作者是:%s\n",(*library).title,library->author); //两种形式进行操作! */
while(1) //增加用户体验的操作,可以添加想要输入的书籍并一次性打印出来!!!
{
printf("是否添加书籍(Y/N):");
do //防止用户乱输入字符
{
ch=getchar();
}while(ch!='Y' && ch!='N' && ch!='y' &&ch!='n');
if(ch=='Y' || ch=='y')
{
addBook(&library);
}
else
{
break;
}
}
printf("是否打印书籍信息(Y/N):");
do
{
ch=getchar();
}while(ch!='Y' && ch!='N' && ch!='y' &&ch!='n');
if(ch=='Y' || ch=='y')
{
printBook(library); //不需要改值,所以直接传library值,即其指向的节点的地址;将单链表存储的内容一一打印出来
}
releaseBook(&library); //释放空间,刚刚malloc分配了内存空间
return 0;
//头插法的操作导致后录入的书籍先打印出来,因为是按照单链表里节点位置顺序打印出来的(头指针从头部遍历到尾部的结果)
}
莫法法 发表于 2017-10-11 23:09
改成这样以后好了
void releaseLibrary(struct Book *library)
能解释一下吗? 更新 更新 看完视频一脸懵逼
清尘yt 发表于 2019-8-16 10:54
#include
#include
//头插法单链表
我直接爱你
清尘yt 发表于 2019-8-16 10:54
#include
#include
//头插法单链表
为什么输入完书籍名之后就没有了 为什么我的代码 输入书名之后回车没有翻译 不会接着打印”请输入作者“这个代码{:10_266:} {:10_256:} Sean_Huang 发表于 2022-3-19 20:00
为什么输入完书籍名之后就没有了
同问,我输入书籍后,界面输出“请输入作者”,然后就没有了, wzppp 发表于 2022-4-30 20:48
同问,我输入书籍后,界面输出“请输入作者”,然后就没有了,
找到了,在分配完空间后,if条件写了一个等号,不是判断语句,错了。 好好学习才能天天向上! 看了两遍视频,看了一些博客,终于明白了
不使用指针的指针,未加释放内存函数
#include <stdio.h>
#include <stdlib.h>
struct Book
{
char title;
char author;
struct Book *next;
};
void addBook(struct Book *plibrary);
void getBook(struct Book *newBook);
void printLibrary(struct Book *plibrary);
void getBook(struct Book *newBook)
{
newBook->next=NULL;
printf("请输入书籍的名称:");
scanf("%s",newBook->title);
printf("请输入书籍的作者:");
scanf("%s",newBook->author);
}
void addBook(struct Book *plibrary)
{
struct Book *temp;
temp=plibrary;
struct Book * newBook;
newBook=(struct Book *)malloc(sizeof(struct Book));
if(newBook==NULL)
{
printf("内存分配失败了");
exit(1);
}
else
{
if(temp->next==NULL)
{
getBook(newBook);
temp->next=newBook;
}
else
{
while(temp->next !=NULL)
{
temp=temp->next;
}
getBook(newBook);
temp->next=newBook;
}
}
}
void printLibrary(struct Book *plibrary)
{
struct Book * link;
link =plibrary;
int count=1;
while(link->next != NULL)
{
link=link->next;
printf("第%d本书籍信息\n",count);
printf("%s\n",link->title);
printf("%s\n",link->author);
count++;
}
}
int main()
{
static struct Book library;
library.next=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);
}
return 0;
}
页:
[1]