新闻动态

Python 实现静态链表案例详解

发布日期:2022-01-07 13:28 | 文章来源:脚本之家

静态链表和动态链表区别

静态链表和动态链表的共同点是,数据之间"一对一"的逻辑关系都是依靠指针(静态链表中称"游标")来维持。

静态链表

使用静态链表存储数据,需要预先申请足够大的一整块内存空间,也就是说,静态链表存储数据元素的个数从其创建的那一刻就已经确定,后期无法更改。

不仅如此,静态链表是在固定大小的存储空间内随机存储各个数据元素,这就造成了静态链表中需要使用另一条链表(通常称为"备用链表")来记录空间存储空间的位置,以便后期分配给新添加元素使用。

这意味着,如果你选择使用静态链表存储数据,你需要通过操控两条链表,一条是存储数据,另一条是记录空闲空间的位置。

动态链表

使用动态链表存储数据,不需要预先申请内存空间,而是在需要的时候才向内存申请。也就是说,动态链表存储数据元素的个数是不限的,想存多少就存多少。

同时,使用动态链表的整个过程,你也只需操控一条存储数据的链表。当表中添加或删除数据元素时,你只需要通过 malloc 或 free 函数来申请或释放空间即可,实现起来比较简单。

python 实现的静态链表

静态链表的设计思维非常巧妙,通过索引、游标完成单向链表结构,相对于顺序结构的列表而言,节省了数据移位、内存碎片的开支。

python 实现的静态链表代码,静态链表采用的 list 结构存储。

class Node:
 def __init__(self, next, val=None):
  self.val = val  # 值
  self.next = next  # 游标。最后一个元素的游标必须是 0

class SLinkList:
 # 分配线性表长度、定义线性表
 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
  # 前一个元素
  pre = self.size - 1
  # 插入元素的位置(第一个空位置)
  insertLoc = self.link[0].next
  # 条件判断
  if ind < 1 or ind >= pre or insertLoc >= self.size:
return 0
  # 第一个元素的索引
  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
  # 前一个索引
  pre = self.size - 1
  for i in range(1, self.size - 1):
index = self.link[pre].next
# 当前位置是个空位置
if self.link[index].val is None:
 break
# 已经遍历到第i个位置
if i == ind:
 self.link[pre].next = self.link[index].next
 self.link[index].val = None
 # 删除元素的游标指向备用链表
 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())

到此这篇关于Python 实现静态链表案例详解的文章就介绍到这了,更多相关Python 实现静态链表内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部