线性表
线性表的定义是描述其逻辑结构,而通常会在线性表上进行的查找、插入、删除等操作。
线性表作为一种基本的数据结构类型,在计算机存储器中的存储一般有两种形式,一种是顺序存储,一种是链式存储。
线性表的顺序存储
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()