第45节课课堂程序
本帖最后由 HZX0229 于 2021-3-20 21:18 编辑大佬们帮忙看看有啥问题?
#include <stdio.h>
#include <stdlib.h>
struct Book{
char title;
char author;
struct Book *next;
};
void addbook(struct Book **);
//void Getinput(struct Book *);
void printbook(struct Book *);
void releaselibrary(struct Book *);
void addbook(struct Book **library)
{
struct Book *book, *temp;
book = (struct Book *)malloc(sizeof(struct Book));
if (book = NULL)
{
printf("内存分配错误!\n");
exit(1);
}
printf("请输入书名:");
scanf("%s", book->title);
printf("请输入作者:");
scanf("%s", book->author);
if (*library != NULL)
{
temp = *library;
*library = book;
book->next = temp;
}
else{
*library = book;
book->next = NULL;
}
}
void printbook(struct Book *library)
{
struct Book *book;
int count = 1;
book = library;
while (book != NULL)
{
printf("BOOK%d\n", count++);
printf("书名:%s\n", book->title);
printf("作者:%s\n", book->author);
book = book->next;
}
}
void releaselibrary(struct Book *library)
{
struct Book *book;
while (library != NULL)
{
book = library;
library = library->next;
free(book);
}
}
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')
{
printbook(library);
}
releaselibrary(library);
return 0;
}
第45节课,课堂程序,
能编译成功,但是输入第一个书名后直接退出了
本帖最后由 shiwobuhaoma 于 2021-3-20 22:29 编辑
void printbook(struct Book *library)
{
struct Book *book;
int count = 1;
book = library;
while (*book != NULL)// book 如果不带*,代表的是book指针的地址,所以要带*,意思是取book指针指向的变量里面的值
{
printf("BOOK%d\n", count++);
printf("书名:%s\n", book->title);
printf("作者:%s\n", book->author);
book = book->next;
}
}
void releaselibrary(struct Book **library)//这里二级指针指向一级指针*library的地址
{
struct Book *book;
while (*library != NULL)//同上,这里要带*,*library是一级指针,代表main函数中的library
{
book = *library;
*library = (*library)->next;
free(book);
}
}
releaselibrary(&library);//这里传链表的地址,因为*library是一级指针,传一级指针的地址,所以函数定义的时候,参数要用一个二级指针接收
注意:结果我没验证,你可以试试。替我验证一下,记得回复!我也是现学现卖。 shiwobuhaoma 发表于 2021-3-20 22:26
注意:结果我没验证,你可以试试。替我验证一下,记得回复!我也是现学现卖。
book,本身是个变量,book就表示一个四字节的地址,*book就表示地址里面的值,NULL是指针的宏定义,只能作用于指针,所以不加*。
**library代表main中library指针的的地址,形参中*library 和 main中library表示的是同一个地址,
本帖最后由 shiwobuhaoma 于 2021-3-20 23:24 编辑
HZX0229 发表于 2021-3-20 22:58
book,本身是个变量,book就表示一个四字节的地址,*book就表示地址里面的值,NULL是指针的宏定义,只能 ...
struct Book *book;
book = library;
让book指针指向library(library是一级指针,指向链表的头结点),所以book也是指向链表头结点的指针
while(*book != NULL)//意思是判断,头结点是否为空,book指针指向的地址里面的值是否为空
而
while(book != NULL)//意思是判断,book指针变量,自己在内存中的地址,是否为空
shiwobuhaoma 发表于 2021-3-20 23:20
struct Book *book;
book = library;
让book指针指向library(library是一级指针,指向链表的头结 ...
详情见NULL指针,在二十几章,NULL是一个指针的宏定义,作用于变量是会报错的,
而且这里用*book 也不知道表示的是啥,要么(*book).title,要么(*book).author, 单写*book, 目前没见过 void addbook(struct Book **library)
{
struct Book *book, *temp;
book = (struct Book *)malloc(sizeof(struct Book));
if (book = NULL) 这个赋值符号 改成 关系符号看看
{
printf("内存分配错误!\n");
exit(1);
} HZX0229 发表于 2021-3-21 08:18
详情见NULL指针,在二十几章,NULL是一个指针的宏定义,作用于变量是会报错的,
而且这里用*book 也不知 ...
指针这块我还要再去学学
页:
[1]