串列(Linked List):
是一種基本的資料結構,我們可以用struct來做出來,它的基本樣子如下。
有人會問,啊~~我們都有陣列了,為啥還要使用串列這個看起來很複雜的東西呢?
陣列與串列的比較:
1、存取:
陣列裡的每個資料在記憶體裡是連續分部的,所以存取特定位置的值就很方便,例如使用a[2]就可以取得第3個資料的值。
陣列的記憶體分布 |
PS:那個first是指向第一個元素的指標,在串列生成時它就存在了,固定指著第一個元素的位置。
串列的記憶體分布 |
2、新增、移除資料:
再來是陣列的大小,它是固定的。
陣列的大小(通常)是在一開始就要宣告好的(除非動態宣告啦) |
移除陣列的某一元素也滿麻煩的(如果你想保持資料的連續性的話)
那個最後面的數字被蓋過去也沒差 |
同樣的,如果這個陣列裡也是有上萬筆資料,那做起來也會超麻煩。
我們接著來看看串列的新增與移除。
這樣就新增好一筆資料了 |
不管我們的串列有多大,想要在當中新增一筆資料,做的都是那幾件事(除非是加在最前面或最後面,這之後會談到)。開新空間、把要當它前一筆資料的struct的指標指向新開的記憶體空間、最後把值給新的struct並把新struct的指標指向要當它後一筆資料的struct的位置。
接著是刪除,刪除就更簡單了。
PS:因為struct的空間都是動態分配的,所以那個值為2的struct在程式結束後,並不會釋出它的記憶體空間,需要我們手動去釋放,如果沒釋放的話,它會一直佔著,直到電腦關機。
3、搜尋特定的值:
這部分,陣列跟串列是差不多的(如果資料沒有排序過的話),通常就是從頭到尾,一個一個慢慢的找。
總結:
以下是使用串列來做題目的好處。
1、插入、移除資料很快速又方便(雖然我們不會用到移除),因為題目有要求資料要排序過,所以只要使用串列,把新的資料直接插到對的地方,這樣就不用再排了。
2、串列可以動態調整大小,有新資料的話就開一個新的空間,然後讓某個struct裡的指標指向新開的空間就好了。
3、用串列有加分。
贊旭讚啦
回覆刪除yep
刪除