单链表的头插法
#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函数填入新生成节点的内容。注:(由于要改变头指针的指向问题,所以用二级指针来接受头指针的地址)。
第三步:下一次循环来整添新节点。又改变头指针的指向。指向新生成的节点,新生成节点的指针域指向上一个节点的信息域。所以后输入的插到前面,后输入的先输出。这叫单链表的头插法。如图:
虚线连接的为新节点,改变头指针的指向,和新节点指针域的指向,新节点插入完成。