Giúp về cấu trúc danh sách liên kết kép

Cem đang gặp chút rắc rối về chương trình danh sách liên kết kép, ai đó giúp em với!! :cry:

 class Node(object):
    def __init__(self, element, next, previous):
        self.element=element
        self.next=next
        self.previous=previous
import Node

class Doubly_Linked_List(object):
    def __init__(self):
        self.header=Node.Node(None, None, None)
        self.trailer=Node.Node(None, None, None)
        self.header.next=self.trailer
        self.trailer.previous=self.header
        self.size=0
    def len(self):
        return self.size
    def is_empty(self):
        return self.size==0
    def insert_beetween(self, e, predecessor, successor):
        new_node=Node.Node(e, predecessor, successor)
        predecessor.next=new_node
        successor.previous=new_node
        self.size+=1
        return new_node
    def delete_node(self, node):
        predecessor=node.previous
        successor=node.next
        predecessor.next=successor
        successor.previous=predecessor
        self.size-=1
        element=node.element
        node.previous=None
        node.next=None
        node.element=None
        return element
    def show_node(self, node):
        if node.element!=None:
            return "element: "+str(node.element)+"predecessor: "+str(node.previous.element)+"successor: "+str(node.next.element)
        else:
            return "header or trailer sentinels"
    def display(self):
        elements=[]
        e=self.header.next
        while e.element!=None:
            elements.append(e.element)
            e=e.next
        return elements
import Doubly_Linked_List
if __name__=='__main__':
    DLL=Doubly_Linked_List.Doubly_Linked_List()
    print("header ID"+str(DLL.header))
    print("trailer ID"+str(DLL.trailer))
    print(DLL.size)
    print(DLL.header.next)
    print(DLL.trailer.previous)
    print("_"*40)
    object1=DLL.insert_beetween('object1', DLL.header, DLL.trailer)
    print(DLL.size)
    print(DLL.display())
    print("_"*40)
    mark_349=DLL.insert_beetween(349, object1, DLL.trailer)
    print(DLL.size)
    print(DLL.display())
    object2=DLL.insert_beetween('object2', object1, 349)
    print(DLL.size)
    print(DLL.display())
    print(DLL.show_node(object2))

Console

pydev debugger: starting (pid: 10812)
header ID<Node.Node object at 0x03D4B2D0>
trailer ID<Node.Node object at 0x03D4B310>
0
<Node.Node object at 0x03D4B310>
<Node.Node object at 0x03D4B2D0>
________________________________________
1
['object1']
________________________________________
2

Vâng cho em hỏi chương trình em sai ở đâu mà khi em thêm Node mới vào và display hay là show node ra vẫn không có gì vậy ạ, lại phiền anh (chị) rồi :sob:

Thế bạn muốn thấy cái gì. Mình úm ba la là có nè

3 Likes

Vâng, em muốn display gồm hết các phần tử trong danh sách, và show_node có nút đó và kế nhiệm tiền nhiệm của nó, em cảm ơn trc ạ :grinning:

Nhưng mà in cái gì để ra cái đó Bạn thử đưa code với ouput coi nào, mình chỉnh lại phần code trong class cho

2 Likes

đây là phần code test của em(em bỏ qua phần ở trc)

object1=DLL.insert_beetween('object1', DLL.header, DLL.trailer)
    print(DLL.size)
    print(DLL.display())
    print("_"*40)
    mark_349=DLL.insert_beetween(349, object1, DLL.trailer)
    print(DLL.size)
    print(DLL.display())
    object2=DLL.insert_beetween('object2', object1, 349)
    print(DLL.size)
    print(DLL.display())
    print(DLL.show_node(object2))

và đây là output

header ID< Node.Node object at 0x03CAB2D0 >
trailer ID< Node.Node object at 0x03CAB310 >
0
< Node.Node object at 0x03CAB310 >
< Node.Node object at 0x03CAB2D0 >
________________________________________
1
['object1']
________________________________________
2

Ủa, vậy thì nó khác gì ban đầu đâu?

2 Likes

Nói sao đây nhỉ, em muốn in thằng display() và show_node ra nhưng sao output vẫn chỉ có size và mỗi object1 thôi, em k biết phải thế nào nữa

Code này bạn tự code hay lấy đâu thế?

Vâng, em lấy từ giáo trình ra để tìm hiểu cách thức thao tác dữ liệu

Việc in nó ra không khó, quan trọng là bạn phải biết bạn in cái gì. Bạn cứ gói mấy thứ cần in vào trong phương thức __str__ rồi in ra

>>> class A:
...     pass
>>> a = A()
>>> print(a)
<gì gì đó ở đâu đó>

Khi gói vào method __str__

>>> class A:
...     def __str__(self):
...         return 'một chuỗi nhé, làm sao làm, phải return về một chuỗi'
...
>>> a = A()
>>> print(a)
một chuỗi nhé, làm sao làm, phải return về một chuỗi
2 Likes

em vẫn không hiểu liệu phương thức display ở class của em có sai hay không mà khi em gọi nó print ra thì nó không thực hiện, em đang dùng python3.6 nên nhìn k hiểu mấy anh ạ:slight_smile:

Cái list mà em nhận được là từ method display đó em

2 Likes

Thế việc em print(DLL.display()) là hợp lý không anh?, nó không in ra list cho em dù em đã nạp vào cho nó 3 nút

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?