【问题标题】:Cython Doubly Linked list printing in orderCython 双向链表打印顺序
【发布时间】:2021-07-24 08:10:28
【问题描述】:

您好,我正在构建一个双向链表结构,我希望按字母顺序打印我的测试名称/单词。

最终产品应如下所示:

BRAIDEN
BRANT
DAVE
KIM

目前show_all 将显示复制的所有先前条目的最后一个条目。

示例:如果最后输入“DAVE”,所有输出将是:

DAVE
DAVE
DAVE
DAVE

如果我在 create() 函数中打印,我会得到输出:

BRAIDEN
BRANT
KIM
DAVE

这不是字母顺序,而是我输入它们的顺序。

注意:到目前为止,我的双向链表似乎没有通过其结构打印。我的意思是你可以简单地打印节点或调用show_all 任何一种方式,因为现在它没有通过结构打印,就好像它们正在单独打印一样。

Program.pyx

from libc.stdlib cimport malloc, free

cdef struct Node
cdef struct Node:
    char* word
    Node* prev
    Node* next

cdef class DoublyLinkedList:

    cdef Node* head
    cdef Node* tail
    cdef Node* last_node
    cdef Node* next_node

    def __cinit__(self):
        self.head = NULL
        self.tail = NULL
        self.last_node = NULL
        self.next_node = NULL

    def create(self, word):
        cdef Node* new_node = <Node*>malloc(sizeof(Node*))
        if not new_node:
            raise MemoryError()

        new_node.word = word
        new_node.prev = NULL
        new_node.next = NULL

        if (self.head == NULL):
            self.head = new_node
            self.tail = new_node
        elif (self.head.word >= new_node.word):
            new_node.next = self.head
            self.head.prev = new_node
            self.head = new_node
        else:

            last_node = self.head
            next_node = self.head.next
            while (next_node != NULL):
                if (next_node.word >= new_node.word):
                    break
                last_node = next_node
                next_node = next_node.next

            new_node.prev = last_node
            new_node.next = next_node
            last_node.next = new_node

        if (next_node == NULL):
            self.tail = new_node
        else:
            next_node.prev = new_node
    
    def show_all(self):
        while (self.head != NULL):
            print(self.head.word)
            self.head = self.head.next

testing_interface.py

import program

algo = program.DoublyLinkedList()

algo.create(bytes("BRAIDEN", encoding="utf-8"))
algo.create(bytes("BRANT", encoding="utf-8"))
algo.create(bytes("KIM", encoding="utf-8"))
algo.create(bytes("DAVE", encoding="utf-8"))
algo.show_all()

【问题讨论】:

    标签: python c cython


    【解决方案1】:

    node.word 不拥有它自己的内存。它指向 Python bytes 对象拥有的内存。该内存仅在 bytes 对象存在时才有效。

    由于您使用传递给构造函数的临时变量对其进行初始化,因此内存仅在构造函数的持续时间内有效,不再有效。

    您要么需要保持bytes 对象处于活动状态,要么将它们的内容复制到您管理的内存中。

    【讨论】:

    • 谢谢您,我刚刚在对 bytes() 的调用中添加了变量,并将这些变量替换为函数调用,谢谢您的帮助。
    【解决方案2】:

    你应该分配一个节点,而不是一个指针,来分配一个节点。

    换句话说,这条线

    cdef Node* new_node = <Node*>malloc(sizeof(Node*))
    

    应该是

    cdef Node* new_node = <Node*>malloc(sizeof(Node))
    

    【讨论】:

    • 感谢您在我的副本上更改此内容,但我仍会打印多个“DAVE”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多