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不拥有自己的内存。它指向Pythonbytes
对象所拥有的内存。只有字节
对象处于活动状态时,该内存才有效
由于使用传递给构造函数的临时内存对其进行初始化,因此内存仅在构造函数的持续时间内有效,不再有效
您需要保持字节
对象处于活动状态,或者将它们的内容复制到您管理的内存中。感谢您在我的副本中写入此内容,但我仍将打印多个“DAVE”。谢谢您,我刚刚在对bytes()的调用中添加了变量并将这些变量子放到函数调用中谢谢您的帮助。
cdef Node* new_node = <Node*>malloc(sizeof(Node))