小甲鱼的单链表1(头插法)代码详解

小甲鱼的单链表1(头插法)代码详解

作为一个初入代码界的小萌新,初看小甲鱼的链表视频颇为痛苦(啊!!为什么那么多双指针)经过我近一个月的反复揣摩,终于略有理解。
一个月的折磨,还是想分享一下自己的心得,但估计自己错误百出,还望各位大佬指正!!!欢迎交流。
后面也会更新尾插法0.0,目前想学习的方向是前端,以后也会更新些前端的学习心得,理解和笔记什么的

#include
#include

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)//添加节点(创建链表),用双重指针,目的是改变指针所指的东西。 
{
     
	struct Book *book, *temp;      //(**library和*library的关系可以类比*library和所指数据间的关系,直接传入形参是不能真正修改参数的值的,而是传入参数的地址,并用指针修改) 
								   //(所以这里要修改指针library所指的空间,也需要传入指针library的地址,并用一个指针指向它,以此实现修改) 
	
	book = (struct Book *)malloc(sizeof(struct Book)); //给book所指的申请一个空间 ,创建一个节点 
	if(book == NULL)
	{
     
		printf("内存分配失败\n");
		exit(1);
	}
	getInput(book);
	if(*library != NULL)
	{
     
		temp = *library;			//这里的一次解引用,就等于主函数里的指针library。 (ps如果两次解引用就是library指的数据) 
		*library = book;			
		book -> next = temp;
	}								//有数据的话,就先用temp保存头指针所指的地址,然后让头指针指向新建立的结点,又让新节点指向temp保存的地址所对应的节点 
	else{
     
		*library = book;			//如果没有数据,直接插入头部,让头指针指向新生成的节点 
		book->next = NULL;
	}
}
	
void printLibrary(struct Book *library)//打印链表,因为这个函数不需要修改指针library所指的空间,只用一重指针,传入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) //释放申请的内存 
{
     
	struct Book *temp;                     	//工具人 
	
	while(* library != NULL)				//遍历链表 
	{
     
		temp = *library;
		*library = (*library)->next;
		free(temp);
	}
}
	
int main(void)
{
     
	struct Book *library = NULL;
	int ch;                               //用ch和ascll码比较,所以用int类型 
	
	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);
	}
	
	releaseLibrary(&library);
	
	
	return 0;
}

你可能感兴趣的:(c语言,c语言,单链表,指针)