今天小編給大家?guī)?lái)c語(yǔ)言難點(diǎn)--鏈表的講解,一步一步教你從零開(kāi)始寫C語(yǔ)言鏈表---構(gòu)建一個(gè)鏈表。
為什么要學(xué)習(xí)鏈表?
鏈表主要有以下幾大特性:
1、解決數(shù)組無(wú)法存儲(chǔ)多種數(shù)據(jù)類型的問(wèn)題。
2、解決數(shù)組中,元素個(gè)數(shù)無(wú)法改變的限制(C99的變長(zhǎng)數(shù)組,C++也有變長(zhǎng)數(shù)組可以實(shí)現(xiàn))。
3、數(shù)組移動(dòng)元素的過(guò)程中,要對(duì)元素進(jìn)行大范圍的移動(dòng),很耗時(shí)間,效率也不高。
先來(lái)感性的認(rèn)識(shí)一下鏈表,我們先來(lái)認(rèn)識(shí)下簡(jiǎn)單的鏈表:
從這幅圖我們得出以下信息:
這個(gè)簡(jiǎn)單鏈表的構(gòu)成:
頭指針(Header),若干個(gè)節(jié)點(diǎn)(節(jié)點(diǎn)包括了數(shù)據(jù)域和指針域),最后一個(gè)節(jié)點(diǎn)要指向空。
實(shí)現(xiàn)原理:頭指針指向鏈表的第一個(gè)節(jié)點(diǎn),然后第一個(gè)節(jié)點(diǎn)中的指針指向下一個(gè)節(jié)點(diǎn),然后依次指到最后一個(gè)節(jié)點(diǎn),這樣就構(gòu)成了一條鏈表。
接下來(lái)看看鏈表的數(shù)據(jù)結(jié)構(gòu):
struct list_node
{
int data ; //數(shù)據(jù)域,用于存儲(chǔ)數(shù)據(jù)
struct list_node *next ; //指針,可以用來(lái)訪問(wèn)節(jié)點(diǎn)數(shù)據(jù),也可以遍歷,指向下一個(gè)節(jié)點(diǎn)
};
那么如何來(lái)創(chuàng)建一個(gè)鏈表的一個(gè)節(jié)點(diǎn)呢?
我們寫個(gè)程序演示一下:
#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、首先,當(dāng)然是定義一個(gè)頭指針
node = (list_single *)malloc(sizeof(list_single)); //2、然后分配內(nèi)存空間
if(node == NULL){
printf("malloc fair!
");
}
memset(node,0,sizeof(list_single)); //3、清一下
node->data = 100 ; //4、給鏈表節(jié)點(diǎn)的數(shù)據(jù)賦值
node->next = NULL ; //5、將鏈表的指針域指向空
printf("%d
",node->data);
free(node);
return 0 ;
}
那么,這僅僅只是創(chuàng)建一個(gè)鏈表中的一個(gè)節(jié)點(diǎn),為了好看,我們把創(chuàng)建節(jié)點(diǎn)封裝成函數(shù),以后想創(chuàng)建多少個(gè)節(jié)點(diǎn),我們就可以反復(fù)調(diào)用一個(gè)函數(shù)來(lái)創(chuàng)建,會(huì)很方便:
list_single *create_list_node(int data)
{
list_single *node = NULL ;
node = (list_single *)malloc(sizeof(list_single));
if(node == NULL){
printf("malloc fair!
");
}
memset(node,0,sizeof(list_single));
node->data = 100 ;
node->next = NULL ;
return node ;
}
接下來(lái)在程序上完成的程序:
#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!
");
}
memset(node,0,sizeof(list_single));
node->data = 100 ;
node->next = NULL ;
return node ;
}
int main(void)
{
int data = 100 ;
list_single *node_ptr = create_list_node(data); //創(chuàng)建一個(gè)節(jié)點(diǎn)
printf("node_ptr->data=%d
",node_ptr->data); //打印節(jié)點(diǎn)里的數(shù)據(jù)
printf("node_ptr->next=%d
",node_ptr->next);
free(node_ptr);
return 0 ;
}
執(zhí)行結(jié)果 :
這樣我們就完成一個(gè)鏈表節(jié)點(diǎn)的創(chuàng)建了,那么它現(xiàn)在的樣子如下圖:
鏈表的結(jié)構(gòu)里,數(shù)據(jù)存儲(chǔ)了100,因?yàn)檫@個(gè)鏈表只有一個(gè)節(jié)點(diǎn),所以它的指針域指向了NULL。