中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

單鏈表的整表創建以及整表刪除

發布時間:2020-07-16 17:29:38 來源:網絡 閱讀:1213 作者:BarnabyRoss 欄目:編程語言

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

    在生活中,比如,我們去超市買東西,在收銀臺結賬時就會需要排隊,很明顯,先來的排在前面,后來的排在后面,可是,總是會遇到突發情況,比如剛好有個人有急事,于是你就讓他插個隊,也就是說,排隊,既可以排在某個人的前面,也可以排在某個的后面。同樣的,鏈表元素的創建也有兩種情況,可以創建在某個元素的前面,也可以創建在某個元素的后面,即頭插法和尾插法。

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

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;
    
    }

}

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

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;

}

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

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;

}

    最后,做個小小的總結。順序存儲結構在獲取元素信息時比較方便,而鏈式存儲結構在插入或刪除數據時比較方便,所以,要根據適當的情況選擇合適的存儲結構。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

牙克石市| 芦溪县| 邹城市| 临清市| 天水市| 宜兰市| 兴仁县| 开封市| 藁城市| 隆昌县| 凤阳县| 富宁县| 青浦区| 民县| 莱州市| 贡嘎县| 陈巴尔虎旗| 商洛市| 修水县| 青州市| 绩溪县| 驻马店市| 桑植县| 兴安县| 晋江市| 仙居县| 庐江县| 乾安县| 彩票| 阳江市| 上高县| 报价| 福贡县| 黄石市| 集贤县| 丽江市| 宝丰县| 普定县| 杭锦后旗| 晋宁县| 交城县|