一步一步教你從零開始寫C語言連結串列---構建一個連結串列
阿新 • • 發佈:2018-12-12
為什麼要學習連結串列?
連結串列主要有以下幾大特性:
1、解決陣列無法儲存多種資料型別的問題。
2、解決陣列中,元素個數無法改變的限制(C99的變長陣列,C++也有變長陣列可以實現)。
3、陣列移動元素的過程中,要對元素進行大範圍的移動,很耗時間,效率也不高。
先來感性的認識一下連結串列,我們先來認識下簡單的連結串列:
從這幅圖我們得出以下資訊:
這個簡單鏈表的構成:
頭指標(Header),若干個節點(節點包括了資料域和指標域),最後一個節點要指向空。
實現原理:頭指標指向連結串列的第一個節點,然後第一個節點中的指標指向下一個節點,然後依次指到最後一個節點,這樣就構成了一條連結串列。
接下來看看連結串列的資料結構:
struct list_node
{
int data ; //資料域,用於儲存資料
struct list_node *next ; //指標,可以用來訪問節點資料,也可以遍歷,指向下一個節點
};
那麼如何來建立一個連結串列的一個節點呢?
我們寫個程式演示一下:
#include <stdio.h> #include <stdlib.h> #include <string.h> struct list_node { int data ; struct list_node *next ; }; typedef struct list_node list_single ; int main(void) { list_single *node = NULL ; //1、首先,當然是定義一個頭指標 node = (list_single *)malloc(sizeof(list_single)); //2、然後分配記憶體空間 if(node == NULL){ printf("malloc fair!\n"); } memset(node,0,sizeof(list_single)); //3、清一下 node->data = 100 ; //4、給連結串列節點的資料賦值 node->next = NULL ; //5、將連結串列的指標域指向空 printf("%d\n",node->data); free(node); return 0 ; }
那麼,這僅僅只是建立一個連結串列中的一個節點,為了好看,我們把建立節點封裝成函式,以後想建立多少個節點,我們就可以反覆呼叫一個函式來建立,會很方便:
list_single *create_list_node(int data) { list_single *node = NULL ; node = (list_single *)malloc(sizeof(list_single)); if(node == NULL){ printf("malloc fair!\n"); } memset(node,0,sizeof(list_single)); node->data = data ; node->next = NULL ; return node ; }
接下來在程式上完成的程式:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct list_node
{
int data ;
struct list_node *next ;
};
typedef struct list_node list_single ;
list_single *create_list_node(int data)
{
list_single *node = NULL ;
node = (list_single *)malloc(sizeof(list_single));
if(node == NULL){
printf("malloc fair!\n");
}
memset(node,0,sizeof(list_single));
node->data = data ;
node->next = NULL ;
return node ;
}
int main(void)
{
int data = 100 ;
list_single *node_ptr = create_list_node(data); //建立一個節點
printf("node_ptr->data=%d\n",node_ptr->data); //列印節點裡的資料
printf("node_ptr->next=%d\n",node_ptr->next);
free(node_ptr);
return 0 ;
}
執行結果 :
這樣我們就完成一個連結串列節點的建立了,那麼它現在的樣子如下圖:
連結串列的結構裡,資料儲存了100,因為這個連結串列只有一個節點,所以它的指標域指向了NULL。