Files
TransPyC/includes/linkedlist.py
2026-07-18 19:25:40 +08:00

451 lines
16 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import t, c
from stdint import *
# ============================================================
# LinkedNode: 非多态继承基类(@t.NoVTable
#
# 子类继承此类即"启用"标准链表/树形结构能力:
# - 双向兄弟链表next/prev→ O(1) 删除
# - 父子树结构child/last_child/parent→ O(1) 追加子节点
# - 子节点计数child_count
#
# 字段展平嵌入子类,无 vtable 开销(对应 C++ 非多态继承)。
# OOP 方法通过 _generate_inherited_method_wrappers 自动生成子类包装
# self bitcast 为父类指针后调用),子类可直接调用继承的方法。
#
# 用法:
# class MyNode(LinkedNode):
# value: t.CInt
# root: MyNode = MyNode()
# child: MyNode = MyNode()
# root.append(child) # OOP 调用self = root
# child.detach() # 从兄弟链摘除(分离自己)
# ============================================================
@t.NoVTable
class LinkedNode:
next: "LinkedNode" | t.CPtr # 下一个兄弟节点
prev: "LinkedNode" | t.CPtr # 上一个兄弟节点双向链表O(1) 删除)
child: "LinkedNode" | t.CPtr # 第一个子节点
last_child: "LinkedNode" | t.CPtr # 最后一个子节点O(1) 追加)
parent: "LinkedNode" | t.CPtr # 父节点
child_count: t.CSizeT # 子节点数
def append(self, node: "LinkedNode" | t.CPtr):
"""将 node 追加为 self 的最后一个子节点O(1))。
若 node 已在某链表中,调用方应先 node.detach() 再 append。
"""
if self is None or node is None: return
node.parent = self
node.next = None
node.prev = self.last_child
if self.child is None:
self.child = node
else:
self.last_child.next = node
self.last_child = node
self.child_count += 1
def prepend(self, node: "LinkedNode" | t.CPtr):
"""将 node 插入为 self 的第一个子节点O(1)"""
if self is None or node is None: return
node.parent = self
node.prev = None
node.next = self.child
if self.child is not None:
self.child.prev = node
else:
self.last_child = node
self.child = node
self.child_count += 1
def insert_before(self, node: "LinkedNode" | t.CPtr,
new_node: "LinkedNode" | t.CPtr):
"""在 node 之前插入 new_nodenode 必须是 self 的子节点O(1)"""
if self is None or node is None or new_node is None: return
new_node.parent = self
new_node.prev = node.prev
new_node.next = node
if node.prev is not None:
node.prev.next = new_node
else:
self.child = new_node
node.prev = new_node
self.child_count += 1
def insert_after(self, node: "LinkedNode" | t.CPtr,
new_node: "LinkedNode" | t.CPtr):
"""在 node 之后插入 new_nodenode 必须是 self 的子节点O(1)"""
if self is None or node is None or new_node is None: return
new_node.parent = self
new_node.prev = node
new_node.next = node.next
if node.next is not None:
node.next.prev = new_node
else:
self.last_child = new_node
node.next = new_node
self.child_count += 1
def remove_child(self, node: "LinkedNode" | t.CPtr):
"""从 self 的子链表中摘除 nodeO(1)。node 必须是 self 的直接子节点。"""
if self is None or node is None: return
# 修复 prev.next
if node.prev is not None:
node.prev.next = node.next
else:
self.child = node.next
# 修复 next.prev
if node.next is not None:
node.next.prev = node.prev
else:
self.last_child = node.prev
# 清除 node 的兄弟/父链接
node.next = None
node.prev = None
node.parent = None
if self.child_count > 0:
self.child_count -= 1
def detach(self):
"""将 self 从其所在兄弟链表中摘除O(1))。
调用后 self 的 next/prev/parent 被清空child 链不受影响。
"""
if self is None: return
# 修复 prev.next
if self.prev is not None:
self.prev.next = self.next
elif self.parent is not None:
self.parent.child = self.next
# 修复 next.prev
if self.next is not None:
self.next.prev = self.prev
elif self.parent is not None:
self.parent.last_child = self.prev
# 递减父节点计数
if self.parent is not None:
if self.parent.child_count > 0:
self.parent.child_count -= 1
# 清除 self 链接
self.next = None
self.prev = None
self.parent = None
def unlink(self):
"""断开 self 的所有连接(兄弟 + 父子),不递归处理子节点。
调用后 self 成为孤立节点,但其 child 链仍指向原子节点
(子节点的 parent 仍指向 self。若需完全隔离调用方应
先逐个 self.remove_child 子节点。
"""
if self is None: return
# 先从兄弟链摘除
self.detach()
# 再断开父子链接
self.child = None
self.last_child = None
self.child_count = 0
def has_children(self) -> t.CInt:
"""返回 1 若有子节点,否则 0"""
if self is None: return 0
if self.child is not None: return 1
return 0
def child_at(self, index: t.CSizeT) -> "LinkedNode" | t.CPtr:
"""返回第 index 个子节点O(n),从 0 开始),越界返回 None"""
if self is None: return None
cur: "LinkedNode" | t.CPtr = self.child
i: t.CSizeT = 0
while cur is not None:
if i == index: return cur
i += 1
cur = cur.next
return None
def count_children(self) -> t.CSizeT:
"""遍历计算子节点数O(n)),用于校验 child_count"""
if self is None: return 0
n: t.CSizeT = 0
cur: "LinkedNode" | t.CPtr = self.child
while cur is not None:
n += 1
cur = cur.next
return n
def first_sibling(self) -> "LinkedNode" | t.CPtr:
"""返回兄弟链表的头节点(沿 prev 回溯)"""
if self is None: return None
cur: "LinkedNode" | t.CPtr = self
while cur.prev is not None:
cur = cur.prev
return cur
def last_sibling(self) -> "LinkedNode" | t.CPtr:
"""返回兄弟链表的尾节点(沿 next 前进)"""
if self is None: return None
cur: "LinkedNode" | t.CPtr = self
while cur.next is not None:
cur = cur.next
return cur
# ============================================================
# SListNode: 单向链表节点(@t.NoVTable
#
# 轻量级单向链表,仅 Next 指针,无 prev/parent/child。
# 适用于队列/栈/简单链场景(如 llvmlite 的 Param/BasicBlock/Function/Line/Value
# O(1) 追加需调用方维护 tail 指针append_after
# O(n) 追加仅需 headappend
# ============================================================
@t.NoVTable
class SListNode:
Next: "SListNode" | t.CPtr # 下一个节点
def append(self, node: "SListNode" | t.CPtr) -> "SListNode" | t.CPtr:
"""将 node 追加到链表末尾O(n)),返回 selfhead
若 self 为 None应直接使用 node 作为 head调用方需自行处理
"""
if self is None: return node
if node is None: return self
node.Next = None
cur: "SListNode" | t.CPtr = self
while cur.Next is not None:
cur = cur.Next
cur.Next = node
return self
def append_after(self, node: "SListNode" | t.CPtr) -> "SListNode" | t.CPtr:
"""将 node 追加到 self 之后O(1)),返回新的 tail即 node
调用方需自行维护 head 指针。若 self 为 None返回 node 作为首节点。
"""
if node is None: return self
node.Next = None
if self is not None:
self.Next = node
return node
def count(self) -> t.CSizeT:
"""遍历计算链表长度O(n)"""
if self is None: return 0
n: t.CSizeT = 0
cur: "SListNode" | t.CPtr = self
while cur is not None:
n += 1
cur = cur.Next
return n
def at(self, index: t.CSizeT) -> "SListNode" | t.CPtr:
"""返回第 index 个节点O(n),从 0 开始),越界返回 None"""
if self is None: return None
cur: "SListNode" | t.CPtr = self
i: t.CSizeT = 0
while cur is not None:
if i == index: return cur
i += 1
cur = cur.Next
return None
def remove(self, node: "SListNode" | t.CPtr) -> "SListNode" | t.CPtr:
"""从链表中移除 nodeO(n)),返回新的 headself
node 的 Next 被清空。若 node 是 head返回 head.Next。
"""
if self is None or node is None: return self
if self is node:
new_head: "SListNode" | t.CPtr = self.Next
self.Next = None
return new_head
cur: "SListNode" | t.CPtr = self
while cur.Next is not None:
if cur.Next is node:
cur.Next = node.Next
node.Next = None
break
cur = cur.Next
return self
# ============================================================
# GSListNode[T]: 泛型单向链表节点(@t.NoVTable + PEP 695 泛型)
#
# 相比 SListNode非泛型Next: SListNode|CPtrGSListNode[T] 的 Next
# 字段类型为 T|CPtr特化后直接是具体节点类型无需向下转型。
#
# 递归泛型用法(子类继承自身特化版本):
# class GNode(GSListNode[GNode]):
# value: t.CInt
# # 此时 GNode.Next: GNode|CPtr强类型无转型
#
# 技术验证点:
# 1. 递归泛型 class GNode(GSListNode[GNode])
# 2. @t.NoVTable + 泛型组合
# 3. 泛型类作字段类型 list: GSList[GNode]
# 4. 泛型方法继承GSList[T].append 在特化后可用)
# ============================================================
@t.NoVTable
class GSListNode[T]:
Next: T | t.CPtr
# ============================================================
# GSList[T]: 泛型单向链表容器(@t.NoVTable + PEP 695 泛型)
#
# 持有 Head/Tail/Count提供 O(1) append 和 O(n) at。
# 节点类型 T 必须继承 GSListNode[T](以获得 Next 字段)。
#
# 用法:
# list: GSList[GNode] | t.CPtr = GSList[GNode]()
# list.append(node) # 方法调用,非全局函数
# ============================================================
@t.NoVTable
class GSList[T]:
Head: T | t.CPtr
Tail: T | t.CPtr
Count: t.CSizeT
def __init__(self):
self.Head = None
self.Tail = None
self.Count = 0
def append(self, node: T):
"""将 node 追加到链表末尾O(1)"""
if node is None: return
node.Next = None
if self.Head is None:
self.Head = node
else:
self.Tail.Next = node
self.Tail = node
self.Count += 1
def count(self) -> t.CSizeT:
"""返回节点数O(1)"""
return self.Count
def at(self, index: t.CSizeT) -> T | t.CPtr:
"""返回第 index 个节点O(n),从 0 开始),越界返回 None"""
if self.Head is None: return None
cur: T | t.CPtr = self.Head
i: t.CSizeT = 0
while cur is not None:
if i == index: return cur
i += 1
cur = cur.Next
return None
# ============================================================
# GTreeNode[T]: 泛型树节点(@t.NoVTable + PEP 695 泛型)
#
# 强类型版本的 LinkedNode所有指针字段类型为 T|t.CPtr。
# 提供:
# - 双向兄弟链表Next/Prev→ O(1) 删除
# - 父子树结构Child/LastChild/Parent→ O(1) 追加子节点
# - 子节点计数Count
#
# 递归泛型用法(子类继承自身特化版本):
# @t.CVTable
# class AST(GTreeNode[AST]):
# def kind(self) -> t.CInt:
# return 0
# # 此时 AST.Next/Prev/Child/LastChild/Parent 均为 AST|t.CPtr强类型
#
# 字段展平嵌入子类,无 vtable 开销(对应 C++ 非多态继承)。
# 子类若为 @t.CVTable则获得自己的 vtableoffset 0
# GTreeNode 字段展平在 vtable 之后。
#
# OOP 方法通过 _generate_inherited_method_wrappers 自动生成子类包装
# self bitcast 为父类指针后调用),子类可直接调用继承的方法。
# ============================================================
@t.NoVTable
class GTreeNode[T]:
Next: T | t.CPtr # 下一个兄弟节点
Prev: T | t.CPtr # 上一个兄弟节点双向链表O(1) 删除)
Child: T | t.CPtr # 第一个子节点
LastChild: T | t.CPtr # 最后一个子节点O(1) 追加)
Parent: T | t.CPtr # 父节点
Count: t.CSizeT # 子节点数
def append(self, node: T | t.CPtr):
"""将 node 追加为 self 的最后一个子节点O(1))。
若 node 已在某链表中,调用方应先 node.detach() 再 append。
"""
if self is None or node is None: return
node.Parent = self
node.Next = None
node.Prev = self.LastChild
if self.Child is None:
self.Child = node
else:
self.LastChild.Next = node
self.LastChild = node
self.Count += 1
def prepend(self, node: T | t.CPtr):
"""将 node 插入为 self 的第一个子节点O(1)"""
if self is None or node is None: return
node.Parent = self
node.Prev = None
node.Next = self.Child
if self.Child is not None:
self.Child.Prev = node
else:
self.LastChild = node
self.Child = node
self.Count += 1
def detach(self):
"""将 self 从其所在兄弟链表中摘除O(1))。
调用后 self 的 Next/Prev/Parent 被清空Child 链不受影响。
"""
if self is None: return
if self.Prev is not None:
self.Prev.Next = self.Next
elif self.Parent is not None:
self.Parent.Child = self.Next
if self.Next is not None:
self.Next.Prev = self.Prev
elif self.Parent is not None:
self.Parent.LastChild = self.Prev
if self.Parent is not None:
if self.Parent.Count > 0:
self.Parent.Count -= 1
self.Next = None
self.Prev = None
self.Parent = None
def has_children(self) -> t.CInt:
"""返回 1 若有子节点,否则 0"""
if self is None: return 0
if self.Child is not None: return 1
return 0
def child_at(self, index: t.CSizeT) -> T | t.CPtr:
"""返回第 index 个子节点O(n),从 0 开始),越界返回 None"""
if self is None: return None
cur: T | t.CPtr = self.Child
i: t.CSizeT = 0
while cur is not None:
if i == index: return cur
i += 1
cur = cur.Next
return None
def count_children(self) -> t.CSizeT:
"""遍历计算子节点数O(n)),用于校验 Count"""
if self is None: return 0
n: t.CSizeT = 0
cur: T | t.CPtr = self.Child
while cur is not None:
n += 1
cur = cur.Next
return n