Python之數據結構--線性表

線性表

    線性表的定義是描述其邏輯結構,而通常會在線性表上進行的查找、插入、刪除等操作。

    線性表作爲一種基本的數據結構類型,在計算機存儲器中的存儲一般有兩種形式,一種是順序存儲,一種是鏈式存儲。

    線性表的順序存儲

          1. 定義

              若將線性表L=(a0,a1, ……,an-1)中的各元素依次存儲於計算機一片連續的存儲空間,這種機制表示爲線性表的順序存儲            結構。

          2. 特點

             邏輯上相鄰的元素 ai, ai+1,其存儲位置也是相鄰的;

             存儲密度高,方便對數據的遍歷查找。

             對錶的插入和刪除等運算的效率較差。

         3. 程序實現

             在Python中,list存放於一片單一連續的內存塊,故可藉助於列表類型來描述線性表的順序存儲結構,而且列表本身就提           供了豐富的接口滿足這種數據結構的運算。

>>>L = [1,2,3,4]
>>>L.append(10) #尾部增加元素
L
[1, 2, 3, 4, 10]
>>>L.insert(1,20) #插入元素
L
[1, 20, 2, 3, 4, 10]
>>>L.remove(3) #刪除元素
L
[1, 20, 2, 4, 10]
>>>L[4] = 30 #修改
L
[1, 20, 2, 4, 30]
>>>L.index(2) #查找
2

 

    線性表的鏈式存儲

          1. 定義

              將線性表L=(a0,a1,……,an-1)中各元素分佈在存儲器的不同存儲塊,稱爲結點,每個結點(尾節點除外)中都持有一個指向下一個節點的引用,這樣所得到的存儲結構爲鏈表結構。

          2. 特點

              邏輯上相鄰的元素 ai, ai+1,其存儲位置也不一定相鄰;

              存儲稀疏,不必開闢整塊存儲空間。

              對錶的插入和刪除等運算的效率較高。

              邏輯結構複雜,不利於遍歷。

         3. 程序實現

示例:

"""
    (重點)鏈式存儲示例:
    思路:
        1、結點如何表示?
            自定義對象:代表數據元素
            元素數據:自身數據+下一個對象地址數據
        2、如何建立關聯?
            利用屬性存儲下一個對象地址
        3、實現什麼樣的鏈表操作?
            初始化--顯示--追加--插入--刪除--根據索引取值--獲取長度--是否爲空--清空
"""


class Node:
    def __init__(self, name, n=None):
        self.name = name  # 自身數據
        self.next = n  # 下一個結點

    def __str__(self):
        return str(self.name)


class LinkList:
    def __init__(self):
        self.head = Node(None)

    # 初始化數據
    def init_list(self, list_data):
        p = self.head
        for item in list_data:
            p.next = Node(item)
            p = p.next

    # 顯示數據
    def show(self):
        p = self.head.next
        while p:
            print(p, end=" ")
            p = p.next
        print()

    # 末尾添加數據
    def append(self, value):
        last = self.head
        while last.next is not None:
            last = last.next
        last.next = Node(value)

    # 指定位置插入
    def insert(self, index, value):
        node = Node(value)
        length = self.length()
        if index >= length:
            self.append(node)
            return
        i = 0
        p = self.head
        while i < index:
            i += 1
            p = p.next
        node.next = p.next
        p.next = node

    # 刪除
    def delete(self, item):
        p = self.head
        while p.next:
            if p.next.name == item:
                p.next = p.next.next
                break
            else:
                raise ValueError("value not in list")
            p = p.next

    # 根據索引獲取值
    def get(self, index):
        i = 0
        item = self.head
        while item.next:
            if i == index:
                return item.next
            item = item.next
            i += 1
        else:
            raise IndexError("index out of range")

    # 返回長度
    def length(self):
        length = 0
        last = self.head
        while last.next:
            length += 1
            last = last.next
        return length

    # 返回是否爲空
    def is_empty(self):
        return False if self.head.next else True

    # 清空鏈表
    def clear(self):
        self.head.next = None


if __name__ == '__main__':
    link_list = LinkList()
    link_list.init_list([1, 2, 3])
    link_list.delete(2)
    link_list.show()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章