資料結構:線性表(Python實現基本操作)

昕昕點燈發表於2020-10-03

簡介

線性表n 個資料元素有限序列。是一種常見的線性結構。

線性結構特點:

  • 第一個元素無前驅
  • 最後一個元素無後繼
  • 除第一個元素和最後一個元素外,所有的元素都有前驅和後繼

順序結構

順序表

        線性表的順序儲存結構
特點:

  • 邏輯上相鄰的元素物理位置上相鄰
  • 隨機訪問

        只要確定好了儲存線性表的起始位置,線性表中任一資料元素都可以隨機存取,所以線性表的順序儲存結構是一種隨機存取的儲存結構。通常用陣列表示順序表。

        Python實現基本操作:

List = [0,1,2,3,4,5]
# 按址查詢(地址)
List.index(2)
print(List.index(2))
# 插入(地址, 值)
List.insert(2, 3)
print(List)
# 刪除(地址)
List.pop(2)
print(List)
# 判空
ListEmpty = True if not List else False
print(ListEmpty)
# 求長
len(List)
print(len(List))

輸出:

2
[0, 1, 3, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5]
False
6

插入與刪除:
在這裡插入圖片描述

鏈式結構

單連結串列

線性表的鏈式儲存結構之一
特點:

  • 邏輯相鄰的元素物理位置不一定相鄰

下面是單連結串列的簡單結構:

        連結串列中的資料是以結點來表示的,每個結點包含兩個域,一個資料域(元素域)和一個指標域。這個指標指向連結串列中的下一個結點,而最後一個結點的指標域則指向一個空值。每個結點的構成:元素(資料元素的映象) + 指標(指示後繼元素儲存位置),元素就是儲存資料的儲存單元,指標就是連線每個結點的地址資料。在這裡插入圖片描述
基本構成:

  • 結點:每個節點有兩個部分,左邊部分稱為值域,用來存放資料;右邊部分稱為指標域,用來存放指向下一個元素的指標。
  • head(頭結點):head節點永遠指向第一個節點
  • tail(尾節點):tail永遠指向最後一個節點
  • null:連結串列中最後一個節點的指標域為None值

Python實現單連結串列操作(參考:python實現單連結串列的基本操作

class Node(object):
    def __init__(self, item):
        # 元素
        self.element = item
        # 指標
        self.next = None


# 建立單連結串列類
class SingleLinkList(object):
    def __init__(self):
        self.header = None
        self.length = 0

    # 1、判斷是否為空
    def is_empty(self):
        if self.header == None:
            return True
        else:
            return False

    # 2、頭部插入
    def add(self, node):
        # 如果為空
        if self.is_empty():
            self.header = node
        else:
            node.next = self.header
            self.header = node
            # currentNode = self.header
        self.length += 1

    # 3、尾部插入
    def append(self, node):
        current_Node = self.header
        if self.is_empty():
            self.add(node)
        else:
            # 找到最後一個結點
            while (current_Node.next != None):
                current_Node = current_Node.next
            current_Node.next = node
            self.length += 1

    # 4、指定位置插入
    def insert(self, node, index):
        current_Node = self.header
        
        if index > self.length + 1 or index <= 0:
            while (index > self.length + 1 or index <= 0):
                print("你要插入的位置不對,請重選位置:")
                index = eval(input())

        if index == 1:
            self.add(node)
        elif index == 2:
            node.next = self.header.next
            self.header.next = node
            self.length += 1
        else:
            for i in range(1, index - 1):
                current_Node = current_Node.next
            node.next = current_Node.next
            current_Node.next = node
            self.length += 1

    # 5、遍歷
    def travel(self):
        current_Node = self.header
        if self.length == 0:
            print("目前連結串列沒有資料!")
        else:
            print("目前連結串列裡面的元素有:", end=" ")
            for i in range(self.length):
                print("%s " % current_Node.element, end=" ")
                current_Node = current_Node.next
            print("\n")

    # 6、排序不用交換節點的位置,只需要交換節點上的資料值
    def list_sort(self):
        for i in range(0, self.length - 1):
            current_Node = self.header
            for j in range(0, self.length - i - 1):
                if current_Node.element > current_Node.next.element:
                    temp = current_Node.element
                    current_Node.element = current_Node.next.element
                    current_Node.next.element = temp

                current_Node = current_Node.next

    # 7、按索引刪除
    def delete(self, index):
        if index <= 0 or index > self.length:
            while (index <= 0 or index > self.length):
                print("你輸入的下標不對,請重新輸入需要刪除的值的下標:")
                index = eval(input())
                #   return
        else:
            if index == 1:
                self.header = self.header.next
                currentNode = self.header
            elif index == 2:
                current_Node = self.header
                current_Node.next = current_Node.next.next
            else:
                current_Node = self.header
                for i in range(1, index - 1):
                    current_Node = current_Node.next
                current_Node.next = current_Node.next.next
        self.length -= 1

    # 8、查詢是否包含,並返回下標
    def isContain(self, num):
        contain = 0
        current_Node = self.header
        for i in range(self.length):
            if current_Node.element == num:
                print("%d在連結串列中%d處\n" % (num, i + 1))  # i+1是在正常人認為的位置處,程式設計師一般是從0開始算起
                contain = 1
            current_Node = current_Node.next
        if contain == 0:
            print("%d不在連結串列中\n" % num)

    # 9、根據下標找節點
    def searchNodeByIndex(self, index):
        current_Node = self.header
        if index <= 0 or index > self.length:
            while (index <= 0 or index > self.length):
                print("你輸入的下標不對,請重新輸入:")
                index = eval(input())
                #   return 0
        if index > 0 or index <= self.length:
            for i in range(index - 1):
                current_Node = current_Node.next
            return current_Node

    # 10、根據下標修改節點的值
    def Alert(self, index, num):  # index定義為下標
        current_Node = self.header
        if index <= 0 or index > self.length:
            print("你輸入的下標不對,請重新輸入!\n")
        else:
            for i in range(index - 1):
                current_Node = current_Node.next
            current_Node.element = num

迴圈連結串列

特點:

  • 最後一個結點的指標指向頭結點

在這裡插入圖片描述

雙向迴圈連結串列

特點:

  • 一個結點包含指向後繼(next)和指向前驅(prior)兩個指標,兩個方向又分別構成迴圈連結串列。

在這裡插入圖片描述

相關文章