电竞比分网-中国电竞赛事及体育赛事平台

分享

一步一步教你從零開始寫C語言鏈表——構(gòu)建一個(gè)鏈表

 靜幻堂 2018-09-03
ccc云志 2018-09-02 18:28:35

今天小編給大家?guī)韈語言難點(diǎn)--鏈表的講解,一步一步教你從零開始寫C語言鏈表---構(gòu)建一個(gè)鏈表。

一步一步教你從零開始寫C語言鏈表——構(gòu)建一個(gè)鏈表

為什么要學(xué)習(xí)鏈表?

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

1、解決數(shù)組無法存儲多種數(shù)據(jù)類型的問題。

2、解決數(shù)組中,元素個(gè)數(shù)無法改變的限制(C99的變長數(shù)組,C++也有變長數(shù)組可以實(shí)現(xiàn))。

3、數(shù)組移動(dòng)元素的過程中,要對元素進(jìn)行大范圍的移動(dòng),很耗時(shí)間,效率也不高。

先來感性的認(rèn)識一下鏈表,我們先來認(rèn)識下簡單的鏈表:

一步一步教你從零開始寫C語言鏈表——構(gòu)建一個(gè)鏈表

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

這個(gè)簡單鏈表的構(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)成了一條鏈表。

接下來看看鏈表的數(shù)據(jù)結(jié)構(gòu):


struct list_node
{
int data ; //數(shù)據(jù)域,用于存儲數(shù)據(jù)
struct list_node *next ; //指針,可以用來訪問節(jié)點(diǎn)數(shù)據(jù),也可以遍歷,指向下一個(gè)節(jié)點(diǎn)
};

那么如何來創(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ù)來創(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 ;
}

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


#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é)果 :

一步一步教你從零開始寫C語言鏈表——構(gòu)建一個(gè)鏈表

這樣我們就完成一個(gè)鏈表節(jié)點(diǎn)的創(chuàng)建了,那么它現(xiàn)在的樣子如下圖:

鏈表的結(jié)構(gòu)里,數(shù)據(jù)存儲了100,因?yàn)檫@個(gè)鏈表只有一個(gè)節(jié)點(diǎn),所以它的指針域指向了NULL。

一步一步教你從零開始寫C語言鏈表——構(gòu)建一個(gè)鏈表

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多