11 線性表的順序儲存結構
看圖
上一節中,建立了一個抽象類List,用來在程式中描述線性表的,但是這List類只有這些線性表操作的宣告,並沒有實際定義,所以還沒有可以操作的線性表,線性表是用來組織線性關係的元素的,如何組織?需要一定的儲存單元
線性表的順序儲存結構
順序儲存的定義
- 線性表的順序儲存結構,指的是用一塊地址連續的儲存單元依次儲存線性表中的資料元素
設計思路
- 可以用一維陣列(固定大小)來實現順序儲存結構
- 儲存空間:T* m_array;
- 當前長度: int m_length;
template < typename T >
class SeqList : public List<T>
{
protected:
T* m_array; //指向一個陣列
int m_length; //記錄當前線性表的長度
};
基於陣列,如何獲取元素呢?
順序儲存結構的元素獲取操作
- 判斷目標位置是否合法
- 將目標位置作為陣列下標獲取元素
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
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
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 個元素。因此,順序表的特點是表中元素的邏輯順序與其物理
順序相同。

注意:線性表中元素的位序是從1開始的,而陣列中元素的下標是從0開始的。一維陣列可以是靜態分配的,也可以是動態分配的。
**靜態分配:**在靜態分配時,由於陣列的大小和空間實現已經固定,一旦空間佔滿,再加入新的資料將會產生溢位,進而導致程式崩潰。
**動態分配:**在動態分配時,由於儲存陣列的空間是在程式執行過程中通過動態儲存分配語句分配的,一旦資料空間佔滿,就另外開闢一塊更大的儲存空間,用以替換原來的儲存空間,從而達到擴充儲存陣列空間的目的,而不需要為線性表一次性地劃分所有空間。
**注意:**動態分配並不是鏈式儲存,它同樣屬於順序儲存結構,物理結構沒有變化,依然是隨機存取方式,只是分配的空間大小可以在執行時決定。
順序表的特點
順序表最主要的特點是隨機訪問,即通過首地址和元素序號可在時間O(1)內找到指定的元素。
順序表的儲存密度高,每個結點只儲存資料元素。
順序表邏輯上相鄰的元素物理上也相鄰,所以插入和刪除操作需要移動大量元素。
順序表在儲存二叉樹的時候,適合儲存完全二叉樹,按層序遍歷。對於非完全二叉樹,會存在空值元素。
文章內容來源:
狄泰軟體學院資料結構教程
王道考研論壇
相關文章
- 迴圈結構
- 分支結構
- python儲存超大資料excel表格——大於65532
- 藍芽協議體系結構
- RMQ——支援合併和優先順序的訊息佇列
- python pandasDataframe按指定index名或columns名(行名或列名)順序修改輸出內容的排列順序
- flinkSql join redis的hash結構維表簡單實現
- 《演算法筆記》2.4小節——C/C++快速入門->迴圈結構 例題5-1-1 連續自然數求和
- 資料結構與演算法 -PTA選擇判斷複習題(持續更新中)
- 軟體體系結構評估
- 【c++】結構體sort排序
- BERT微調進行命名實體識別並將模型儲存為pb形式
- Keras輸出網路結構圖
- 順序佇列模板簡單應用演算法設計:解碼(為何會陷入無限死迴圈?)
- 檔案的邏輯結構、檔案目錄
- SQL Server 批量生成資料庫內多個表的表結構
- 三、金融業企業服務匯流排鏈路追蹤監控分析平臺的建設實踐--CASSANDRA儲存方案
- 結構體記憶體對齊
- html常用編寫軟體以及基本結構
- 順序表實現二分排序