介绍过了头插法,再来介绍一下尾插法。假如我们现在要在链表中插入一些数据:1、2、3、4、5,并从键盘输入这些数据,最后插入到链表中的数据的顺序和输入数据的

顺序是一致的,即{1,2,3,4,5},因为尾插法每次都是在末尾部插入数据的,先插入1,此时表中数据为{1};接着在尾部插入2,此时表中数据数据为{1,2};再在尾部插入3,

此时表中数据数据为{1,2,3};以此类推,最后,表中数据的顺序和你输入的顺序是一致的。

    找了一张尾插法的图,来看一下具体是怎么实现的吧

创建链表 javascript 创建链表尾插法_结点

    可以看到,每次新加入的结点都是插入在了最后一个节点后面,所以叫尾插法,同时将其next置空。

    同样地,尾插法创建链表也分为两种情况。一种是已知节点个数,还有一种是未知节点个数。下面用代码来展示一下

    先说一下已知结点个数的情况,看代码

1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define N  10     //结点个数
 4 typedef struct LNode
 5 {
 6     int data;
 7     struct LNode *next;
 8 }LNode,*LinkList;
 9 
10 
11 LinkList creat_Linklist()  //已知节点个数,并且不带头结点
12 {
13      LNode   *head=NULL,*s,*rear=NULL;  //尾插法需要用到尾指针,rear是尾指针
14      for(int i=1;i<=N;i++)
15      {
16          s=(LinkList)malloc(sizeof( LNode));
17          scanf("%d",&s->data);
18          s->next=NULL;    //把当前结点next置空NULL
19          if(i==1)    //用来标记插入的节点是否为第一个节点,是的话就让头结点head指向第一个节点
20              head=s;
21          else    
22              rear->next=s;   //不是头结点的话就让上一个节点的next指向当前结点
23          rear=s;   //尾指针rear指向当前节点
24      }
25      return head;   //返回头指针
26 }
27 int main()
28 {
29     LinkList p;
30     p=creat_Linklist(); //没有头结点,p指向表中的第一个节点
31     while(p!=NULL)
32     {
33        printf("%d ",p->data);
34        p=p->next ;
35     }
36     printf("\n");
37     return 0;
38 }

结果如下:

创建链表 javascript 创建链表尾插法_数据_02

   再说一下未知结点个数的情况,看代码

1 #include<stdio.h>
 2 #include<stdlib.h>
 3 typedef struct LNode
 4 {
 5     int data;
 6     struct LNode *next;
 7 }LNode,*LinkList;
 8 
 9 LinkList create_Linklist( )  //未知结点个数,并且带头结点
10 {
11        LNode   *head=NULL,*s,*rear=NULL;  //尾插法需要用到尾指针,rear是尾指针    
12        int e;
          char ch;  
13        head=(LinkList)malloc(sizeof(  LNode));
14        head->next=NULL;
15        rear=head; 
      do{
             scanf("%d",&e);
19           s=(LinkList)malloc(sizeof(  LNode));
20           s->data=e;
21           s->next=NULL;  //把当前结点next置空NULL
22           rear->next=s;  //s操作上一个结点,让上一个节点的next指向当前结点
23           rear=s;      //尾指针指向当前结点       
          }while((ch=getchar())!='\n');
26        return head;    //返回头指针
27 }
28 int main()
29 {
30     LinkList p;
31     p=create_Linklist( ); 
32     p=p->next;    //有头结点,让p跳过头结点,指向表中的第一个节点
33     while(p!=NULL)
34     {
35        printf("%d ",p->data);
36        p=p->next ;
37     }
38     printf("\n");
39     return 0;
40 }

结果如下:

创建链表 javascript 创建链表尾插法_数据_03

其实尾插法创建链表的时候,头结点可有可无,根据需要来选择。