一步一步教你從零開始寫C語言鏈表---構建一個鏈表


 
版權聲明:本文為博主原創文章,如有需要,請注明轉載地址:http://blog.csdn.net/morixinguan。若是侵權用於商業用途,請聯系博主,否則將追究責任 https://blog.csdn.net/morixinguan/article/details/68951912

為什么要學習鏈表?

鏈表主要有以下幾大特性:

1、解決數組無法存儲多種數據類型的問題。

2、解決數組中,元素個數無法改變的限制(C99的變長數組,C++也有變長數組可以實現)。

3、數組移動元素的過程中,要對元素進行大范圍的移動,很耗時間,效率也不高。

先來感性的認識一下鏈表,我們先來認識下簡單的鏈表:

從這幅圖我們得出以下信息:

這個簡單鏈表的構成:

頭指針(Header),若干個節點(節點包括了數據域和指針域),最后一個節點要指向空。

實現原理:頭指針指向鏈表的第一個節點,然后第一個節點中的指針指向下一個節點,然后依次指到最后一個節點,這樣就構成了一條鏈表。

接下來看看鏈表的數據結構:

  1.  
    struct list_node
  2.  
    {
  3.  
    int data ; //數據域,用於存儲數據
  4.  
    struct list_node *next ; //指針,可以用來訪問節點數據,也可以遍歷,指向下一個節點
  5.  
    };

那么如何來創建一個鏈表的一個節點呢?

我們寫個程序演示一下:

  1.  
    #include <stdio.h>
  2.  
    #include <stdlib.h>
  3.  
    #include <string.h>
  4.  
    struct list_node
  5.  
    {
  6.  
    int data ;
  7.  
    struct list_node *next ;
  8.  
    };
  9.  
     
  10.  
    typedef struct list_node list_single ;
  11.  
     
  12.  
    int main(void)
  13.  
    {
  14.  
    list_single *node = NULL ; //1、首先,當然是定義一個頭指針
  15.  
    node = (list_single *) malloc(sizeof(list_single)); //2、然后分配內存空間
  16.  
    if(node == NULL){
  17.  
    printf("malloc fair!\n");
  18.  
    }
  19.  
    memset(node,0,sizeof(list_single)); //3、清一下
  20.  
    node->data = 100 ; //4、給鏈表節點的數據賦值
  21.  
    node->next = NULL ; //5、將鏈表的指針域指向空
  22.  
    printf("%d\n",node->data);
  23.  
    free(node);
  24.  
    return 0 ;
  25.  
    }

那么,這僅僅只是創建一個鏈表中的一個節點,為了好看,我們把創建節點封裝成函數,以后想創建多少個節點,我們就可以反復調用一個函數來創建,會很方便:

  1.  
    list_single *create_list_node(int data)
  2.  
    {
  3.  
    list_single *node = NULL ;
  4.  
    node = (list_single *) malloc(sizeof(list_single));
  5.  
    if(node == NULL){
  6.  
    printf("malloc fair!\n");
  7.  
    }
  8.  
    memset(node,0,sizeof(list_single));
  9.  
    node->data = 100 ;
  10.  
    node->next = NULL ;
  11.  
    return node ;
  12.  
    }

接下來在程序上完成的程序:

  1.  
    #include <stdio.h>
  2.  
    #include <stdlib.h>
  3.  
    #include <string.h>
  4.  
    struct list_node
  5.  
    {
  6.  
    int data ;
  7.  
    struct list_node *next ;
  8.  
    };
  9.  
     
  10.  
    typedef struct list_node list_single ;
  11.  
    list_single *create_list_node(int data)
  12.  
    {
  13.  
    list_single *node = NULL ;
  14.  
    node = (list_single *) malloc(sizeof(list_single));
  15.  
    if(node == NULL){
  16.  
    printf("malloc fair!\n");
  17.  
    }
  18.  
    memset(node,0,sizeof(list_single));
  19.  
    node->data = data;
  20.  
    node->next = NULL ;
  21.  
    return node ;
  22.  
    }
  23.  
    int main(void)
  24.  
    {
  25.  
    int data = 100 ;
  26.  
    list_single *node_ptr = create_list_node(data); //創建一個節點
  27.  
    printf("node_ptr->data=%d\n",node_ptr->data); //打印節點里的數據
  28.  
    printf("node_ptr->next=%d\n",node_ptr->next);
  29.  
    free(node_ptr);
  30.  
    return 0 ;
  31.  
    }

執行結果 :



這樣我們就完成一個鏈表節點的創建了,那么它現在的樣子如下圖:

鏈表的結構里,數據存儲了100,因為這個鏈表只有一個節點,所以它的指針域指向了NULL。


免責聲明!

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



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