求助,Data structure and algorithms in python----P279-positional list ADT

zxc941102 2020-08-21 09:38:24
class _DoubleLinkedbase:
class _Node:
__slots__ = "_element", "_next", "_prev"
def __init__(self, element, next, prev):
self._element = element
self._next = next
self._prev = prev

def __init__(self):
self._header = self._Node(None, None, None)
self._tailer = self._Node(None, None, None)
self._size = 0
self._header._next = self._tailer
self._tailer._prev = self._header

def __len__(self):
return self._size

def is_empty(self):
return self._size == 0

def _insert_between(self, e, predecessor, successor):
newest = self._Node(e, predecessor, successor)
predecessor._next = newest
successor._prev = newest
self._size += 1
return newest

def _delete_node(self, node):
predecessor = node._prev
successor = node._next
predecessor._next = successor
successor._prev = predecessor
self._size -= 1
element = node._element
node._prev = node._next = node._element = None
return element


class PositionList(_DoubleLinkedbase):
class Position:
"""an abstraction representing the location of a single element"""

def __init__(self, container, node):
self._container = container # container是用来干嘛的?
self._node = node

def element(self):
return self._node._element

def __eq__(self, other):
return type(other) is type(self) and other._node is self._node

def __ne__(self, other):
return not (self == other)

def _validate(self, p):
if not isinstance(p, self.Position):
raise TypeError("p must be proper Position type")
if p._container is not self:
raise ValueError("p does not belong to this container")
if p._node._next is None:
raise ValueError("p is no longer valid")
return p._node

def _make_position(self, node):
if node is self._header or node is self._tailer:
return None
else:
return self.Position(self, node) # 只有一个形参node??

def first(self):
return self._make_position(self._header._next)

def last(self):
return self._make_position(self._tailer._prev)

def before(self, p):
node = self._validate(p)
return self._make_position(node._prev)

def after(self, p):
node = self._validate(p)
return self._make_position(node._next)

def __iter__(self):
cursor = self.first()
while cursor is not None:
yield cursor.element()
cursor = self.after(cursor)

def _insert_between(self, e, prenode, sucnode):
node = super()._insert_between(e, prenode, sucnode)
return self._make_position(node)

def addfirst(self, e):
return self._insert_between(e, self._header, self._header._next)

def addlast(self, e):
return self._insert_between(e, self._tailer._prev, self._tailer)

def addbefore(self, p, e):
original = self._validate(p)
return self._insert_between(e, original._prev, original)

def addafter(self, p, e):
original = self._validate(p)
return self._insert_between(e, original, original._next)

def delete(self, p):
original = self._validate(p)
return self._delete_node(original)

def replace(self, p, e):
original = self._validate(p)
t = original._element
original_element = e
return t

-------------------------------
上面为书中对positional list 的定义,不太懂Position class是如何获取值对应的位置的,Position里面的container起什么作用啊?
请大佬帮忙解释一下,最好能给一段测试代码,谢谢!!
...全文
48 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