需要理解python的類、例項、賦值原理(其實就是位址的引用)等概念
先定義乙個鍊錶結點類(lnode),用於生成鍊錶結點。然後定義乙個單鏈表物件類(llist),用於儲存鍊錶結點、操作結點資料。
1.定義鍊錶結點類
class
lnode
:"""
鍊錶結點類
"""def__init__
(self, elem, next_=
none):
self.elem = elem
self.
next
= next_
2.測試結點類物件的使用# 建立乙個鍊錶結點類物件,並賦值給lis
lis = lnode(1)
# 將lis賦值給p(必須,詳細參看,否則沒辦法構成鍊錶)
p = lis
# 迴圈新增結點
for i in
range(2
,10):
p.next
= lnode(i)
p = p.
next
# 將lis賦值給q(非必須,只是為了好看)
q = lis
print
(lis)
# 迴圈輸出結點
while q:
print
(q.elem)
q = q.
next
print
(lis)
3.上面測試原理圖(根據賦值原理)
似乎不好畫,我還是口述吧。建立乙個鍊錶的結點物件elem1,賦值給lis(相當於引用了elem1的位址)。又將lis賦值給p(相當於lis直接把elem1的位址給了p,及直接引用了elem1的位址)。將新建立的結點elem2位址給elem1結點物件的next屬性,再把elem1的next屬性賦值給p(其實就是將elem2的位址給p引用),以此類推到都鏈結完。迴圈輸出結點及直接把結點elem1位址給q(或者直接用lis也行),然後輸出當前的元素,並把當前元素next屬性的elem2的位址給q即可(就是直接賦值嘍),以此類推輸出完。
其實此理解原理圖反過來就是我們在講資料結構的書上所畫的示意圖了。
4.定義單鏈表物件類(包含乙個異常類)
# 異常類
class
linkedlistunderflow
(valueerror)
:pass
class
llist
:"""
單鏈表物件類
"""def__init__
(self)
: self._head =
none
defis_empty
(self)
:"""
判斷表是否為空
:return: true:為空,false:不為空
"""return self._head is
none
defprepend
(self, elem)
:"""
從首端插入元素
:param elem:
:return:
"""self._head = lnode(elem=elem, next_=self._head)
defpop
(self)
:"""
刪除表頭結點,並返回這個結點的資料
:return: 結點的資料
"""if self._head is
none
:raise linkedlistunderflow(
'in pop'
) e = self._head.elem
self._head = self._head.
next
return e
def(self, elem)
:"""
在鍊錶最後插入元素
:return:
"""if self._head is
none
: self._head = lnode(elem=elem)
return
p = self._head
while p.
next
isnot
none
: p = p.
next
p.next
= lnode(elem=elem)
defpop_last
(self)
:"""
將鍊錶最後的元素刪除並返回
:return:
"""# 空表
if self._head is
none
:raise linkedlistunderflow(
'in pop_last'
) p = self._head
# 表中只有乙個元素
if p.
next
isnone
: e = p.elem
self._head =
none
return e
# 迴圈直到p.next是最後結點
while p.
next
.next
isnot
none
: p = p.
next
e = p.
next
.elem
p.next
=none
return e
deffind
(self, pred)
:"""
返回第乙個符合謂詞的表元素
:param pred:
:return:
"""p = self._head
while p is
notnone
:if pred(p.elem)
:return p.elem
p = p.
next
defprintall
(self)
:"""
輸出表中的元素情況
:return:
"""p = self._head
while p is
notnone
:print
(p.elem, end='')
if p.
next
isnot
none
:print
(', '
, end='')
p = p.
next
print(''
)
上面類的定義及方法函式都是基於理解2中的測試結點類物件的使用所寫的,其中類中的資料即1中的結點類物件。但鍊錶初始時應該為空,所以在init初始化的時候設定為空。在一些操作中有使用建立結點類物件。
5.測試單鏈表物件類
# 使用鍊錶,定義鍊錶物件
mlist = llist(
)# 判斷是否為空表
print
(mlist.is_empty())
# 從表的前端插入元素,並檢視元素狀態
for i in
range(10
):mlist.prepend(i)
mlist.printall(
)# 從表的後端插入元素, 並檢視元素狀態
for i in
range(11
,20):
mlist.printall(
)# 從表的前端刪除元素,並檢視元素狀態
pre_node = mlist.pop(
)print
(pre_node)
mlist.printall(
)# 從表的後端刪除元素,並檢視元素狀態
last_node = mlist.pop_last(
)print
(last_node)
mlist.printall(
)# 定義乙個謂詞函式
defbetw
(elem)
:if elem in(6
,10,21
):return
true
else
:return
false
# 使用這個謂詞函式查詢對應的資料
findnode = mlist.find(betw)
print
(findnode)
# 判空
print
(mlist.is_empty(
))
資料結構 一 線性表
一 線性表的定義 線性結構的特點是 在資料元素的非空有限集中,1 存在唯一的乙個被成為 第乙個 的資料元素 2 存在唯一的乙個被成為 最後乙個 的資料元素 3 除了第乙個之外,其他的元素均只有乙個前驅,除了最後乙個以外,其他的元素均只有乙個後繼 線性表是最常用且最簡單的一種資料結構,乙個線性表是n個...
一 線性結構
基礎知識 1.陣列 2.帶頭結點的雙向鍊錶 head first 3.迴圈佇列 例一 最小值問題 問題描述 實現乙個n個元素的線性表,每次可以修改其中乙個元素,也可以詢問閉區間 q,p 中元素的最小值。1 n,m 100000 分析 設塊長l,則一共有n l塊 維護陣列b,儲存每個塊的最小值。每次修...
資料結構筆記(一) 線性表(棧)
棧的定義 棧 stack 是限定僅在表尾進行插入和刪除的線性表 棧的插入操作,也叫入棧 壓棧 進棧 棧的刪除操作,也叫出棧 彈棧。首先我們來看棧的抽象資料型別 adt 棧 stack data 同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係。operation initstack s 初始...