數組和鏈表
眾所周知,在計算機中要對給定的數據集進行若幹處理,首要任務是把數據集的一部分(當數據量非常大時,可能只能一部分一部分地讀取數據到內存中來處理)或全部存儲到內存中,然後再對內存中的數據進行各種處理。
例如,對於數據集S{1,2,3,4,5,6},要求S中元素的和,首先要把數據存儲到內存中,然後再將內存中的數據相加。
當內存空間中有足夠大的連續空間時,可以把數據連續的存放在內存中,各種編程語言中的數組一般都是按這種方式存儲的(也可能有例外),如圖1(b);當內存中只有一些離散的可用空間時,想連續存儲數據就非常困難了,這時能想到的一種解決方式是移動內存中的數據,把離散的空間聚集成連續的一塊大空間,如圖1(c)所示,這樣做當然也可以,但是這種情況因為可能要移動別人的數據,所以會存在一些困難,移動的過程中也有可能會把一些別人的重要數據給丟失。另外一種,不影響別人的數據存儲方式是把數據集中的數據分開離散地存儲到這些不連續空間中,如圖1(d)。這時為了能把數據集中的所有數據聯系起來,需要在前一塊數據的存儲空間中記錄下一塊數據的地址,這樣只要知道第一塊內存空間的地址就能環環相扣地把數據集整體聯系在一起了。C/C++中用指針實現的鏈表就是這種存儲形式。
圖 1 內存分配
由上可知,內存中的存儲形式可以分為連續存儲和離散存儲兩種。因此,數據的物理存儲結構就有連續存儲和離散存儲兩種,它們對應了我們通常所說的數組和鏈表。
由於數組是連續存儲的,在操作數組中的數據時就可以根據離首地址的偏移量直接存取相應位置上的數據,但是如果要在數據組中任意位置上插入一個元素,就需要先把後面的元素集體向後移一位為其空出存儲空間。與之相反,鏈表是離散存儲的,所以在插入一個數據時只要申請一片新空間,然後將其中的連接關系做一個修改就可以,但是顯然在鏈表上查找一個數據時就要逐個遍歷了。
考慮以上的總結可見,數組和鏈表各有優缺點。在具體使用時要根據具體情況選擇。當查找數據操作比較多時最好用數組;當對數據集中的數據進行添加或刪除比較多時最好選擇鏈表。
數組和鏈表