欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表存儲詳解

 更新時(shí)間:2022年07月27日 10:42:43   作者:代碼騎士  
鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。本文將和大家一起聊聊C語言中單鏈表的存儲,感興趣的可以學(xué)習(xí)一下

如果說,順序表的所占用的內(nèi)存空間是連續(xù)的,那么鏈表則是隨機(jī)分配的不連續(xù)的,那么為了使隨機(jī)分散的內(nèi)存空間串聯(lián)在一起形成一種前后相連的關(guān)系,指針則起到了關(guān)鍵性作用。

單鏈表的基本結(jié)構(gòu):

頭指針:永遠(yuǎn)指向鏈表第一個(gè)節(jié)點(diǎn)的位置。

頭結(jié)點(diǎn):不存任何數(shù)據(jù)的空節(jié)點(diǎn),通常作為鏈表的第一個(gè)節(jié)點(diǎn)。對于鏈表來說,頭節(jié)點(diǎn)不是必須的,它的作用只是為了方便解決某些實(shí)際問題。

首元結(jié)點(diǎn):首個(gè)帶有元素的結(jié)點(diǎn)。

其他結(jié)點(diǎn):鏈表中其他的節(jié)點(diǎn)。

1、定義一個(gè)鏈表結(jié)點(diǎn)

包括數(shù)據(jù)域和指針域

typedef struct Link{
    char elem;//數(shù)據(jù)域 
    struct Link *next;//指針域,用來連接后繼元素 
}link;//link為節(jié)點(diǎn)名,每個(gè)結(jié)點(diǎn)都是一個(gè)link結(jié)構(gòu)體 

2、初始化單鏈表

(1)創(chuàng)建一個(gè)頭結(jié)點(diǎn)

(2)聲明一個(gè)臨時(shí)指針指向頭結(jié)點(diǎn)

(3)用循環(huán)創(chuàng)建新的結(jié)點(diǎn)并賦值且依次相連

newLink a;

a->data=i;

a->next=null;

temp->next=a;

temp=a;

過程如下:

帶頭結(jié)點(diǎn):

link * initLink(){
    link *p=(link*)malloc(sizeof(link));//創(chuàng)建頭結(jié)點(diǎn)
    link*temp = p;//聲明一個(gè)指針temp指向頭結(jié)點(diǎn),也就是頭結(jié)點(diǎn)的地址賦值給指針變量(注意這不是頭指針而是用來連接數(shù)組的臨時(shí)指針變量)
    //生成鏈表
    for(int i=1;i<5;i++)
    {
        link *a=(link*)malloc(sizeof(link));//生成一個(gè)結(jié)點(diǎn) 
        a->elem=i;//給結(jié)點(diǎn)的數(shù)據(jù)域賦值
        a->next=NULL;//指針域設(shè)置為空 
        temp->next=a;//上一個(gè)結(jié)點(diǎn)的指針指向新增結(jié)點(diǎn) 
        temp=temp->next;//臨時(shí)指針向后移動也可寫成temp=a 
    } 
    //返回頭結(jié)點(diǎn),通過頭節(jié)點(diǎn)的指針即可找到整個(gè)鏈表
    return p;
} 

無頭結(jié)點(diǎn)的單鏈表初始化:

 link * initLink2(){
    link *p=NULL;//創(chuàng)建頭指針
    link*temp=(link*)malloc(sizeof(link));//創(chuàng)建首元結(jié)點(diǎn)
    //首元結(jié)點(diǎn)初始化
    temp->elem=1;
    temp->next=NULL;
    p=temp;//頭結(jié)點(diǎn)指向首元結(jié)點(diǎn)
    //接下來從第二個(gè)結(jié)點(diǎn)開始創(chuàng)建
    for(int i=2;i<5;i++){
        //創(chuàng)建一個(gè)新結(jié)點(diǎn)并初始化
        link *a=(link*)malloc(sizeof(link));
        a->elem=i;
        a->next=NULL;
        //將temp結(jié)點(diǎn)與新建的a結(jié)點(diǎn)建立邏輯關(guān)系
        temp->next=a;
        temp=a;    
    }
    //返回建立的節(jié)點(diǎn),只返回頭指針 p即可,通過頭指針即可找到整個(gè)鏈表
    return p; 
}

3、輸出鏈表數(shù)據(jù)

帶頭結(jié)點(diǎn):

void display(link *p){
    link*temp=p;//將temp指向頭結(jié)點(diǎn)
    //只要temp指針指向的結(jié)點(diǎn)的next不是Null,就執(zhí)行輸出語句。
    while(temp->next){
        temp=temp->next;
        printf("%d ",temp->elem);
    } 
    printf("\n");
} 

不帶頭結(jié)點(diǎn):

void display2(link *p){
    link* temp=p;//將temp指針重新指向頭結(jié)點(diǎn)
    //只要temp指針指向的結(jié)點(diǎn)的next不是Null,就執(zhí)行輸出語句。
    while (temp) {
        printf("%d ",temp->elem);
        temp=temp->next;
    }
    printf("\n");
}

4、完整代碼

#include<stdio.h>
#include<stdlib.h>
 
typedef struct Link{
    int elem;//數(shù)據(jù)域 
    struct Link *next;//指針域,用來連接后繼元素 
}link;//link為節(jié)點(diǎn)名,每個(gè)結(jié)點(diǎn)都是一個(gè)link結(jié)構(gòu)體 
 
