線性結構-線性表

weixin_33976072發表於2016-05-10

編譯環境:python v3.5.0, mac osx 10.11.4

線性表的表示

<big>例如:</big>表示一個多項式Multinomial
<big>最</big>浪費的表示方法:f(x)=4x5-3x2+1,浪費大量的儲存空間(若多項式指數差異很大,即很多儲存單元都空著,為0)

  • 陣列(計算機內連續的儲存單元)表示多項式
  • 其下標表示指數,陣列中存放的數值表示係數


    2027713-cf86e3ac3a589302.png

結構陣列儲存非零項:P1(x)= 9x12+15x8+3x^2

  • 構造結構陣列(計算機內連續的儲存單元)表示多項式。結構陣列中單元列表第一位為係數,第二位為指數。
    class Multinomial(): # 定義多項式結構陣列
    def init(self,coef,expon):
    self.coef = coef
    self.expon = expon
    2027713-44e2c6a28be684bb.png

連結串列結構儲存非零項:P1(x)= 9x12+15x8+3x^2

  • 連結串列(單元隨機儲存於計算機中)每個節點儲存多項式的非零項
  • 儲存單元包含三個小單元用來儲存係數、指數、和下一個連結串列單元的地址。
    class Multinomial():
    def init(self,chef,expon,link):
    self.coef = coef
    self.expon = expon
    self.link = None
    2027713-9d1342da1e10a9a6.png

什麼是線性表

通過上述例子實踐,我們可以發想線性表(Linear List)有如下幾個特徵:

  1. 它是由同型別資料元素構成有序序列的線性結構
  2. 表中元素的個數稱為線性表的長度
  3. 線性表沒有元素時,稱為空表
  4. 表的起始位置稱為表頭,表的結束位置稱為表尾
2027713-acbfbadbb9ea3ac5.png

線性表的順式儲存(陣列)實現

  • List MakeEmpty():初始化一個空的線性表L;
    L = []
  • ElementType FindKth(int K, List L):根據位序K,返回相應的元素;
    element = L[k]
  • int Find(ElementType X, List L):線上性L中查詢X的第一次出現的位置;
    def Find(x,list):
    i = 0
    while x != list[i] and i < len(list):
    i += 1
    if i == len(list): # 若果沒有找到返回 -1
    return -1
    else: # 找到返回下標
    return i
  • void Insert(ElementType X, int i, List L):在位序i前插入一個元素X;
    L.insert(index,x)


    2027713-81c9bfae9decbfad.png
  • void Delete(int i, List L):刪除指定位序i的元素;
    del L[i]


    2027713-f1ddafb9668b8b89.png
  • int Length(List L):返回線性表長度n;
    n = Length(L)

線性表的鏈式儲存(連結串列)實現

  • List MakeEmpty():初始化一個空的線性表L;
    class chainList():
    def init(self, value=None, Next=None): # 空表表頭
    self.Value = value
    self.Next = next

       L = chainList()
    
  • ElementType FindKth(int K, List L):根據位序K,返回相應的元素;
    def FindKth(k, chain_list):
    index = 0 # 起始序列號為0
    element = chain_list # 將指標指向第一個連結串列單元
    while index != k and element.Next is not None : # 若找到k,或者到表尾,迴圈退出
    index += 1
    element = element.Next
    if index == k : # 找到返回元素的值
    return element
    else: # 沒有返回 None
    return None

  • int Find(ElementType X, List L):線上性L中查詢X的第一次出現的位置;
    def Find(x,chain_list):
    index = 0 # 起始序列號為0
    element = chain_list # 將指標指向第一個連結串列單元
    while element.Value != x and element.Next is not None: # 若找到x,或者到表尾,迴圈退出
    index += 1
    element = element.Next
    if element.Value == x : # 找到返回元素的值
    return index
    else: # 沒有返回 None
    return None

  • void Insert(ElementType X, int i, List L):在位序i前插入一個元素X;
    def Insert(x,index ,chain_list):
    element= chainList(x) # 生成新節點
    if index == 0 : # 遇到頭節點的話則直接插入到頭節點前
    element.Next = chain_list
    return element
    elementBefore = FindKth(index-1, chain_list) # 查詢序列前一個節點
    if elementBefore is not None:
    temp = elementBefore.Next
    elementBefore.Next = element #將新節點插在index-1節點後
    element.Next = temp # 將原來的index節點插在新節點後
    del temp # 釋放記憶體
    return chain_list # 返回頭指標
    else:
    return ‘引數錯誤'


    2027713-40a9a0b5fea152a7.png
  • void Delete(int i, List L):刪除指定位序i的元素;
    def Delete(index,chain_list):
    if index == 0: # 遇到頭節點的話則直接刪除頭節點
    p = chain_list.Next
    del chain_list
    return p
    elementBefore = FindKth(index-1, L) # 查詢序列前一個節點
    if elementBefore is not None:
    temp = elementBefore.Next # 將指標指向要刪除的節點
    elementBefore.Next = temp.Next #將index-1節點指向index+1節點
    del temp # 釋放記憶體
    return chain_list #返回頭指標
    else:
    return ‘引數錯誤'


    2027713-983edbf62cb957e4.png
  • int Length(List L):返回線性表長度n;
    def Length(chain_list):
    p = chain_list # p 指向第一個節點
    count = 0
    while p.Next is not None: # p不斷指向下一個節點
    count += 1
    p = p.Next
    return count

原始碼: GitHub
<big>後續內容:

相關文章