Ok分配中的一个问题是创建一个有序的双向链表...这样每个具有字典缩小名称的对象都会出现在“之前”另一个......类似于词典中的名称......也是同名的对象可以按任何顺序排列......
要链接两个对象,我有setBefore()
和setAfter()
方法...
而且我做了这么多......但仍然不知道我在哪里做错了。可能是你们的一点指导可以帮助我......
atMe
是已存在于双向链表中的对象,newFrob
是要插入的对象...
def insert(atMe, newFrob):
if newFrob.myName() < atMe.myName():
if atMe.getBefore() == None:
atMe.setBefore(newFrob)
newFrob.setAfter(atMe)
elif atMe.getBefore().myName()<newFrob.myName():
atMe.getBefore().setAfter(newFrob)
newFrob.setBefore(atMe.getBefore)
atMe.setBefore(newFrob)
newFrob.setAfter(atMe)
else:
insert(atMe.getBefore(),newFrob)
elif newFrob.myName() > atMe.myName():
if atMe.getAfter() == None:
atMe.setAfter(newFrob)
newFrob.setBefore(atMe)
elif atMe.getAfter().myName()>newFrob.myName():
atMe.getAfter().setBefore(newFrob)
newFrob.setAfter(atMe.getAfter)
atMe.setAfter(newFrob)
newFrob.setBefore(atMe)
else:
insert(atMe.getAfter(),newFrob)
elif newFrob.myName()==atMe.myName():
if atMe.getAfter() != None:
newFrob.setAfter(atMe.getAfter())
newFrob.setBefore(atMe)
if atMe.getAfter() != None:
atMe.getAfter().setBefore(newFrob)
atMe.setAfter(newFrob)
这是要使用的Frob类......
class Frob(object):
def __init__(self, name):
self.name = name
self.before = None
self.after = None
def setBefore(self, before):
self.before = before
def setAfter(self, after):
self.after = after
def getBefore(self):
return self.before
def getAfter(self):
return self.after
def myName(self):
return self.name
其中Before和After是双链表中左右对象的链接... 此类中的对象将插入双链表...
示例:
a=Frob('foo')
b=Frob('bar')
c=Frob('frob')
d=Frob('code')
code output
insert(a,b) bar->foo
insert(a,c) bar->foo->frob
insert(b,d) bar->code->foo->frob
现在假设
code output
insert(b,Frob('code')) bar->code->code->foo->frob
答案 0 :(得分:3)
问题在于这一行(当你向另一个方向移动时,也是一个等效的问题):
newFrob.setBefore(atMe.getBefore)
您在atMe.getBefore
之后缺少一组括号,因此您最终将绑定方法本身传递给newFrob.setBefore
,而不是该方法返回的值。这是一个简单的拼写错误,所以在你的任务中错过它我不会感觉太糟糕。
我通过尝试以下插入序列并检查值来找到错误(我总结了那些与评论一起正常工作的那些):
>>> a = Frob("a")
>>> b = Frob("b")
>>> c = Frob("c")
>>> d = Frob("d")
>>> insert(a, b) # list is a<->b
>>> insert(a, d) # list is a<->b<->d
>>> insert(a, c) # list is a<->b<->c->?
>>> c.getAfter()
<bound method Frob.getAfter of <__main__.Frob object at 0x000000000318EBA8>>
最后提到的对象是b
,这导致我在代码中找到错误。