單鏈表的讀取、插入與刪除-創(chuàng)新互聯(lián)

鏈表是由一個(gè)個(gè)結(jié)點(diǎn)構(gòu)成,而每一個(gè)結(jié)點(diǎn)都是由存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)域以及存儲(chǔ)下一個(gè)結(jié)點(diǎn)地址的地址域兩部分構(gòu)成。

創(chuàng)新互聯(lián)建站基于成都重慶香港及美國(guó)等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動(dòng)大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專(zhuān)業(yè)服務(wù)器托管報(bào)價(jià),主機(jī)托管價(jià)格性?xún)r(jià)比高,為金融證券行業(yè)成都服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨(dú)享,G口帶寬及機(jī)柜租用的專(zhuān)業(yè)成都idc公司。

  鏈表的一大優(yōu)點(diǎn)就是,可以在任意兩個(gè)數(shù)之間毫無(wú)限制的插入無(wú)限多的數(shù)據(jù)。在很多時(shí)候,我們都需要對(duì)數(shù)據(jù)做個(gè)查找工作,就比如,一個(gè)班的同學(xué)去上課,結(jié)果老師發(fā)現(xiàn)人數(shù)不對(duì),于是就開(kāi)始點(diǎn)名,點(diǎn)到后來(lái)發(fā)現(xiàn)某某某同學(xué)沒(méi)有到,這就是典型的數(shù)據(jù)查找。那么如何實(shí)現(xiàn)對(duì)鏈表的數(shù)據(jù)元素的查找呢?

比如,我想知道鏈表的第5個(gè)元素的值是多少,我應(yīng)該怎么做呢?由于,鏈表是依靠地址來(lái)查找數(shù)據(jù)的,那比如說(shuō)鏈表的第一個(gè)結(jié)點(diǎn)的數(shù)據(jù)域中保存了某一個(gè)元素值,而它的地址域中則保存了下個(gè)結(jié)點(diǎn)的地址,也就是說(shuō),每一個(gè)結(jié)點(diǎn)的地址都被保存在上一個(gè)結(jié)點(diǎn)的地址域中。那么,很明顯,第5個(gè)元素的地址被保存在了第4個(gè)元素的地址域中,那么,也就是說(shuō),我想知道第5個(gè)元素在哪個(gè)位置,我首先得知道第四個(gè)元素在什么位置,那么以此類(lèi)推,就需要知道第1個(gè)元素的存儲(chǔ)位置,也就是說(shuō),我想要知道第5個(gè)元素的存儲(chǔ)的位置,我首先就得從鏈表的頭部開(kāi)始查找。那么,我想知道鏈表的第i個(gè)元素的位置,我還是得從表頭開(kāi)始查起。很明顯,想要知道第i個(gè)元素的位置,就需要申明一個(gè)循環(huán)變量j以及一個(gè)指針變量p來(lái)遍歷鏈表。

單鏈表的讀取、插入與刪除

  當(dāng)然,想要查找鏈表的元素,前提還得是鏈表不能為空,如果為空,那元素怎么可能查得到。這就好比,一個(gè)班的同學(xué)都沒(méi)去上課,那老師還用的著點(diǎn)名嗎,根本就沒(méi)有點(diǎn)名的必要性了。

那么,查找單鏈表的一個(gè)元素,代碼如下:

Status GetElem ( LinkList L, int i, ElemType e *e )
{
    int j;
    LinkList p;
    
    j = 1;
    p = L->next;
    while ( p != NULL && j < i ){
        
        p = p->next;   //p指向下一個(gè)結(jié)點(diǎn)
        ++j;
    
    }
    
    if ( p == NULL || j > i )
    return ERROR;
    
    *e = p->data;

}

  接下來(lái),就是關(guān)于單鏈表的元素插入了。假設(shè),一個(gè)鏈表有5個(gè)元素,也就是它有1~5這五個(gè)結(jié)點(diǎn),那么我想在第4個(gè)結(jié)點(diǎn)之前插入一個(gè)新的元素,那我該怎么做呢?也就是說(shuō),這個(gè)元素我會(huì)插入在第3和第4個(gè)元素之間。很明顯的一點(diǎn)就是,第4個(gè)結(jié)點(diǎn)的地址保存在第3個(gè)結(jié)點(diǎn)的后繼指針中,那么,我想插入這個(gè)結(jié)點(diǎn)s,那豈不是我首先要把第4個(gè)結(jié)點(diǎn)的地址保存下來(lái),也就是說(shuō)我首先要向第3個(gè)結(jié)點(diǎn)索要第4個(gè)結(jié)點(diǎn)的地址,然后,再把s的地址給第3個(gè)結(jié)點(diǎn)p。

