2

我是 python 的一个相当新的程序员,并且在迭代链表时遇到了麻烦。这是一个链表,作为我正在使用的其他一些软件的输出(我无法修改)提供给我,并且包含我需要访问的参数(此处仅称为 my_parameter 以供参考)。作为参考,我将链表命名为 sim_table。我用来尝试迭代的代码片段是:

sim_table_rows = []
def iterate_linked_list(node):
    while node is not None:
        sim_table_rows.append(node.my_parameter)
        node = node.next

iterate_linked_list(sim_table)

这在 ipython 中运行良好,这是我测试所有内容的地方,但是当我尝试在 ipython 之外运行脚本时,我不断收到分段错误:11。为了诊断问题,我尝试打印输出而不是附加它:

def iterate_linked_list(node):
    while node is not None:
        print node.my_parameter
        node = node.next

iterate_linked_list(sim_table)

我得到的输出是列表中最后一个节点的 my_parameter 的无限循环,但我不知道为什么。我还制作了一个只有两个节点的测试 sim_table,看看如果我尝试迭代到 ipython 中不存在的节点会发生什么:

In [10]: test_sim_table.next.next.my_parameter
AttributeError: 'NoneType' object has no attribute 'my_parameter'

所以我得到一个属性错误而不是 None,这是我所期望的。我错过了一些简单的东西吗?我对这一切都很陌生,所以可能。感谢您的任何帮助!

4

4 回答 4

3

没有你在链接列表中前进的地方,也许你想要:

sim_table_rows = []
def iterate_linked_list(node):
    while node is not None:
        sim_table_rows.append(node.my_parameter)
        node = node.NEXT_NODE # Change node to next one...

假设这NEXT_NODE是包含对下一个节点的引用的属性。

于 2013-10-17T00:07:39.113 回答
2

我认为这是因为您输入的第一个节点不是None. 它永远不会是None因为你在 while 循环中不断地测试同一个节点。

它类似于这个无限循环:

while True:
    # do something

似乎您正在递归地解析链表。

也许 :

sim_table_rows = []
def iterate_linked_list(node):
    if node.next is None:                           # reached end of linked list 
        sim_table_rows.append(node.my_parameter)    # add last value of liist #to the list
        return sim_table_tows                       # returns full linked list
    else:
        sim_table_rows.append(node.my_parameter)  # append to linked list
        return iterate_linked_list(node.next)     # run again with the next node as input
于 2013-10-17T00:11:12.377 回答
0

可能是您的链表被引用自身的节点终止。

def iterate_linked_list(node):
    if node is not None:  # non-empty list?
        while True:
            print node.my_parameter
            if node.next is node:  # end of list?
                break
            node = node.next
于 2013-10-17T01:53:18.143 回答
0

好的,我从来没有一个完整的原因,但显然这个 seg 错误的根源与我试图访问的链表是使用 SWIG 绑定生成的这一事实有关。我猜这个问题已经被比我更聪明的同事看到了,它与我们用来生成数据的软件发行版特别相关。为了解决这个问题,我设法做到了以下几点:

sim_table_rows = []
while True: 
    sim_table_rows.append( [ node.parameter1, node.parameter2 ] )
    if node.next is None: break
    node = node.next

parameter1_types = [sim_table_rows[jj][0] for jj in range( len( sim_table_rows ) )]
parameter2_types = [sim_table_rows[jj][1] for jj in range( len( sim_table_rows ) )]

在这里,节点是链表,我已经在脚本前面使用我的外部软件定义了它。如果我尝试做的比这更多,我仍然会遇到段错误,所以我只是按原样使用它(将适用于我的目的,尽管它可能比需要的更笨重)。

感谢所有有用的意见和建议!

于 2013-10-18T21:47:26.433 回答