回覆列表
  • 1 # 程式設計老大叔

    我們都知道,資料結構在程式設計領域是一門十分重要的知識,因為程式說白了就是資料的運算,那麼資料運算時建立在資料儲存的基礎上的。雖然現在的高階語言在日常開發中可能用不到資料結構,因為語言本身給大家提供了豐富的資料儲存型別,比如說C#的List、Array、Dictionary、Queue等,又比如C++的STL,但是這並不代表我們就不需要去學習資料結構了,如果後續你需呀做到架構師,這門知識是不可或缺的。

    理解概念

    說起連結串列,我們是不是很容易想起‘鏈條啊

    對,沒錯,就是這種一節一節連線起來的鏈條,我們用圖示將之形象化一下(畫的很醜,大家別介意哈~~):

    如上圖,鏈條它每一節在物理上他其實是連續的對吧,是一節緊挨著一節。怎麼樣,有沒有很想C/C++裡的陣列啊,也就是資料結構裡的順序表。但是這種不能動態增加啊,而實際開發中我們有時陣列個數是不確定的,這怎麼辦呢?能不能用一節加一節,所以連結串列的概念就因此而生了。

    我們能不能將鏈條的連線處(圖上紅點)斷開,但是又加上某種聯絡,讓我能透過這種聯絡透過前一個能夠找到後一個。這樣我們又想到什麼?

    家族比喻

    這個比喻在連結串列中成立的先決條件是:(假設每家地址都只有前一家知道)否則就是樹形結構了

    這個比喻我覺得十分的適當,那就是家族。大家想,以前的家族大家都強調說住在一塊,房子都是一家挨著一家的,這樣的好處是我只需要知道家族的地址和你家排第幾我就能找到你家對吧,但是後面改革開放了,很多人背井離鄉發展,或者人多土地不夠了需要去別地建房子,但是血緣不能斷啊,於是我們就將各自的家庭地址互相聯絡,那這樣,我是不是就可以這樣找你,我透過你大伯知道你二伯的地址,再透過你二伯得到你家的地址,然後去家地址上是不是就能找到你父親啦。

    怎麼樣,這樣我是不是就可以透過你大伯就能將你爸爸那一輩的所有家庭都找到啊,這就是連結串列。我們也用圖示將之形象化:

    圖中一個節點分兩塊,一塊為存放資料的資料域(家庭成員),一塊為存放指向下一個結點的地址的指標稱為指標域(別人家的地址)。

    建立連結串列

    接下來我們來簡單的建立一個連結串列:

    1、首先你要構造好一個節點的資料結構,為了簡單,我這裡就存放一個整型資料和一個指向下一節點的指標

    程式碼截圖並且在右上角附上了思路說明圖:其實核心就在中間節點p上,首先我是讓p和head指向同一塊記憶體,這樣在新增第一個節點後透過p->next = temp ;這行程式碼將head的頭部作用確立,只要他的next指向第二個節點就可以了。這裡要說一下,可能很多人不明白明明是

    p->next = temp ;那為什麼head->next 也會= temp,其實這就是指標的神奇之處,因為前面說過(如右上角圖,此時的p和head還是指向同一個地址,在這裡p->next = temp就是講地址上的next賦值了,改變的是地址上的值,所以只要是指向這個地址的所有指標的next值都是一樣的)。

    好,第一個節點加進去之後,後面的照樣走,迴圈就好了。最後需要注意的一個點是,最後一節點是沒有指向的,記得將之置為空。

    測試驗收

    我們測試一下:

    執行看一下:

    總結

    其實,連結串列的概念理解起來並不難,稍微難的是難在怎麼用程式碼去實現需要會靈活的運用指標

  • 中秋節和大豐收的關聯?
  • 正德朝首輔梁儲真的是君子嗎?梁儲是否有過缺失?