1. 程式人生 > >一步一步教你從零開始寫C語言連結串列---構建一個連結串列

一步一步教你從零開始寫C語言連結串列---構建一個連結串列

為什麼要學習連結串列?

連結串列主要有以下幾大特性:

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。