代碼如下:

s->next = p->next;
p->next = s;

  因?yàn)?,之前我們是假設(shè)有5個(gè)元素,并且是假設(shè)在第4個(gè)元素之前插入數(shù)據(jù),那假設(shè)我要在第6個(gè)元素之前插入數(shù)據(jù),那么怎么辦呢?很多人就說(shuō)了,這不可能的,因?yàn)椋还簿?個(gè)數(shù)據(jù),你怎么插入在第6個(gè)元素之前,你這不是扯淡嗎。沒(méi)錯(cuò),但是,程序并不知道,如果,我們從鍵盤(pán)輸入的是第6個(gè)數(shù)據(jù),那么,毫無(wú)疑問(wèn)的程序就會(huì)出現(xiàn)bug。所以,我們?cè)谧鲈氐牟迦胫埃覀兊呐袛嗖迦氲奈恢煤喜缓侠?。如果不合理,那么我們就返回一個(gè)ERROR值。代碼如下:

Status ListInsert ( LinkList *L, int i, ElemType e )
{
    int j;
    LinkList p;
    
    p = *L;
    j = 1;
    while ( p != NULL && j < i ){
    
        p = p->next;
        ++j;
    }
    
    if ( p == NULL || j > i )
    return ERROR;
    
    s = ( LinkList ) malloc ( sizeof ( struct Node ) );  //動(dòng)態(tài)申請(qǐng)一個(gè)結(jié)點(diǎn)
    s->data = e;
    s->next = p->next;
    p->next = s;
    
    return OK;

}

  最后,就是單鏈表元素的刪除操作。與元素的插入操作類(lèi)似,我們?cè)趧h除之前要判斷它刪除點(diǎn)是否有問(wèn)題,如果刪除點(diǎn)有問(wèn)題,那么就返回一個(gè)ERROR。

  那么,我們應(yīng)該如何刪除一個(gè)結(jié)點(diǎn)元素呢?假設(shè)我們?nèi)匀挥?個(gè)結(jié)點(diǎn)元素,現(xiàn)在我們想要?jiǎng)h除第3個(gè)結(jié)點(diǎn)的元素。那么我們應(yīng)該如何做呢?首先,我們很清楚的是,第3個(gè)結(jié)點(diǎn)的后繼指針中保存著第4個(gè)結(jié)點(diǎn)的地址,如果,刪除第3個(gè)結(jié)點(diǎn),那么豈不是第4個(gè)結(jié)點(diǎn)的地址也跟著丟失了,那豈不是這根鏈表就斷開(kāi)來(lái)了。所以,在刪除第3個(gè)結(jié)點(diǎn)之前,就得把第3個(gè)結(jié)點(diǎn)的后繼指針中的值保存下來(lái)。然后,將第3個(gè)結(jié)點(diǎn)的地址保存在第2個(gè)結(jié)點(diǎn)的后繼指針中。代碼如下:

q = p->next;
p->next = q->next;

其實(shí),以上兩條語(yǔ)句可以用一條語(yǔ)句來(lái)代替,

p->next = p->next->next;

  最后,刪除了結(jié)點(diǎn)之后,還得釋放該結(jié)點(diǎn)。

代碼如下:

Status ListDelete ( LinkList *L, int i, ElemType *e )
{
    int j;
    LinkList p;
    LinkList q;
    
    p = *L;
    j = 1;
    while ( p != NULL && j < i ){
        
        p = p->next;
        ++j;
    }
    
    if ( p == NULL || j > i )
    return EEROR;
    
    q = p->next;
    p->next = q->next;
    
    free ( q );
    
    return OK;

}

到這里,基本上,對(duì)單鏈表的插入,刪除,以及元素的獲取就差不多了。事實(shí)上,對(duì)單鏈表的操作并不復(fù)雜,只要,對(duì)幾個(gè)關(guān)鍵數(shù)據(jù)進(jìn)行預(yù)先判別,那么,出現(xiàn)bug的幾率就會(huì)降低很多。

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

網(wǎng)頁(yè)標(biāo)題:單鏈表的讀取、插入與刪除-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://bm7419.com/article0/gesoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名網(wǎng)站改版、網(wǎng)站策劃服務(wù)器托管、商城網(wǎng)站、網(wǎng)站建設(shè)

廣告

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

成都定制網(wǎng)站建設(shè)