資料結構之連結串列與陣列(1):陣列和連結串列的簡介

發表於2015-11-11

眾所周知,在計算機中要對給定的資料集進行若干處理,首要任務是把資料集的一部分(當資料量非常大時,可能只能一部分一部分地讀取資料到記憶體中來處理)或全部儲存到記憶體中,然後再對記憶體中的資料進行各種處理。

例如,對於資料集S{1,2,3,4,5,6},要求S中元素的和,首先要把資料儲存到記憶體中,然後再將記憶體中的資料相加。

當記憶體空間中有足夠大的連續空間時,可以把資料連續的存放在記憶體中,各種程式語言中的陣列一般都是按這種方式儲存的(也可能有例外),如圖1(b);當記憶體中只有一些離散的可用空間時,想連續儲存資料就非常困難了,這時能想到的一種解決方式是移動記憶體中的資料,把離散的空間聚整合連續的一塊大空間,如圖1(c)所示,這樣做當然也可以,但是這種情況因為可能要移動別人的資料,所以會存在一些困難,移動的過程中也有可能會把一些別人的重要資料給丟失。另外一種,不影響別人的資料儲存方式是把資料集中的資料分開離散地儲存到這些不連續空間中,如圖1(d)。這時為了能把資料集中的所有資料聯絡起來,需要在前一塊資料的儲存空間中記錄下一塊資料的地址,這樣只要知道第一塊記憶體空間的地址就能環環相扣地把資料集整體聯絡在一起了。C/C++中用指標實現的連結串列就是這種儲存形式。

圖 1 記憶體分配

由上可知,記憶體中的儲存形式可以分為連續儲存和離散儲存兩種。因此,資料的物理儲存結構就有連續儲存和離散儲存兩種,它們對應了我們通常所說的陣列和連結串列。

由於陣列是連續儲存的,在運算元組中的資料時就可以根據離首地址的偏移量直接存取相應位置上的資料,但是如果要在資料組中任意位置上插入一個元素,就需要先把後面的元素集體向後移一位為其空出儲存空間。與之相反,連結串列是離散儲存的,所以在插入一個資料時只要申請一片新空間,然後將其中的連線關係做一個修改就可以,但是顯然在連結串列上查詢一個資料時就要逐個遍歷了。

考慮以上的總結可見,陣列和連結串列各有優缺點。在具體使用時要根據具體情況選擇。當查詢資料操作比較多時最好用陣列;當對資料集中的資料進行新增或刪除比較多時最好選擇連結串列。

相關文章