數據結構學習筆記之線性表
阿新 • • 發佈:2018-10-21
所有 圖片 指定 表頭 rem 過程 序列 位置 png
一、概念
什麽是線性表呢? 一個簡單的理解如下:
線性表是由稱為元素(Element)的數據項組成的一種有限且有序的序列
其中,這裏有一個需要註意的地方:
- 有序是指線性表中的每個元素都有自己的位置,而不是指線性表中的元素按某種順序排列
二、抽象數據類型定義
要給數據結構定義一種恰當的表示方法,我們首先要考慮到這種表示法要支持的基本操作,以及完成對應操作所需的時空復雜度等因素,那麽對於線性表來說有哪些常見的操作呢?
- 初始化和重新初始化一個線性表
- 在長度上可以伸長和縮短
- 可以在線性表上任何位置插入和刪除元素
- 獲取或者更改元素的值
下面我們依據線性表的基本操作,使用 C++ 來定義線性表的抽象數據類型(ADT),該 ADT 中包含的關鍵設計是對當前位置的操作支持,我們來看看具體每一個函數所完成的工作吧
class List
public
List() {}
// 默認構造函數virtual ~List() {}
// 析構函數List(const List&) {}
// 復制構造函數void operator =(const List&) {}
// 重載賦值運算符virtual void clear() = 0;
// 清空線性表virtual void insert(const E& item) = 0;
// 在當前位置插入一個元素virtual void append(const E& item) = 0;
// 在表尾追加一個元素virtual E remove() = 0;
virtual void moveToStart() = 0;
// 將當前位置移動到表頭(表頭是指線性表的開始節點)virtual void moveToEnd() = 0;
// 將當前位置移動到表尾(表尾是指線性表的結尾節點)virtual void moveToPos(int pos) = 0;
// 將當前位置移動到指定位置virtual void prev() = 0;
// 將當前位置前移一個位置virtual void next() = 0;
// 將當前位置後移一個位置virtual int length() const = 0;
// 返回線性表的長度(線性表的長度指當前線性表儲存的元素數目)virtual int currPos() const = 0;
// 返回當前位置virtual const E& getValue() const = 0;
// 返回當前位置的元素的值
完整代碼(包含詳細註釋)請看:https://github.com/Forwhfang/Data-Structure/blob/master/list.h
三、順序表
線性表的實現有兩種標準的方法,一種是順序表(Sequential List),另一種是鏈表(Linked List),這裏我們先講解順序表的實現,整體的代碼框架以及實現分析如下:
class slist : public list (Sequential List 基於數組實現)
私有數據成員:
- int maxSize // 順序表的容量
- int listSize // 順序表的長度
- int curr // 當前元素位置,順序表中沒有元素存在時 -> -1,順序表中有元素存在時 -> [0, size-1]
- E* listArray[] // 順序表元素指針,用於操作每一個元素
公有成員函數:
SList(int _size = DEFAULT_SIZE)
// 默認構造函數SList(const SList& obj)
// 復制構造函數void operator =(const SList& obj)
// 重載賦值運算符~SList() {}
// 析構函數void clear()
// 清空線性表 //void insert(const E& item)
// 在當前位置插入一個元素,當在線性表中隨機插入一個元素時,插入位置後的所有元素必須向後移動一個位置以騰出空間,如果線性表中有 n 個元素,則這個過程需要花費 Θ(n) 時間void append(const E& item)
// 在表尾追加一個元素item 在末尾插入一個元素,需要花費的時間為 Θ(1)E remove()
// 刪除當前位置的一個元素,和插入元素的原理類似,當在線性表中隨機刪除一個元素時,刪除位置後的所有元素必須向前移動一個位置以填滿空間,如果線性表中有 n 個元素,則這個過程需要花費 Θ(n) 時間void moveToStart()
// 將當前位置移動到表頭,將 curr 移動到表頭元素位置,時間復雜度為 Θ(1)void moveToEnd()
// 將當前位置移動到表尾,將 curr 移動到表尾元素位置,時間復雜度為 Θ(1)void moveToPos(int pos)
// 將當前位置移動到指定位置,將 curr 移動到指定元素位置,時間復雜度為 Θ(1)void prev()
// 將當前位置前移一個位置,將 curr 減一,時間復雜度為 Θ(1)void next()
// 將當前位置後移一個位置,將 curr 加,時間復雜度為 Θ(1)int length() const
// 返回線性表的長度,返回 size 的值,時間復雜度為 Θ(1)int currPos() const
// 返回當前位置,返回 curr 的值,時間復雜度為 Θ(1)const E& getValue() const
// 返回當前位置的元素的值,返回 listarray[curr] 的值,時間復雜度為 Θ(1)
完整代碼(包含詳細註釋)請看:https://github.com/Forwhfang/Data-Structure/blob/master/slist.h
數據結構學習筆記之線性表