在刚开始学习单链表可能会遇到的问题
1. 传入链表指针对其修改,输出的时候却为空。
下面为错误的代码
void addBook(struct Book *library){
struct Book *book,*temp;
book=(struct Book *)malloc(sizeof(struct Book));//指向n个Book的指针大小
getInput(book);
temp=library;
library=book;
book->next=temp;
}
分析:传值和传地址操作未区分
值传递:函数传递时,形参会首先根据其定义类型开辟新的空间,并将其参数值复刻到新的内存空间中去,新的内存空间开辟也就意味着内存地址的改变,而函数对其参数的操作
也只是对于新空间内操作,并不会对原空间的值产生改变
址传递:通常通过指针变量作为参数,所以在通过指针变量去接受时,传的是地址,在内存空间中,形参和实参都指的是同一区域内存
由上可知,要想直接对变量值进行改变(不用return),函数形参就得是变量的地址。否则操作没有意义
2.程序莫名停止
了解一下scanf函数
https://blog.51cto.com/u_14058389/2337037
完整代码:
#include<stdio.h>
#include<stdlib.h>
#define Null 0
struct Book{
char name[40];
char author[30];
float price;
struct Book *next;
};
void getInput(struct Book *library){
printf("请输入书名:\n");
scanf("%s",library->name);
printf("请输入作者:\n");
scanf("%s",library->author);
printf("请输入价格:\n");
scanf("%f",&library->price);
}
void addBook(struct Book **library){
struct Book *book,*temp;
book=(struct Book *)malloc(sizeof(struct Book));//指向n个Book的指针空间大小
if(book==Null){
printf("Error!");
exit(1);
}
getInput(book);
temp=*library;
*library=book;
book->next=temp;
}
void printLibrary(struct Book *library){
while(library!=Null){
printf("书名:%s\n",library->name);
printf("作者:%s\n",library->author);
printf("书名:%.1f\n",library->price);
library=library->next;
}
}
void releaseLibrary(struct Book **library){
while(*library!=Null){
struct Book *temp=*library;
free(*library);//free释放的是指针指向的空间,切断指针与地址的联系
//释放后将指针指向NUll,防止再次被引用
*library=temp->next;
}
}
int main(){
struct Book *library=Null;
printf("———欢迎来到图书管理系统———\n");
char c;
while(1){
printf("是否录入图书?(Y or N)\n");
do{
scanf("%c",&c);
}while(c!='Y'||c!='N');
if(c=='Y'){
addBook(&library);
}else{
break;
}
}
//在用%c输入时,空格和转义字符都作为有效字符
printf("是否输出图书信息?(Y or N)\n");
scanf("%c",&c);
if(c=='Y'){
printLibrary(library);
}
releaseLibrary(&library);
return 0;
}