Python 按顺序打印Cython双链表

Python 按顺序打印Cython双链表,python,c,cython,Python,C,Cython,嗨,我正在建立一个双链表结构,我正在寻找按字母顺序打印我的测试名称/单词 最终产品应如下所示: BRAIDEN BRANT 戴夫 KIM 当前show_all将显示复制到所有以前条目上的最后一个条目 示例:如果最后输入“DAVE”,则所有输出将为: 戴夫 戴夫 戴夫 DAVE 如果在create()函数中打印,则会得到以下输出: BRAIDEN BRANT KIM DAVE 这不是字母顺序,而是我输入的顺序 注意:到目前为止,我的双链接列表似乎没有通过其结构进行打印。我的意思是,你可以简单地打印

嗨,我正在建立一个双链表结构,我正在寻找按字母顺序打印我的测试名称/单词

最终产品应如下所示:

BRAIDEN

BRANT

戴夫
KIM

当前
show_all
将显示复制到所有以前条目上的最后一个条目

示例:如果最后输入“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

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

换句话说,这条线

cdef Node* new_node = <Node*>malloc(sizeof(Node*))
cdef节点*new_节点=malloc(sizeof(Node*))
应该是

cdef Node* new_node = <Node*>malloc(sizeof(Node))
cdef节点*new_节点=malloc(sizeof(Node))

节点。word不拥有自己的内存。它指向Python
bytes
对象所拥有的内存。只有
字节
对象处于活动状态时,该内存才有效

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


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

感谢您在我的副本中写入此内容,但我仍将打印多个“DAVE”。谢谢您,我刚刚在对bytes()的调用中添加了变量并将这些变量子放到函数调用中谢谢您的帮助。
cdef Node* new_node = <Node*>malloc(sizeof(Node))