資料結構:線性表(Python實現基本操作)
簡介
線性表: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)兩個指標,兩個方向又分別構成迴圈連結串列。
相關文章
- 資料結構c語言實現順序表基本操作資料結構C語言
- 資料結構——線性表資料結構
- 資料結構 | 線性表資料結構
- 資料結構-線性表資料結構
- 資料結構—線性表資料結構
- [資料結構] - 線性表資料結構
- 資料結構線性表的鏈式儲存結構(單連結串列)的表示及其基本操作資料結構
- Java實現資料結構之線性結構Java資料結構
- 資料結構和演算法(一)線性表實現資料結構演算法
- 資料結構 - 線性表 - 順序表資料結構
- 資料結構-線性表、連結串列資料結構
- 線性表的基本操作
- 線性表__資料結構筆記資料結構筆記
- 資料結構:線性表-例題資料結構
- 資料結構(線性錶鏈式儲存)的幾個基本操作資料結構
- 考研資料結構-線性表-順序表資料結構
- 資料結構實驗三:線性表綜合實驗資料結構
- 【資料結構】線性表-單連結串列資料結構
- Python基本資料結構Python資料結構
- 資料結構筆記——線性表(下)資料結構筆記
- 資料結構筆記——線性表(中)資料結構筆記
- 資料結構——線性表P35.1資料結構
- EntityFramework Core筆記:表結構及資料基本操作(2)Framework筆記
- 資料結構與演算法 - 線性表資料結構演算法
- 資料結構線性表兩種方式分享資料結構
- php實現基本資料結構之連結串列PHP資料結構
- 資料結構基礎學習之線性表資料結構
- 資料結構-第一篇:線性表資料結構
- 資料結構與演算法(一):線性表資料結構演算法
- 【資料結構&演算法】04-線性表資料結構演算法
- 資料結構與演算法 | 線性表 —— 順序表資料結構演算法
- 資料結構實驗5、鏈佇列的基本操作資料結構佇列
- 資料結構與演算法 | 線性表 —— 連結串列資料結構演算法
- 資料結構實驗之查詢七:線性之雜湊表資料結構
- 資料結構:特殊的線性表之 棧 & 佇列資料結構佇列
- 前端資料結構--線性結構-連結串列前端資料結構
- 資料結構與演算法-線性表-單連結串列資料結構演算法
- C++資料結構連結串列的基本操作C++資料結構