2013-01-14 2 views
3

Ok Une question de devoir dit de créer une liste ordonnée doublement liée ... de sorte que chaque objet avec le nom lexicographiquement plus petit vienne "Avant" l'autre ... Comme des noms dans un Dictionnaire ... aussi objets avec le même nom peuvent être disposés dans un ordre ...Commandé Doublement Liste Liée

Pour lier deux objets que j'ai setBefore() et setAfter() méthode ... et moi avons fait autant ... mais ne sais pas où je suis faire mal .. peut être un petit conseil de vous les gars peuvent m'aider ...

atMe est un objet qui est déjà présent dans la liste doublement liée et newFrob est un objet à être inséré ...

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) 

Et c'est la classe Frob à utiliser ...

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 

où avant et après des liens à gauche et à droite des objets en double liste liée ... objets de cette classe doivent être insérés au double liste chaînée ...

Exemple:

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 

Supposons maintenant

code        output 
insert(b,Frob('code'))  bar->code->code->foo->frob 
+3

@downvoters: Veuillez expliquer. Comme je peux le voir, OP avait clairement posé la question, présenté ses meilleurs efforts et il n'arrive toujours pas à trouver une solution et aurait besoin d'aide. Il n'est peut-être pas tout à fait à l'aise avec Python, mais nous devrions l'aider au lieu de le mettre à bas. – Abhijit

+3

veuillez expliquer ce que vous entendez exactement par une liste chaînée double ordonnée? expliquer comment cela devrait fonctionner, quelles méthodes il devrait mettre en œuvre ... etc etc ... –

+0

@eumiro merci ... mais toujours pas d'amélioration ... – adil

Répondre

3

La question est dans cette ligne (et un poste équivalent lorsque vous vous déplacez l'autre sens):

newFrob.setBefore(atMe.getBefore) 

vous manque un ensemble de parenthèses après atMe.getBefore, donc vous finissez par passer la méthode liée elle-même à newFrob.setBefore plutôt que la valeur qui serait retournée par cette méthode. Ceci est une faute de frappe facile à faire, donc je ne me sentirais pas trop mal de le manquer dans votre mission.

Je trouve l'erreur en essayant la séquence suivante d'inserts et d'inspecter les valeurs (je l'ai récapitulé ceux qui ont travaillé sur OK avec commentaires):

>>> 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>> 

Cet objet mentionné à la fin est b, qui conduis-moi à trouver l'erreur dans le code.

Questions connexes