内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

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

鏈表是由一個個結點構成,而每一個結點都是由存儲數(shù)據(jù)的數(shù)據(jù)域以及存儲下一個結點地址的地址域兩部分構成。

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

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

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

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

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

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

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指向下一個結點
        ++j;
    
    }
    
    if ( p == NULL || j > i )
    return ERROR;
    
    *e = p->data;

}

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

代碼如下:

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

  因為,之前我們是假設有5個元素,并且是假設在第4個元素之前插入數(shù)據(jù),那假設我要在第6個元素之前插入數(shù)據(jù),那么怎么辦呢?很多人就說了,這不可能的,因為,一共就5個數(shù)據(jù),你怎么插入在第6個元素之前,你這不是扯淡嗎。沒錯,但是,程序并不知道,如果,我們從鍵盤輸入的是第6個數(shù)據(jù),那么,毫無疑問的程序就會出現(xiàn)bug。所以,我們在做元素的插入之前,我們的判斷插入的位置合不合理。如果不合理,那么我們就返回一個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 ) );  //動態(tài)申請一個結點
    s->data = e;
    s->next = p->next;
    p->next = s;
    
    return OK;

}

  最后,就是單鏈表元素的刪除操作。與元素的插入操作類似,我們在刪除之前要判斷它刪除點是否有問題,如果刪除點有問題,那么就返回一個ERROR。

  那么,我們應該如何刪除一個結點元素呢?假設我們仍然有5個結點元素,現(xiàn)在我們想要刪除第3個結點的元素。那么我們應該如何做呢?首先,我們很清楚的是,第3個結點的后繼指針中保存著第4個結點的地址,如果,刪除第3個結點,那么豈不是第4個結點的地址也跟著丟失了,那豈不是這根鏈表就斷開來了。所以,在刪除第3個結點之前,就得把第3個結點的后繼指針中的值保存下來。然后,將第3個結點的地址保存在第2個結點的后繼指針中。代碼如下:

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

其實,以上兩條語句可以用一條語句來代替,

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

  最后,刪除了結點之后,還得釋放該結點。

代碼如下:

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;

}

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

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

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

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

廣告

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

成都定制網(wǎng)站建設
阜城县| 盐源县| 湘潭县| 新巴尔虎左旗| 汉阴县| 濉溪县| 祁连县| 玛纳斯县| 延庆县| 龙井市| 荣昌县| 白水县| 鹿邑县| 安多县| 呈贡县| 中牟县| 紫阳县| 无锡市| 社旗县| 辽中县| 万盛区| 沁源县| 监利县| 余姚市| 锦州市| 武隆县| 怀集县| 阳城县| 辉县市| 镇康县| 曲阳县| 泾阳县| 浦北县| 房山区| 沾化县| 东明县| 沁水县| 林甸县| 湘阴县| 特克斯县| 大洼县|