版權聲明:本文為博主原創文章,如有需要,請注明轉載地址:http://blog.csdn.net/morixinguan。若是侵權用於商業用途,請聯系博主,否則將追究責任 https://blog.csdn.net/morixinguan/article/details/68951912
為什么要學習鏈表?
鏈表主要有以下幾大特性:
1、解決數組無法存儲多種數據類型的問題。
2、解決數組中,元素個數無法改變的限制(C99的變長數組,C++也有變長數組可以實現)。
3、數組移動元素的過程中,要對元素進行大范圍的移動,很耗時間,效率也不高。
先來感性的認識一下鏈表,我們先來認識下簡單的鏈表:
從這幅圖我們得出以下信息:
這個簡單鏈表的構成:
頭指針(Header),若干個節點(節點包括了數據域和指針域),最后一個節點要指向空。
實現原理:頭指針指向鏈表的第一個節點,然后第一個節點中的指針指向下一個節點,然后依次指到最后一個節點,這樣就構成了一條鏈表。
接下來看看鏈表的數據結構:
-
struct list_node
-
{
-
int data ; //數據域,用於存儲數據
-
struct list_node *next ; //指針,可以用來訪問節點數據,也可以遍歷,指向下一個節點
-
};
那么如何來創建一個鏈表的一個節點呢?
我們寫個程序演示一下:
-
-
-
-
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 = 100 ;
-
node->next = NULL ;
-
return node ;
-
}
接下來在程序上完成的程序:
-
-
-
-
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。