//帶頭結(jié)點(diǎn) 
link * initLink(){
    link *p=(link*)malloc(sizeof(link));//創(chuàng)建頭結(jié)點(diǎn)
    link*temp = p;//聲明一個(gè)指針temp指向頭結(jié)點(diǎn),也就是頭結(jié)點(diǎn)的地址賦值給指針變量(注意這不是頭指針而是用來連接數(shù)組的臨時(shí)指針變量)
    //生成鏈表
    for(int i=1;i<5;i++)
    {
        link *a=(link*)malloc(sizeof(link));//生成一個(gè)結(jié)點(diǎn) 
        a->elem=i;//給結(jié)點(diǎn)的數(shù)據(jù)域賦值
        a->next=NULL;//指針域設(shè)置為空 
        temp->next=a;//上一個(gè)結(jié)點(diǎn)的指針指向新增結(jié)點(diǎn) 
        temp=temp->next;//臨時(shí)指針向后移動也可寫成temp=a 
    } 
    //返回頭結(jié)點(diǎn),通過頭節(jié)點(diǎn)的指針即可找到整個(gè)鏈表
    return p;
} 
 
//不帶頭結(jié)點(diǎn) 
link * initLink2(){
    link *p=NULL;//創(chuàng)建頭指針
    link*temp=(link*)malloc(sizeof(link));//創(chuàng)建首元結(jié)點(diǎn)
    //首元結(jié)點(diǎn)初始化
    temp->elem=1;
    temp->next=NULL;
    p=temp;//頭結(jié)點(diǎn)指向首元結(jié)點(diǎn)
    //接下來從第二個(gè)結(jié)點(diǎn)開始創(chuàng)建
    for(int i=2;i<5;i++){
        //創(chuàng)建一個(gè)新結(jié)點(diǎn)并初始化
        link *a=(link*)malloc(sizeof(link));
        a->elem=i;
        a->next=NULL;
        //將temp結(jié)點(diǎn)與新建的a結(jié)點(diǎn)建立邏輯關(guān)系
        temp->next=a;
        temp=a;    
    }
    //返回建立的節(jié)點(diǎn),只返回頭指針 p即可,通過頭指針即可找到整個(gè)鏈表
    return p; 
}
 
//帶頭結(jié)點(diǎn) 
void display(link *p){
    link*temp=p;//將temp指向頭結(jié)點(diǎn)
    //只要temp指針指向的結(jié)點(diǎn)的next不是Null,就執(zhí)行輸出語句。
    while(temp->next){
        temp=temp->next;
        printf("%d ",temp->elem);
    } 
    printf("\n");
} 
 
//不帶頭結(jié)點(diǎn) 
void display2(link *p){
    link* temp=p;//將temp指針重新指向頭結(jié)點(diǎn)
    //只要temp指針指向的結(jié)點(diǎn)的next不是Null,就執(zhí)行輸出語句。
    while (temp) {
        printf("%d ",temp->elem);
        temp=temp->next;
    }
    printf("\n");
}
 
int main()
{
    display(initLink());
    return 0;
}

輸出結(jié)果:

以上就是C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表存儲詳解的詳細(xì)內(nèi)容,更多關(guān)于C語言單鏈表存儲的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++類與對象的詳細(xì)說明2

    C++類與對象的詳細(xì)說明2

    這篇文章主要為大家詳細(xì)介紹了C++的類與對象,使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C語言二維數(shù)組應(yīng)用之掃雷游戲

    C語言二維數(shù)組應(yīng)用之掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語言二維數(shù)組應(yīng)用之掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 詳解C++編程中的靜態(tài)成員與可變數(shù)據(jù)成員

    詳解C++編程中的靜態(tài)成員與可變數(shù)據(jù)成員

    這篇文章主要介紹了詳解C++編程中的靜態(tài)成員與可變數(shù)據(jù)成員,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • C/C++線程退出的四種方法小結(jié)

    C/C++線程退出的四種方法小結(jié)

    本文主要介紹了C/C++線程退出的四種方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • C語言實(shí)現(xiàn)簡單反彈球消磚塊游戲

    C語言實(shí)現(xiàn)簡單反彈球消磚塊游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡單反彈球消磚塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 深入理解C語言指針

    深入理解C語言指針

    關(guān)于指針,其是C語言的重點(diǎn),C語言學(xué)的好壞,其實(shí)就是指針學(xué)的好壞。其實(shí)指針并不復(fù)雜,學(xué)習(xí)指針,要正確的理解指針
    2020-02-02
  • C++單例類模板詳解

    C++單例類模板詳解

    這篇文章主要介紹了C++單例類模板,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • C++ leetcode之刪除并獲得點(diǎn)數(shù)的示例代碼

    C++ leetcode之刪除并獲得點(diǎn)數(shù)的示例代碼

    這篇文章主要介紹了C++ leetcode之刪除并獲得點(diǎn)數(shù)的示例代碼,本文給大家分享問題解析及解決方案,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • C++中簡單讀寫文本文件的實(shí)現(xiàn)方法

    C++中簡單讀寫文本文件的實(shí)現(xiàn)方法

    本篇文章是對C++中簡單讀寫文本文件的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++命名空間 namespace詳解

    C++命名空間 namespace詳解

    定義命名空間,使用namespace關(guān)鍵字,后面跟命名空間的名字,然后接一對花括號{ } 即可,{ }中即為命名空間的成員,這篇文章主要介紹了C++命名空間 namespace,需要的朋友可以參考下
    2023-04-04

最新評論