單鏈表的整表創(chuàng)建以及整表刪除-創(chuàng)新互聯(lián)

一條鏈表是由很多個結(jié)點元素構(gòu)成,所以,我們想要創(chuàng)建一個鏈表,只需要循環(huán)創(chuàng)建結(jié)點就可以完成這個任務(wù)了。按道理講,我們可以只創(chuàng)建帶有數(shù)據(jù)的結(jié)點就可以了,不過,為了更方便的操控鏈表以及更方便的創(chuàng)建結(jié)點,我們需要一個只保存地址域而不存放數(shù)據(jù)的一個結(jié)點,這個結(jié)點被稱作是頭結(jié)點。在鏈表正式被開始創(chuàng)建之前,我們可以讓頭結(jié)點指向空,也就是NULL。

創(chuàng)新互聯(lián)專業(yè)提供四川電信科技城機(jī)房服務(wù),為用戶提供五星數(shù)據(jù)中心、電信、雙線接入解決方案,用戶可自行在線購買四川電信科技城機(jī)房服務(wù),并享受7*24小時金牌售后服務(wù)。

    在生活中,比如,我們?nèi)コ匈I東西,在收銀臺結(jié)賬時就會需要排隊,很明顯,先來的排在前面,后來的排在后面,可是,總是會遇到突發(fā)情況,比如剛好有個人有急事,于是你就讓他插個隊,也就是說,排隊,既可以排在某個人的前面,也可以排在某個的后面。同樣的,鏈表元素的創(chuàng)建也有兩種情況,可以創(chuàng)建在某個元素的前面,也可以創(chuàng)建在某個元素的后面,即頭插法和尾插法。

    先來講頭插法。因為,在正式創(chuàng)建鏈表之前,已經(jīng)有了一個頭結(jié)點指向空。那么,當(dāng)?shù)谝粋€結(jié)點被創(chuàng)建時,該結(jié)點就要保存頭結(jié)點中的地址,然后,將頭結(jié)點的后繼指針指向第一個被創(chuàng)建的結(jié)點。當(dāng)開始創(chuàng)建第二個結(jié)點時,我們需要把第二個結(jié)點的地址域保存第一個結(jié)點的地址,然后,將頭結(jié)點指向第二個被創(chuàng)建的結(jié)點的地址。也就是說,最新別創(chuàng)建的結(jié)點,總是在上一個結(jié)點的前面,緊跟在頭結(jié)點的后面。代碼如下:

void CreateListHead ( LinkList *L, int n )
{
    int i;
    LinkList p;
    
    *L = ( LinkList ) malloc ( sizeof ( Node ) );
    *L = NULL;
    
    srand ( time ( 0 ) );
    for ( i = 0; i < n; ++i ){
        p = ( LinkList ) malloc ( sizeof ( Node ) );
        p->data = rand() % 100 + 1;
        p->next = ( *L )->next;
        
        ( *L )->next = p;
    
    }

}

    接下來,講一下鏈表的尾插法。同樣的,首先就要創(chuàng)建一個頭結(jié)點。頭結(jié)點中只保存地址沒有數(shù)據(jù),并且頭結(jié)點中的地址域指向NULL。那么接下來就要創(chuàng)建第一個結(jié)點,這個結(jié)點的后繼指針保存頭結(jié)點中存放的值,然后,把頭結(jié)點的地址域更新為第一個結(jié)點的地址。到這里為止,尾插法跟頭插法做法并無差別,接下來,差別就開始顯現(xiàn)了。當(dāng)我創(chuàng)建第二個結(jié)點時,我就要把它跟在第一個結(jié)點的后面,具體為,把第一個結(jié)點中保存的地址信息存放在第二個結(jié)點的地址域中,然后,讓第一個結(jié)點指向第二個結(jié)點。到這里為止,一切都是那么自然,那么正常。這時,我們需要創(chuàng)建第三個結(jié)點了,很明顯,我們需要像之前那樣,把第二個結(jié)點的地址中的值保存在第三個結(jié)點中,然后,讓第二個結(jié)點指向第三個結(jié)點。到這里有問題嗎?如果不仔細(xì)思考,會發(fā)現(xiàn)毫無問題,但是,若是仔細(xì)思考,就會發(fā)現(xiàn),問題是存在的。之前,在采用頭插法時,我們沒創(chuàng)建一個新的結(jié)點,都能找到上一個結(jié)點的地址,因為,這個地址就保存在頭結(jié)點中,因此,我們可以很輕松的取出上一個結(jié)點的地址。不過,在尾插法時,我們創(chuàng)建一個新的結(jié)點時,如何找到上一個結(jié)點中保存的地址呢?因為,結(jié)點在不斷的變化,所以,根本無法找到上一個結(jié)點中的地址。所以,為了解決這個問題,我們可以再申請一個指針變量來動態(tài)的跟隨結(jié)點。代碼如下:

void CreateListTail ( LinkList *L, int n )
{
    LinkList p, r;
    int i;
    p = NULL;
    r = NULL;
    
    *L = ( LinkList ) mallocc ( sizeof ( Node ) );
    *L->next = NULL;
    srand ( time ( 0 ) );
    
    r = *L;
    for ( i = 0; i < n; ++i ){
        
        p = ( LinkList ) malloc ( sizeof ( Node ) );
        p->data = rand() % 100 + 1;
        r->next = p;
        r = p;
        
    }
    
    r->next = NULL;   //p->next = NULL;

}

    最后,就是單鏈表的刪除。剛才講了單鏈表的插入,有頭插法和尾插法兩種。那么,就會問,單鏈表的刪除會不會也有頭刪和尾刪兩種呢?經(jīng)過思考,這是不可能的,因為,你想刪除一個結(jié)點,首先就得知道它的地址,而這個結(jié)點的地址被保存在上一個結(jié)點的地址域中,也就是說,你得不斷的追溯,直到找到第一個結(jié)點,也就是說,你只能從第一個結(jié)點開始刪除。那么,一思考發(fā)現(xiàn),我要是把第一個結(jié)點給刪了,那么這個鏈表不就斷了嗎,那還怎么刪除后面的元素。所以,很明顯,我們需要申請一個指針變量來動態(tài)跟隨結(jié)點。代碼如下:

Status ClearList ( LinkList *L )
{
    LinkList p, q;
    
    p = ( *L )->next;
    while ( p != NULL ){
        
       q->next = p->next;
       free ( p );
       p = q;
    
    }
    
    ( *L )->next = NULL;
    
    return OK;

}

    最后,做個小小的總結(jié)。順序存儲結(jié)構(gòu)在獲取元素信息時比較方便,而鏈?zhǔn)酱鎯Y(jié)構(gòu)在插入或刪除數(shù)據(jù)時比較方便,所以,要根據(jù)適當(dāng)?shù)那闆r選擇合適的存儲結(jié)構(gòu)。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

當(dāng)前標(biāo)題:單鏈表的整表創(chuàng)建以及整表刪除-創(chuàng)新互聯(lián)
標(biāo)題URL:http://bm7419.com/article26/gejcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄建站公司、做網(wǎng)站、用戶體驗、移動網(wǎng)站建設(shè)小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)