線性表
線性表的定義是描述其邏輯結構,而通常會在線性表上進行的查找、插入、刪除等操作。
線性表作爲一種基本的數據結構類型,在計算機存儲器中的存儲一般有兩種形式,一種是順序存儲,一種是鏈式存儲。
線性表的順序存儲
1. 定義
若將線性表L=(a0,a1, ……,an-1)中的各元素依次存儲於計算機一片連續的存儲空間,這種機制表示爲線性表的順序存儲 結構。
2. 特點
邏輯上相鄰的元素 ai, ai+1,其存儲位置也是相鄰的;
存儲密度高,方便對數據的遍歷查找。
對錶的插入和刪除等運算的效率較差。
3. 程序實現
在Python中,list存放於一片單一連續的內存塊,故可藉助於列表類型來描述線性表的順序存儲結構,而且列表本身就提 供了豐富的接口滿足這種數據結構的運算。
>>>L = [1,2,3,4]
>>>L.append(10) #尾部增加元素
L
[1, 2, 3, 4, 10]
>>>L.insert(1,20) #插入元素
L
[1, 20, 2, 3, 4, 10]
>>>L.remove(3) #刪除元素
L
[1, 20, 2, 4, 10]
>>>L[4] = 30 #修改
L
[1, 20, 2, 4, 30]
>>>L.index(2) #查找
2
線性表的鏈式存儲
1. 定義
將線性表L=(a0,a1,……,an-1)中各元素分佈在存儲器的不同存儲塊,稱爲結點,每個結點(尾節點除外)中都持有一個指向下一個節點的引用,這樣所得到的存儲結構爲鏈表結構。
2. 特點
邏輯上相鄰的元素 ai, ai+1,其存儲位置也不一定相鄰;
存儲稀疏,不必開闢整塊存儲空間。
對錶的插入和刪除等運算的效率較高。
邏輯結構複雜,不利於遍歷。
3. 程序實現
示例:
"""
(重點)鏈式存儲示例:
思路:
1、結點如何表示?
自定義對象:代表數據元素
元素數據:自身數據+下一個對象地址數據
2、如何建立關聯?
利用屬性存儲下一個對象地址
3、實現什麼樣的鏈表操作?
初始化--顯示--追加--插入--刪除--根據索引取值--獲取長度--是否爲空--清空
"""
class Node:
def __init__(self, name, n=None):
self.name = name # 自身數據
self.next = n # 下一個結點
def __str__(self):
return str(self.name)
class LinkList:
def __init__(self):
self.head = Node(None)
# 初始化數據
def init_list(self, list_data):
p = self.head
for item in list_data:
p.next = Node(item)
p = p.next
# 顯示數據
def show(self):
p = self.head.next
while p:
print(p, end=" ")
p = p.next
print()
# 末尾添加數據
def append(self, value):
last = self.head
while last.next is not None:
last = last.next
last.next = Node(value)
# 指定位置插入
def insert(self, index, value):
node = Node(value)
length = self.length()
if index >= length:
self.append(node)
return
i = 0
p = self.head
while i < index:
i += 1
p = p.next
node.next = p.next
p.next = node
# 刪除
def delete(self, item):
p = self.head
while p.next:
if p.next.name == item:
p.next = p.next.next
break
else:
raise ValueError("value not in list")
p = p.next
# 根據索引獲取值
def get(self, index):
i = 0
item = self.head
while item.next:
if i == index:
return item.next
item = item.next
i += 1
else:
raise IndexError("index out of range")
# 返回長度
def length(self):
length = 0
last = self.head
while last.next:
length += 1
last = last.next
return length
# 返回是否爲空
def is_empty(self):
return False if self.head.next else True
# 清空鏈表
def clear(self):
self.head.next = None
if __name__ == '__main__':
link_list = LinkList()
link_list.init_list([1, 2, 3])
link_list.delete(2)
link_list.show()