最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C語言中二級指針與鏈表的應(yīng)用

 更新時間:2022年07月06日 14:05:38   作者:葉落秋白  
對于初學(xué)者而言,有很多地方肯定是費解的。比如函數(shù)的參數(shù)列表的多樣化,動態(tài)分配內(nèi)存空間函數(shù)malloc等,其實這些知識和指針聯(lián)系緊密,尤其是二級指針,快跟隨小編來學(xué)習(xí)一下吧

前言

這篇文章即將解決你看不懂或者不會寫鏈表的基本操作的問題,對于初學(xué)者而言,有很多地方肯定是費解的。比如函數(shù)的參數(shù)列表的多樣化,動態(tài)分配內(nèi)存空間函數(shù)malloc等,其實這些知識和指針聯(lián)系緊密,尤其是二級指針。那么開始好好的學(xué)習(xí)這篇文章吧!

二級指針講解

簡述:其實就是一個指針指向另一個指針的地址。

我們都知道指針指向地址,但是指針自身也是一個變量,當(dāng)然也可以被二級指針?biāo)赶颉?/p>

語法:形如 int x = 10; int *q = &x; int **p = & q;

那么這里的q指針指向x的地址,p指針指向指針q的地址,*q可以得到x的值,*p可以得到q指針本身,**p也可以得到x的值。

代碼示例:

int main(void)
{
    int x = 10; 
    int* q = &x;
    int** p = &q;    
    printf("x 的地址為:    %d\n", &x);
    printf("q 指向的地址為:%d\n", q);
    printf("*p的值為:      %d\n", *p);   //p指向指針q的地址,那么*p是解引用操作,
                                          //就等于了q本身
    printf("x 的值為:     %d\n", x);
    printf("q 存取的值為: %d\n", *q);
    printf("**p的值為:    %d\n", **p);    //**p相當(dāng)于解引用解了兩次,第一次先得到q本身,
                                          //第二次得到q指向地址的值
    return 0;
}

運行結(jié)果:

鏈表的應(yīng)用 

這里以帶頭結(jié)點的雙鏈表為例

定義雙鏈表的結(jié)構(gòu)體

typedef int ElemType;//將整型數(shù)據(jù)重命名為int
typedef int Status;//整型重命名為Status
 
//雙鏈表的數(shù)據(jù)結(jié)構(gòu)定義
typedef struct DouNode {
    ElemType data;               //數(shù)據(jù)域
    struct DouNode* head;        //前驅(qū)指針
    struct DouNode* next;        //后繼指針
}DousList, * LinkList;// 結(jié)點指針

代碼解釋:

利用typedef對數(shù)據(jù)類型進(jìn)行重命名,只要在后面遇到的 ElemType和 Status都是整型就夠了。雙鏈表結(jié)構(gòu)體包含三個部分:數(shù)據(jù)域、前驅(qū)指針、后繼指針,與單鏈表的區(qū)別就是多了一個前驅(qū)指針。然后大括號結(jié)束部分也是重命名,此時DousList和DouNode效果一樣,都是結(jié)構(gòu)體名,然后LinkList是指向結(jié)點的指針。

具體使用:

LinkList L,L是一個指針,DousList *P,P也是一個指針,屬于兩種創(chuàng)建方式。

創(chuàng)建雙鏈表

使用兩種正確的創(chuàng)建鏈表形式和一種錯誤的形式,對比著記憶創(chuàng)建方法

傳入一級指針

這種方式并不能成功創(chuàng)建

代碼演示:

void CreateDouList(LinkList L, int n)
{
    LinkList  ptr;
    int i;
    L = (LinkList)malloc(sizeof(DousList));    //為頭結(jié)點申請空間
    L->next = NULL;
    L->head = NULL;
    L->data = n;//L->data記錄結(jié)點的個數(shù)
    ptr = L;
    for (i = 0; i < n; i++)
    {
        int value = 0;
        scanf("%d",&value);
        LinkList me = (LinkList)malloc(sizeof(DouNode));
        me->data = value;    //節(jié)點數(shù)據(jù)域
        me->next = NULL;
        me->head = NULL;
        ptr->next = me;     
        me->head = ptr;
        ptr = ptr->next;     //尾插法建表
    }
}

代碼解析: 

這里的參數(shù)列表是 LinkList L 和 整型數(shù)據(jù) n,L是傳入的鏈表頭結(jié)點指針,n是用來記錄插入數(shù)據(jù)的個數(shù)的,在下面的for循環(huán)用做循環(huán)的次數(shù)。接下來使用malloc函數(shù)為L鏈表分配內(nèi)存空間,malloc需要用指針來接收,左邊的括號是分配的指針類型,右邊的括號是分配的內(nèi)存空間大小。分配空間完成之后初始化前驅(qū)和后繼指針為空,數(shù)據(jù)域data記錄數(shù)據(jù)的個數(shù)。ptr指針初始等于L指針,接下來進(jìn)入n次循環(huán),創(chuàng)建待插入結(jié)點指針me并進(jìn)行分配內(nèi)存空間和初始化,最后三行代碼進(jìn)行尾插法建立鏈表:

尾插法:

先讓ptr的后繼指針指向me,然后me的head指針指向ptr,這就相當(dāng)于在鏈表頭把me結(jié)點插入鏈表,然后ptr指向這個插入的新結(jié)點,這就保證了每次插入的結(jié)點都在上一個插入的結(jié)點之后。

但是這樣真的在鏈表中插入數(shù)據(jù)了嗎 ,來看看調(diào)試結(jié)果:

進(jìn)入遍歷的程序時,讓創(chuàng)建的ptr指針指向L鏈表的后繼,立馬就出現(xiàn)了空指針異常,但是上面明明插入數(shù)據(jù)了,原因是什么呢? 很明顯,這里的鏈表L并未完成插入數(shù)據(jù)。這是因為我們在創(chuàng)建鏈表的函數(shù)里傳入的只是鏈表的指針L,那么在函數(shù)里這個指針只是一個副本,在這里給他增大內(nèi)存空間并不會影響到實參鏈表,這和普通數(shù)據(jù)類型的值傳遞和地址傳遞的情況一致。

我們利用傳入指針地址來解決這個問題,兩個方法:指針的引用和二級指針

傳入指針的引用

函數(shù)的實現(xiàn)部分完全不用修改,只要形參列表加上一個引用符"&"即可。

void CreateDouList(LinkList &L, int n);

查看調(diào)試結(jié)果:

同樣的調(diào)試方法,傳入指針的引用之后可以清晰的看到L的data等于5,也就是存了五個數(shù)據(jù),然后對于的后繼結(jié)點的值都和尾插的結(jié)果一致,最后一個結(jié)點的后繼指針正好指向NULL,完全符合我們的設(shè)計的代碼。

傳入指針的引用之后,函數(shù)里鏈表的空間變化會導(dǎo)致實參里的鏈表空間變化,這樣做才能使插入操作完成,將結(jié)點插入到鏈表內(nèi)。

傳入二級指針

這個和指針的引用原理一樣,我主要分享給你們使用的形式

注意調(diào)用的時候?qū)崊⒁?ldquo;&”符,例:CreateDouList(&L,n);

void CreateDouList(LinkList *L, int n)
{
    LinkList  ptr;
    int i;
     *L = (LinkList)malloc(sizeof(DousList));    //為頭結(jié)點申請空間
    (*L)->next = NULL;
    (*L)->head = NULL;
    (*L)->data = n;//L->data記錄結(jié)點的個數(shù)
    ptr = (*L);
    printf("開始插入數(shù)據(jù):\n");
    for (i = 0; i < n; i++)
    {
        int value = 0;
        scanf("%d",&value);
        LinkList me = (LinkList)malloc(sizeof(DouNode));
        me->data = value;    //節(jié)點數(shù)據(jù)域
        me->next = NULL;
        me->head = NULL;
        ptr->next = me;     
        me->head = ptr;
        ptr = ptr->next;     //尾插法建表
    }
}

這里形參列表的參數(shù)是 LinkList *L,和DousLIst **L效果一樣,是一個二級指針。如果用到指向鏈表的指針就需要一次接引用操作,寫成(*L)的形式。然后再去分配空間、進(jìn)行初始化、賦值給鏈表指針ptr等操作,這樣鏈表二級指針L的改變也會使實參的鏈表發(fā)生改變,可以查看調(diào)試結(jié)果。

調(diào)試結(jié)果:

以上就是詳解C語言中二級指針與鏈表的應(yīng)用的詳細(xì)內(nèi)容,更多關(guān)于C語言 二級指針 鏈表的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++中地圖按鍵排序?qū)崿F(xiàn)示例

    C++中地圖按鍵排序?qū)崿F(xiàn)示例

    這篇文章主要為大家介紹了C++中地圖按鍵排序?qū)崿F(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • C語言與C++中內(nèi)存管理詳解

    C語言與C++中內(nèi)存管理詳解

    本章主要介紹C語言與C++的內(nèi)存管理,以C++的內(nèi)存分布作為引入,介紹C++不同于C語言的內(nèi)存管理方式(new?delete對比?malloc?free),感興趣的朋友來看看吧
    2022-04-04
  • C++實現(xiàn)LeetCode(46.全排列)

    C++實現(xiàn)LeetCode(46.全排列)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(46.全排列),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • c語言單詞搜索的實現(xiàn)

    c語言單詞搜索的實現(xiàn)

    本文主要介紹了c語言單詞搜索的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C語言實現(xiàn)簡易通訊錄(靜態(tài)版本)的代碼分享

    C語言實現(xiàn)簡易通訊錄(靜態(tài)版本)的代碼分享

    這篇文章主要為大家詳細(xì)介紹了如何錄音C語言實現(xiàn)一個簡易的通訊錄(靜態(tài)版本),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-10-10
  • C++零基礎(chǔ)精通數(shù)據(jù)結(jié)構(gòu)之帶頭雙向循環(huán)鏈表

    C++零基礎(chǔ)精通數(shù)據(jù)結(jié)構(gòu)之帶頭雙向循環(huán)鏈表

    帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨存儲數(shù)據(jù)。實際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實現(xiàn)以后會發(fā)現(xiàn)結(jié)構(gòu)會帶來很多優(yōu)勢,實現(xiàn)反而簡單
    2022-03-03
  • c++讀取和寫入TXT文件的整理方法

    c++讀取和寫入TXT文件的整理方法

    今天小編就為大家分享一篇c++讀取和寫入TXT文件的整理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • C++11計時器之chrono庫簡介

    C++11計時器之chrono庫簡介

    C++11有了chrono庫,可以在不同系統(tǒng)中很容易的實現(xiàn)定時功能,要使用chrono庫,需要#include,其所有實現(xiàn)均在std::chrono namespace下,本文給大家介紹C++11計時器:chrono庫介紹,感興趣的朋友一起看看吧
    2023-12-12
  • C++?OpenCV實戰(zhàn)之零部件的自動光學(xué)檢測

    C++?OpenCV實戰(zhàn)之零部件的自動光學(xué)檢測

    這篇文章主要為大家介紹一個C++?OpenCV的實戰(zhàn)——零部件的自動光學(xué)檢測,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-09-09
  • C語言 map函數(shù)的基礎(chǔ)用法詳解

    C語言 map函數(shù)的基礎(chǔ)用法詳解

    這篇文章主要為大家介紹了C語言 map函數(shù)的基礎(chǔ)用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01

最新評論

天台县| 盐津县| 鄯善县| 安宁市| 定边县| 汉川市| 内乡县| 瓦房店市| 偏关县| 南通市| 砀山县| 永定县| 汽车| 合川市| 罗山县| 水富县| 海晏县| 汪清县| 仁怀市| 贡嘎县| 长兴县| 曲阳县| 曲周县| 象山县| 清原| 保德县| 许昌县| 昌江| 施秉县| 波密县| 仁寿县| 山东| 红安县| 津市市| 安康市| 江孜县| 自治县| 沙湾县| 平安县| 隆化县| 汪清县|