尾插法創建鏈表


     介紹過了頭插法,再來介紹一下尾插法。假如我們現在要在鏈表中插入一些數據:1、2、3、4、5,並從鍵盤輸入這些數據,最后插入到鏈表中的數據的順序和輸入數據的

順序是一致的,即{1,2,3,4,5},因為尾插法每次都是在末尾部插入數據的,先插入1,此時表中數據為{1};接着在尾部插入2,此時表中數據數據為{1,2};再在尾部插入3,

此時表中數據數據為{1,2,3};以此類推,最后,表中數據的順序和你輸入的順序是一致的。

    找了一張尾插法的圖,來看一下具體是怎么實現的吧

    可以看到,每次新加入的結點都是插入在了最后一個節點后面,所以叫尾插法,同時將其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 }

結果如下:

   再說一下未知結點個數的情況,看代碼

 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 }

結果如下:

其實尾插法創建鏈表的時候,頭結點可有可無,根據需要來選擇。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM