单链表的头插法-小甲鱼

单链表的头插法

#include<stdio.h> 
#include<malloc.h>
void getInput(struct Book *book);//此函数用来输入结构体中的内容 
void addBook(struct Book **library);//此函数用来增加新节点 
void printLibrary(struct Book *library);//此函数用来打印函数 
void releaseLibrary(struct Book **library);//此函数用来释放申请的空间 
struct Book//前两个合称为信息域,后一个为指针域 
{
    
    //信息域也可称为节点 
	char title[120];
	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;//定义一个结构体变量book,和一个临时用来存放头指针指向的地址的临时变量 
	book =(struct Book *) malloc(sizeof(struct Book));//为定义的结构体变量申请空间,存放于堆中 
	getInput(book);//为结构体变量book填充内容 
	
	if( *library != NULL)
	{
    
    
		temp = *library;//头指针指向的地址,存放于变量temp中 
		*library = book;//头指针指向新生成的book节点 
		book->next = temp;//新生成book节点的指针域指向,头指针指向的地址
	}
	else
	{
    
    
		*library = book;//头指针指向新生成的book节点 
		book->next = NULL;//新生成的节点的指针域指向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++;
		printf("\n");
	}
}
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 i;
	for(i=0;i<3;i++) //3次循环,申请三个新节点
		addBook(&library);//修改指针的值,把指针的地址传进去 
	printLibrary(library);//传递头指针给打印函数 
	releaseLibrary(&library);//释放申请的空间 
	return 0;
}

在这里插入图片描述
这是单链表的样子,head为头指针,指向第一个节点的信息域,第一个节点的指针域指向下一个节点的信息域。知道最后一个节点的指针域指向NULL,此链表结束。
此函数的解释:
第一步:声明头指针指向NULL。调用addBook函数增加新节点。注:(library为指针变量library所指的地址,&library为指针变量的地址,要修改头指针的内容就要传递头指针的地址,所以addBook里传递的是&library);
第二步:在addBook里定义新节点book,并为book申请内存空间。用getInput函数填入新生成节点的内容。注:(由于要改变头指针的指向问题,所以用二级指针来接受头指针的地址)。
第三步:下一次循环来整添新节点。又改变头指针的指向。指向新生成的节点,新生成节点的指针域指向上一个节点的信息域。所以后输入的插到前面,后输入的先输出。这叫单链表的头插法。如图:
在这里插入图片描述
虚线连接的为新节点,改变头指针的指向,和新节点指针域的指向,新节点插入完成。

猜你喜欢

转载自blog.csdn.net/qq_52208569/article/details/110187745