【问题标题】:Ordered Linked list.Multiple condition in while loop gives an error有序链表。while 循环中的多个条件给出错误
【发布时间】:2017-06-10 05:26:53
【问题描述】:
class Node:
def __init__(self,data):
    self.data=data
    self.link=None

class UnOrdered:
    def __init__(self):
        self.head=None

    def add(self,data):
        new=Node(data)
        ptr=self.head

        if self.head==None:
            self.head=new

        else:
            temp=ptr
            while ptr!=None:  #I want to write "while ptr!=None or 
                               #ptr.data<new.data"
                temp=ptr
                ptr=ptr.link
            p=temp.link
            temp.link=new
            new.link=p
    def show(self):
        if self.head==None:
            print("No nodes")
        else:
            q=self.head
            while q!=None:

                print(q.data, end=" ")
                q=q.link

ul=UnOrdered()
ul.add(3)
ul.add(5)
ul.add(4)
ul.add(11)
ul.add(10)
ul.add(5)
ul.show()

我正在尝试为有序链表创建一个程序,为此我需要在“add”方法中描述的 while 循环中编写多个条件。 但是使用多个条件会给我以下错误: 当 ptr!=None 或 ptr.data AttributeError:“NoneType”对象没有属性“数据”

【问题讨论】:

  • @Christian Dean 但是,一旦我使用 add 函数插入 3,我的 self.head 就指向创建的新节点,并且不再是 None。如果我错了,请纠正我?
  • 您的权利。我犯了一个错误。您的实际 问题是您在while 循环中使用or。这意味着无论您的测试是否失败(ptr!=None),while 语句的第二部分都会运行(ptr.data &lt; new.data)。您需要改用and,因此只有在测试成功时才尝试从ptr 访问data(例如,您知道ptr 不是None)。附带说明一下,在使用布尔值和无类型值进行测试时,请使用 isis not 而不是 ==!=
  • 请复制粘贴您的错误。

标签: python data-structures singly-linked-list


【解决方案1】:

发生这种情况的原因是表达式 ptr!=None or ptr.data &lt; new.data 的计算方式。

首先它会检查是否ptr!=None。如果它是无(即表达式计算为 False),那么它将移动到 or 的另一侧并计算 ptr.data &lt; new.data。由于我们已经知道它是 None,它尝试访问 Nonedata 属性,然后崩溃。

不幸的是,这意味着您想在while 条件中使用的表达式是不可能的。 您将需要使用不同的表达式 - 像 while ptr!=None and ptr.data &lt; new.data 这样的表达式是有效的,因为如果 ptr 永远为 None,则表达式将短路并且永远不会尝试评估 ptr.data

【讨论】:

    猜你喜欢
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 2017-07-20
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多