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)內找到指定的元素。
順序表的儲存密度高,每個結點只儲存資料元素。
順序表邏輯上相鄰的元素物理上也相鄰,所以插入和刪除操作需要移動大量元素。
順序表在儲存二叉樹的時候,適合儲存完全二叉樹,按層序遍歷。對於非完全二叉樹,會存在空值元素。
文章內容來源:
狄泰軟體學院資料結構教程
王道考研論壇
相關文章
- 線性表之順序儲存結構
- 線性結構(順序儲存和鏈式儲存)和非線性結構的特點及區別
- 線性表的順序儲存C++程式碼C++
- 資料結構 - 線性表 - 順序表資料結構
- 考研資料結構-線性表-順序表資料結構
- 線性表的順序儲存-順序表,對“突然的自我”的否定,對自我的揚棄
- 線性表的順序儲存C++程式碼實現C++
- 資料結構與演算法 | 線性表 —— 順序表資料結構演算法
- 第2章 順序表及其順序儲存
- 線性表之鏈式儲存結構
- 資料結構知否知否系列之 — 線性表的順序與鏈式儲存篇(8000 多字長資料結構
- Day11-順序結構
- C#資料結構-二叉樹-順序儲存結構C#資料結構二叉樹
- 線性表的使用——順序實現
- 第3章 順序表的鏈式儲存
- 佇列-順序儲存佇列
- 棧1: 順序儲存
- 【資料結構】二叉樹(順序儲存、鏈式儲存)的JAVA程式碼實現資料結構二叉樹Java
- 自學 資料結構四月二十二日_線性結構之順序表資料結構
- 線性表-順序表C語言實現C語言
- 資料結構線性表的鏈式儲存結構(單連結串列)的表示及其基本操作資料結構
- 順序結構
- 自學 資料結構四月二十三日_線性結構之順序表(2)資料結構
- 從零開始學資料結構和演算法(二)線性表的鏈式儲存結構資料結構演算法
- innodb表空間儲存結構
- 【資料結構與演算法學習】線性表(順序表、單連結串列、雙向連結串列、迴圈連結串列)資料結構演算法
- 順序結構與選擇結構
- @資料結構C/C++版(5)《棧的順序儲存結構以及進棧和出棧操作的實現》資料結構C++
- 線性表的結構詳解
- Prometheus時序資料庫-磁碟中的儲存結構Prometheus資料庫
- 資料結構(線性錶鏈式儲存)的幾個基本操作資料結構
- Day17-順序結構
- PostgreSQL:表的儲存屬性SQL
- 佇列的順序儲存--迴圈佇列的建立佇列
- 資料結構——線性表資料結構
- 資料結構 | 線性表資料結構
- 資料結構-線性表資料結構
- 資料結構—線性表資料結構