11 線性表的順序儲存結構

tedtjy 發表於 2020-11-19

看圖
image-20201119121613586
上一節中,建立了一個抽象類List,用來在程式中描述線性表的,但是這List類只有這些線性表操作的宣告,並沒有實際定義,所以還沒有可以操作的線性表,線性表是用來組織線性關係的元素的,如何組織?需要一定的儲存單元

線性表的順序儲存結構


順序儲存的定義

  • 線性表的順序儲存結構,指的是用一塊地址連續的儲存單元依次儲存線性表中的資料元素

設計思路

  • 可以用一維陣列(固定大小)來實現順序儲存結構
    • 儲存空間:T* m_array;
    • 當前長度: int m_length;
template < typename T >
class SeqList : public List<T>
{
protected:
	T* m_array; //指向一個陣列
	int m_length; //記錄當前線性表的長度
};

基於陣列,如何獲取元素呢?

順序儲存結構的元素獲取操作

  1. 判斷目標位置是否合法
  2. 將目標位置作為陣列下標獲取元素
bool SeqList<T>::get(int i, T& e) const
{
	bool ret = ((0 <= i) && (i < m_length)); //判斷目標位置是否合法
	if( ret )
	{
		e = m_array[i]; // 將目標位置作為陣列下標獲取元素
	}
	return ret;
}

順序儲存結構的元素插入操作

  1. 判斷目標位置是否合法
  2. 將目標位置之後的所有元素後移一個位置
  3. 將新元素插入目標位置
  4. 線性表長度加1
bool SeqList<T>::insert(int i, const T& e)
{
	bool ret = ( (0 <=  i) && (i <= m_length) ); // 五個元素由六個插入位置,類比手指記憶,所以取等了
	ret = ret && ( (m_length + 1 ) <= capacity() ); // 小於順序儲存結構的最大儲存容量
	
	if ( ret )
	{
		for(int p=m_length-1; p>=i; p--) // 將目標位置之後的所有元素後移一個位置
		{
			m_array[p + 1] = m_array[p];
		}
		
		m_array[i] = e; // 將性元素插入目標位置
		m_length++; //線性表長度加1
	}
    
	return ret;
}

順序儲存結構的元素刪除操作

  1. 判斷目標位置是否合法
  2. 將目標位置後的元素前移一個位置
  3. 線性表長度減1
bool SeqList<T>::remove(int i)
{
	bool ret = ( (0 <= i) && (i < m_length) ); //判斷目標位置是否合法
	
	if( ret )
	{
		for (int p=i; p<m_length-1; p++) //將目標位置後的元素前移一個位置
		{
			m_array[p] = m_array[p+1];
		}
		
		m_length--; //線性表長度減1
	}
	
	return ret;
}

順序表

線性表的順序儲存又稱為順序表。它是用一組地址連續的儲存單元,依次儲存線性表中的資料元素,

從而使得邏輯上相鄰的兩個元素在物理位置上也相鄰。第 1 個元素儲存線上性表的起始位置,第 i 個元素

元素的儲存位置後面緊接著儲存的是第 i + 1 個元素。因此,順序表的特點是表中元素的邏輯順序與其物理

順序相同。

img

注意:線性表中元素的位序是從1開始的,而陣列中元素的下標是從0開始的。一維陣列可以是靜態分配的,也可以是動態分配的。

**靜態分配:**在靜態分配時,由於陣列的大小和空間實現已經固定,一旦空間佔滿,再加入新的資料將會產生溢位,進而導致程式崩潰。

**動態分配:**在動態分配時,由於儲存陣列的空間是在程式執行過程中通過動態儲存分配語句分配的,一旦資料空間佔滿,就另外開闢一塊更大的儲存空間,用以替換原來的儲存空間,從而達到擴充儲存陣列空間的目的,而不需要為線性表一次性地劃分所有空間。

**注意:**動態分配並不是鏈式儲存,它同樣屬於順序儲存結構,物理結構沒有變化,依然是隨機存取方式,只是分配的空間大小可以在執行時決定。

順序表的特點

順序表最主要的特點是隨機訪問,即通過首地址和元素序號可在時間O(1)內找到指定的元素。

順序表的儲存密度高,每個結點只儲存資料元素。

順序表邏輯上相鄰的元素物理上也相鄰,所以插入和刪除操作需要移動大量元素。

順序表在儲存二叉樹的時候,適合儲存完全二叉樹,按層序遍歷。對於非完全二叉樹,會存在空值元素。

文章內容來源:
狄泰軟體學院資料結構教程
王道考研論壇