Python 實(shí)現(xiàn)靜態(tài)鏈表案例詳解
靜態(tài)鏈表和動(dòng)態(tài)鏈表區(qū)別
靜態(tài)鏈表和動(dòng)態(tài)鏈表的共同點(diǎn)是,數(shù)據(jù)之間"一對(duì)一"的邏輯關(guān)系都是依靠指針(靜態(tài)鏈表中稱"游標(biāo)")來(lái)維持。
靜態(tài)鏈表
使用靜態(tài)鏈表存儲(chǔ)數(shù)據(jù),需要預(yù)先申請(qǐng)足夠大的一整塊內(nèi)存空間,也就是說(shuō),靜態(tài)鏈表存儲(chǔ)數(shù)據(jù)元素的個(gè)數(shù)從其創(chuàng)建的那一刻就已經(jīng)確定,后期無(wú)法更改。
不僅如此,靜態(tài)鏈表是在固定大小的存儲(chǔ)空間內(nèi)隨機(jī)存儲(chǔ)各個(gè)數(shù)據(jù)元素,這就造成了靜態(tài)鏈表中需要使用另一條鏈表(通常稱為"備用鏈表")來(lái)記錄空間存儲(chǔ)空間的位置,以便后期分配給新添加元素使用。
這意味著,如果你選擇使用靜態(tài)鏈表存儲(chǔ)數(shù)據(jù),你需要通過(guò)操控兩條鏈表,一條是存儲(chǔ)數(shù)據(jù),另一條是記錄空閑空間的位置。
動(dòng)態(tài)鏈表
使用動(dòng)態(tài)鏈表存儲(chǔ)數(shù)據(jù),不需要預(yù)先申請(qǐng)內(nèi)存空間,而是在需要的時(shí)候才向內(nèi)存申請(qǐng)。也就是說(shuō),動(dòng)態(tài)鏈表存儲(chǔ)數(shù)據(jù)元素的個(gè)數(shù)是不限的,想存多少就存多少。
同時(shí),使用動(dòng)態(tài)鏈表的整個(gè)過(guò)程,你也只需操控一條存儲(chǔ)數(shù)據(jù)的鏈表。當(dāng)表中添加或刪除數(shù)據(jù)元素時(shí),你只需要通過(guò) malloc 或 free 函數(shù)來(lái)申請(qǐng)或釋放空間即可,實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單。
python 實(shí)現(xiàn)的靜態(tài)鏈表
靜態(tài)鏈表的設(shè)計(jì)思維非常巧妙,通過(guò)索引、游標(biāo)完成單向鏈表結(jié)構(gòu),相對(duì)于順序結(jié)構(gòu)的列表而言,節(jié)省了數(shù)據(jù)移位、內(nèi)存碎片的開(kāi)支。
python 實(shí)現(xiàn)的靜態(tài)鏈表代碼,靜態(tài)鏈表采用的 list 結(jié)構(gòu)存儲(chǔ)。
class Node: def __init__(self, next, val=None): self.val = val # 值 self.next = next # 游標(biāo)。最后一個(gè)元素的游標(biāo)必須是 0 class SLinkList: # 分配線性表長(zhǎng)度、定義線性表 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 # 前一個(gè)元素 pre = self.size - 1 # 插入元素的位置(第一個(gè)空位置) insertLoc = self.link[0].next # 條件判斷 if ind < 1 or ind >= pre or insertLoc >= self.size: return 0 # 第一個(gè)元素的索引 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 # 前一個(gè)索引 pre = self.size - 1 for i in range(1, self.size - 1): index = self.link[pre].next # 當(dāng)前位置是個(gè)空位置 if self.link[index].val is None: break # 已經(jīng)遍歷到第i個(gè)位置 if i == ind: self.link[pre].next = self.link[index].next self.link[index].val = None # 刪除元素的游標(biāo)指向備用鏈表 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())
到此這篇關(guān)于Python 實(shí)現(xiàn)靜態(tài)鏈表案例詳解的文章就介紹到這了,更多相關(guān)Python 實(shí)現(xiàn)靜態(tài)鏈表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python自動(dòng)保存百度盤(pán)資源到百度盤(pán)中的實(shí)例代碼
這篇文章主要介紹了python自動(dòng)保存百度盤(pán)資源到百度盤(pán)中的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08實(shí)現(xiàn)python版本的按任意鍵繼續(xù)/退出
本文給大家簡(jiǎn)單介紹了在windows以及l(fā)inux下實(shí)現(xiàn)python版本的按任意鍵繼續(xù)/退出功能,非常的簡(jiǎn)單實(shí)用,linux下稍微復(fù)雜些,有需要的小伙伴可以參考下2016-09-09Python基礎(chǔ)之?dāng)?shù)據(jù)類(lèi)型相關(guān)知識(shí)總結(jié)
眾所周知,在Python中,常用的數(shù)據(jù)類(lèi)型有三種,分別是字符串、整數(shù)和浮點(diǎn)數(shù).在Python基礎(chǔ)學(xué)習(xí)的過(guò)程中,數(shù)據(jù)類(lèi)型是初學(xué)者常常容易混淆的一個(gè)基礎(chǔ)知識(shí)點(diǎn),本文為大家詳細(xì)總結(jié)了三種數(shù)據(jù)類(lèi)型的概念、數(shù)據(jù)類(lèi)型的查詢以及更為復(fù)雜的數(shù)據(jù)轉(zhuǎn)化,需要的朋友可以參考下2021-06-06教你用Django將前端的數(shù)據(jù)存入Mysql數(shù)據(jù)庫(kù)
這篇文章主要給大家介紹了關(guān)于如何用Django將前端的數(shù)據(jù)存入Mysql數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過(guò)圖文以及示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Django具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-11-11python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5選項(xiàng)卡控件QTabWidget詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5選項(xiàng)卡控件QTabWidget詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03解決使用PyCharm時(shí)無(wú)法啟動(dòng)控制臺(tái)的問(wèn)題
今天小編就為大家分享一篇解決使用PyCharm時(shí)無(wú)法啟動(dòng)控制臺(tái)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01python pygame實(shí)現(xiàn)五子棋小游戲
這篇文章主要為大家詳細(xì)介紹了python pygame實(shí)現(xiàn)五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06