Jump to content
  • entries
    33
  • comments
    0
  • views
    1,227

Positional Doubly Linked List


Doğuhan ELMA

26 views

Positional Doubly Linked List, pozisyonlarını takip etmek istediğiniz öğelerle çalışmanız gerektiğinde kullanabileceğiniz bir veri yapısıdır. İkili bağlı liste (Doubly Linked List) üzerine inşa edilmiştir, bu nedenle her düğüm bir sonraki düğüme ve bir önceki düğüme işaret eder.

class PositionalList:
    class Node:
        def __init__(self, element, prev, next):
            self.element = element
            self.prev = prev
            self.next = next

    class Position:
        def __init__(self, container, node):
            self.container = container
            self.node = node

        def element(self):
            return self.node.element

    def __init__(self):
        self.header = self.Node(None, None, None)
        self.trailer = self.Node(None, None, None)
        self.header.next = self.trailer
        self.trailer.prev = self.header
        self.size = 0

    def _make_position(self, node):
        return self.Position(self, node) if node is not self.header and node is not self.trailer else None

    def first(self):
        return self._make_position(self.header.next)

    def last(self):
        return self._make_position(self.trailer.prev)

    def before(self, p):
        return self._make_position(p.node.prev)

    def after(self, p):
        return self._make_position(p.node.next)

    def add_first(self, e):
        return self._insert_between(e, self.header, self.header.next)

    def add_last(self, e):
        return self._insert_between(e, self.trailer.prev, self.trailer)

    def add_before(self, p, e):
        return self._insert_between(e, p.node.prev, p.node)

    def add_after(self, p, e):
        return self._insert_between(e, p.node, p.node.next)

    def delete(self, p):
        node = p.node
        node.prev.next = node.next
        node.next.prev = node.prev
        self.size -= 1
        element = node.element
        node.prev = node.next = node.element = None
        return element

    def _insert_between(self, e, prev_node, next_node):
        node = self.Node(e, prev_node, next_node)
        prev_node.next = node
        next_node.prev = node
        self.size += 1
        return self._make_position(node)

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

Örnek Kullanım:

plist = PositionalList()

p1 = plist.add_first(10)
p2 = plist.add_after(p1, 20)
p3 = plist.add_last(30)

for element in plist:
    print(element, end=' -> ')  # 10 -> 20 -> 30 ->

print()

plist.delete(p2)

for element in plist:
    print(element, end=' -> ')  # 10 -> 30 ->

Bu kod, Positional Doubly Linked List veri yapısının temel bir uygulamasını ve kullanımını göstermektedir. Positional Doubly Linked List, öğelerin pozisyonlarını hatırlamanızı ve bu pozisyonlara göre öğeleri eklemenizi, silmenizi ve güncellemenizi sağlar. Bu, algoritmalarda ve veri yapılarında oldukça yararlı olabilir.

0 Comments


Recommended Comments

There are no comments to display.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...