Python 實現(xiàn)靜態(tài)鏈表案例詳解
靜態(tài)鏈表和動態(tài)鏈表區(qū)別
靜態(tài)鏈表和動態(tài)鏈表的共同點是,數(shù)據之間"一對一"的邏輯關系都是依靠指針(靜態(tài)鏈表中稱"游標")來維持。
靜態(tài)鏈表
使用靜態(tài)鏈表存儲數(shù)據,需要預先申請足夠大的一整塊內存空間,也就是說,靜態(tài)鏈表存儲數(shù)據元素的個數(shù)從其創(chuàng)建的那一刻就已經確定,后期無法更改。
不僅如此,靜態(tài)鏈表是在固定大小的存儲空間內隨機存儲各個數(shù)據元素,這就造成了靜態(tài)鏈表中需要使用另一條鏈表(通常稱為"備用鏈表")來記錄空間存儲空間的位置,以便后期分配給新添加元素使用。
這意味著,如果你選擇使用靜態(tài)鏈表存儲數(shù)據,你需要通過操控兩條鏈表,一條是存儲數(shù)據,另一條是記錄空閑空間的位置。
動態(tài)鏈表
使用動態(tài)鏈表存儲數(shù)據,不需要預先申請內存空間,而是在需要的時候才向內存申請。也就是說,動態(tài)鏈表存儲數(shù)據元素的個數(shù)是不限的,想存多少就存多少。
同時,使用動態(tài)鏈表的整個過程,你也只需操控一條存儲數(shù)據的鏈表。當表中添加或刪除數(shù)據元素時,你只需要通過 malloc 或 free 函數(shù)來申請或釋放空間即可,實現(xiàn)起來比較簡單。
python 實現(xiàn)的靜態(tài)鏈表
靜態(tài)鏈表的設計思維非常巧妙,通過索引、游標完成單向鏈表結構,相對于順序結構的列表而言,節(jié)省了數(shù)據移位、內存碎片的開支。
python 實現(xiàn)的靜態(tài)鏈表代碼,靜態(tài)鏈表采用的 list 結構存儲。
class Node:
def __init__(self, next, val=None):
self.val = val # 值
self.next = next # 游標。最后一個元素的游標必須是 0
class SLinkList:
# 分配線性表長度、定義線性表
def __init__(self, size=7):
self.size = size
self.link = [Node((i + 1) % self.size) for i in range(self.size)]
# 線性表清空
def clearSLL(self):
self.__init__()
# 線性表是否為空
def isEmpty(self):
return False if self.link[self.size - 1].next else True
# 查找空位置
def findEmpty(self):
ind = self.size
for i in range(1, self.size - 1):
if self.link[i].val is None:
ind = i
break
return ind
# 指定位置插入元素
def insert(self, ind, ele):
sua = -1
# 前一個元素
pre = self.size - 1
# 插入元素的位置(第一個空位置)
insertLoc = self.link[0].next
# 條件判斷
if ind < 1 or ind >= pre or insertLoc >= self.size:
return 0
# 第一個元素的索引
for i in range(1, self.size - 1):
index = self.link[pre].next
if i == ind:
self.link[pre].next = insertLoc
# 元素插入
self.link[insertLoc].val = ele
self.link[insertLoc].next = index
# 首位元素
self.link[0].next = self.findEmpty()
sua = 1
break
if self.link[index].val is None:
break
pre = index
return sua
# 查找線性表某位置的元素
def getByIndex(self, ind):
if ind < 1 or ind >= self.size - 1:
return -1
index = self.link[self.size - 1].next
if index == 0:
return -1
for i in range(1, ind):
index = self.link[index].next
return self.link[index].val
# 查找線性表的元素所在位置
def locateElement(self, ele):
index = self.link[self.size - 1].next
ind = -1
if index == 0:
return ind
for i in range(1, self.size - 1):
if self.link[index].val == ele:
ind = i
break
if self.link[index].val is None:
break
index = self.link[index].next
return ind
# 刪除線性表指定位置的元素
def deleteElement(self, ind):
sua = -1
# 前一個索引
pre = self.size - 1
for i in range(1, self.size - 1):
index = self.link[pre].next
# 當前位置是個空位置
if self.link[index].val is None:
break
# 已經遍歷到第i個位置
if i == ind:
self.link[pre].next = self.link[index].next
self.link[index].val = None
# 刪除元素的游標指向備用鏈表
self.link[index].next = self.link[0].next
# 首位元素
self.link[0].next = index
sua = 1
break
pre = index
return sua
# 按照線性表排序線性表遍歷
def travelLink(self):
print("*" * 50)
index = self.link[self.size - 1].next
while self.link[index].val:
print(
f"value = {self.link[index].val} next = {self.link[index].next}"
)
index = self.link[index].next
print("*" * 50)
# 按照索引遍歷
def traversingByIndex(self):
print("*" * 50)
for i in range(self.size):
print(
f"index = {i}, value = {self.link[i].val} next = {self.link[i].next}"
)
print("*" * 50)
if __name__ == '__main__':
ll = SLinkList()
ll.traversingByIndex()
print(ll.isEmpty())
print(ll.insert(1, 'A'))
ll.travelLink()
print(ll.insert(2, 'B'))
ll.travelLink()
print(ll.insert(1, 'C'))
print(ll.insert(4, 'D'))
ll.travelLink()
ll.traversingByIndex()
print(ll.deleteElement(3))
ll.traversingByIndex()
ll.travelLink()
print(ll.isEmpty())
print(ll.getByIndex(2))
print(ll.locateElement('BcA'))
print(ll.clearSLL())
到此這篇關于Python 實現(xiàn)靜態(tài)鏈表案例詳解的文章就介紹到這了,更多相關Python 實現(xiàn)靜態(tài)鏈表內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
實現(xiàn)python版本的按任意鍵繼續(xù)/退出
本文給大家簡單介紹了在windows以及l(fā)inux下實現(xiàn)python版本的按任意鍵繼續(xù)/退出功能,非常的簡單實用,linux下稍微復雜些,有需要的小伙伴可以參考下2016-09-09
教你用Django將前端的數(shù)據存入Mysql數(shù)據庫
這篇文章主要給大家介紹了關于如何用Django將前端的數(shù)據存入Mysql數(shù)據庫的相關資料,文中通過圖文以及示例代碼介紹的非常詳細,對大家學習或者使用Django具有一定的參考學習價值,需要的朋友可以參考下2021-11-11
python GUI庫圖形界面開發(fā)之PyQt5選項卡控件QTabWidget詳細使用方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5選項卡控件QTabWidget詳細使用方法與實例,需要的朋友可以參考下2020-03-03

