基於Python實現順序表基本操作
1. 項目背景
基於嚴蔚敏數據結構中順序表思想,本人編寫了Python語言的順序表。感謝一些博主的文章,幫助我完成本項目。嚴蔚敏書中順序表操作方法,已在本項目實現。
2. 項目結構
基於嚴蔚敏數據結構中順序表思想,本人編寫了Python語言的順序表。感謝一些博主的文章,幫助我完成本項目。嚴蔚敏書中順序表操作方法,已在本項目實現。
3. 項目函數
3.1 初始化
在__init__(self, Listsize)方法裏,我將順序表最大值讓用戶自己傳入,以便自己修改。self.elem是順序表中的存儲區域,self.elem中下標爲0的元素設爲’Linear_logo’並作爲順序表創建的標誌。爲什麼將self.elem中下標爲0的元素設爲’Linear_logo’?因爲在嚴蔚敏版本的順序表中,self.elem中下標0內存區域不存儲數據,只有下標1的存儲區域存數據。self.elem中下標爲0是可以存儲數據,只不過本項目爲貼近嚴蔚敏的思想才編寫。
self.length是順序表的長度,這個長度是根據實際情況變化。
self.Listsize是順序表的最大存儲空間,如果順序表長度大於最大存儲空間,會自動擴空間,或者就是報錯。
self.increment是順序表的增量,如果要增加一個空間則可使用這個變量。但是,在本項目實現時,self.increment這個變量可以不設。
def __init__(self, Listsize):
self.elem = ['Linear_logo']
self.length = len(self.elem)
self.Listsize = Listsize
self.increment = 1
3.2 插入函數
插入操作函數是根據嚴蔚敏書中所寫思想編寫的,但是就是一些判斷條件和書中寫的位置不一致。
def ListInsert(self, pos, item):
if pos < 1 | pos > self.length + 1:
return IndexError
if pos == self.length:
self.elem += [item]
self.length += self.increment
else:
for i in range(self.length - 1, pos + 1, -1):
self.elem[i] = self.elem[i - 1]
self.elem[pos] = item
if len(self.elem) <= (self.Listsize - 1):
self.elem = self.elem + [item]
self.length = self.length + 1
else:
print("數組已滿")
return True
3.3 刪除函數
def ListDelete(self, pos):
if pos < 1 | pos > self.length:
return IndexError
for i in range(pos, self.length - 1):
self.elem[i] = self.elem[i + 1]
self.length -= 1
return True
3.4 定位函數
def LocateElem(self, item):
for i in range(self.length):
if self.elem[i] == item:
return i
else:
return False
3.5 清空順序表函數
編寫這個函數時,我借鑑Java編寫的清空順序表函數。若想清空順序表函數,只需將長度爲0(即self.length=0)。
def ClearList(self):
self.length=0
3.6 銷燬順序表函數
編寫這個函數時,我仍借鑑Java編寫的銷燬順序表函數。根據Python/Java面對對象的思想,銷燬一張順序表相當於銷燬一個對象。在Python裏,有一個方法如下↓
def __del__(self):
print("銷燬順序表")
注意,Python對象創建時自帶的方法,不可隨便更改。
4. 關於使用self的總結
本項目實現過程中,本人發現了利用Python順序表中操作函數中都帶有參數self。我猜想self函數參數,類似於利用C語言實現順序表時所設置的操作函數中參數SqList &L。後來,我在CSDN中找到此博文:https://blog.csdn.net/CLHugh/article/details/75000104去驗證我的猜想。
self是表示創建的類實例本身,當利用自定義的__init__方法就將把各種屬性綁定到self。在本項目中,__init__方法是一個類初始化的必備方法。我在__init__方法設置了存儲域、長度,最大內存和增量。__init__方法內設置的東西都會綁到self中,以便完成項目存儲、刪除等操作
5. 項目代碼
class LinearList(object):
def __init__(self, Listsize):
self.elem = ['Linear_logo']
self.length = len(self.elem)
self.Listsize = Listsize
self.increment = 1
def __del__(self):
print("銷燬順序表")
def ClearList(self):
self.length=0
def ListEmpty(self):
return self.length is 0
def ListLength(self):
return len(self.elem)
def GetElem(self, pos):
if pos <= self.length:
return self.elem[pos]
else:
return False
def LocateElem(self, item):
for i in range(self.length):
if self.elem[i] == item:
return i
else:
return False
def PriorElem(self, item):
if self.LocateElem(item) == False:
return False
else:
return self.elem[self.LocateElem(item) - 1]
def NextElem(self, item):
if self.LocateElem(item) == False:
return False
else:
return self.elem[self.LocateElem(item) + 1]
def ListInsert(self, pos, item):
if pos < 1 | pos > self.length + 1:
return IndexError
if pos == self.length:
self.elem += [item]
self.length += self.increment
else:
for i in range(self.length - 1, pos + 1, -1):
self.elem[i] = self.elem[i - 1]
self.elem[pos] = item
if len(self.elem) <= (self.Listsize - 1):
self.elem = self.elem + [item]
self.length = self.length + 1
else:
print("數組已滿")
return True
def ListDelete(self, pos):
if pos < 1 | pos > self.length:
return IndexError
for i in range(pos, self.length - 1):
self.elem[i] = self.elem[i + 1]
self.length -= 1
return True
def ListTraverse(self):
print('<', end='')
for i in range(0, self.length):
if i != self.length - 1:
print(self.elem[i], end=',')
else:
print(self.elem[i], end='')
print('>')
if __name__ == '__main__':
list = LinearList(20)
for i in range(1, 12, 1):
list.ListInsert(i, i)
list.ListTraverse()