1. 程式人生 > >數據結構學習筆記之線性表

數據結構學習筆記之線性表

所有 圖片 指定 表頭 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

數據結構學習筆記之線性表