単一のリンクリストの頭の挿入
#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;
}
これは、単一リンクリストの外観です。ヘッドは、最初のノードの情報フィールドを指すヘッドポインターであり、最初のノードのポインターフィールドは、次のノードの情報フィールドを指します。最後のノードのポインタフィールドがNULLを指していることを知って、このリンクリストは終了します。
この関数の説明:
ステップ1:ヘッドポインターがNULLを指していることを宣言します。addBook関数を呼び出して、新しいノードを追加します。注:(libraryはポインター変数libraryが指すアドレス、&libraryはポインター変数のアドレスです。ヘッドポインターの内容を変更する場合は、ヘッドポインターのアドレスを渡す必要があるため、渡される内容は次のとおりです。 addBookでは&library);
ステップ2:addBookでは新しいノードブックを定義し、そのブックのメモリスペースを申請します。getInput関数を使用して、新しく生成されたノードのコンテンツを入力します。注:(ヘッドポインターの方向を変更する問題があるため、セカンダリポインターはヘッドポインターのアドレスを受け入れるために使用されます)。
ステップ3:次のサイクルで新しいノードを追加します。ヘッドポインタの方向をもう一度変更します。新しく生成されたノードを指し、新しく生成されたノードのポインタフィールドは前のノードの情報フィールドを指します。したがって、入力後の入力を前面に挿入し、入力後の入力を先に出力します。これは、単一リンクリストのヘッド挿入方法と呼ばれます。図に示すように、
点線は新しいノードを接続します。新しいノードのヘッドポインタとポインタフィールドを変更すると、新しいノードが挿入されます。