我們都知道,數據結構在編程領域是一門十分重要的知識,因為程序說白了就是數據的運算,那么數據運算時建立在數據存儲的基礎上的。雖然現在的高級語言在日常開發中可能用不到數據結構,因為語言本身給大家提供了豐富的數據存儲類型,比如說C#的List、Array、Dictionary、Queue等,又比如C++的STL,但是這并不代表我們就不需要去學習數據結構了,如果后續你需呀做到架構師,這門知識是不可或缺的。
下面小編就跟大家一起來看一下C/C++怎么去實現一個簡單的單向鏈表,希望從中能讓大家對鏈表有一個清晰的認識。
理解概念
說起鏈表,我們是不是很容易想起‘鏈條啊
對,沒錯,就是這種一節一節連接起來的鏈條,我們用圖示將之形象化一下(畫的很丑,大家別介意哈~~):
如上圖,鏈條它每一節在物理上他其實是連續的對吧,是一節緊挨著一節。怎么樣,有沒有很想C/C++里的數組啊,也就是數據結構里的順序表。但是這種不能動態增加啊,而實際開發中我們有時數組個數是不確定的,這怎么辦呢?能不能用一節加一節,所以鏈表的概念就因此而生了。
我們能不能將鏈條的連接處(圖上紅點)斷開,但是又加上某種聯系,讓我能通過這種聯系通過前一個能夠找到后一個。這樣我們又想到什么?
家族比喻
這個比喻在鏈表中成立的先決條件是:(假設每家地址都只有前一家知道)否則就是樹形結構了
這個比喻我覺得十分的適當,那就是家族。大家想,以前的家族大家都強調說住在一塊,房子都是一家挨著一家的,這樣的好處是我只需要知道家族的地址和你家排第幾我就能找到你家對吧,但是后面改革開放了,很多人背井離鄉發展,或者人多土地不夠了需要去別地建房子,但是血緣不能斷啊,于是我們就將各自的家庭地址互相聯系,那這樣,我是不是就可以這樣找你,我通過你大伯知道你二伯的地址,再通過你二伯得到你家的地址,然后去家地址上是不是就能找到你父親啦。
怎么樣,這樣我是不是就可以通過你大伯就能將你爸爸那一輩的所有家庭都找到啊,這就是鏈表。我們也用圖示將之形象化:
圖中一個節點分兩塊,一塊為存放數據的數據域(家庭成員),一塊為存放指向下一個結點的地址的指針稱為指針域(別人家的地址)。
創建鏈表
接下來我們來簡單的創建一個鏈表:
代碼截圖并且在右上角附上了思路說明圖:其實核心就在中間節點p上,首先我是讓p和head指向同一塊內存,這樣在新增第一個節點后通過p->next=temp;這行代碼將head的頭部作用確立,只要他的next指向第二個節點就可以了。這里要說一下,可能很多人不明白明明是
p->next=temp;那為什么head->next也會=temp,其實這就是指針的神奇之處,因為前面說過(如右上角圖,此時的p和head還是指向同一個地址,在這里p->next=temp就是講地址上的next賦值了,改變的是地址上的值,所以只要是指向這個地址的所有指針的next值都是一樣的)。
好,第一個節點加進去之后,后面的照樣走,循環就好了。最后需要注意的一個點是,最后一節點是沒有指向的,記得將之置為空。
測試驗收
我們測試一下:
運行看一下:
總結
其實,鏈表的概念理解起來并不難,稍微難的是難在怎么用代碼去實現需要會靈活的運用指針