2011-09-17 4 views
0

Quelqu'un peut-il s'il vous plaît me dire pourquoi ma fonction add ne fonctionne pas: (il ajoute que le premier { « a », 3}, mais pas le reste) thankyouAjout à une liste chaînée

class Frequency(object): 
    """ 
    Stores a letter:frequency pair. 

    >>> f = Frequency('c', 2) 
    >>> f.letter 
    'c' 
    >>> f.frequency 
    2 
    >>> f 
    {c: 2} 
    """ 
    def __init__(self, letter, frequency): 
     self.letter = letter 
     self.frequency = frequency 
     self.next = None 

    def __repr__(self): 
     return '{%s: %d}' % (self.letter, self.frequency) 

class SortedFrequencyList(object): 
    """ 
    Stores a collection of Frequency objects as a sorted linked list. 
    Items are sorted from the highest frequency to the lowest. 
    """ 
    def __init__(self): 
     self.head = None 

    def add(self, letter, frequency): 
     """ 
     Adds the given `letter`:`frequency` combination as a Frequency object 
     to the list. If the given `letter` is already in the list, the given 
     `frequency` is added to its frequency. 

     >>> f = SortedFrequencyList() 
     >>> f.add('a', 3) 
     >>> f 
     ({a: 3}) 
     >>> f.add('b', 2) 
     >>> f 
     ({a: 3}, {b: 2}) 
     >>> f.add('c', 4) 
     >>> f 
     ({c: 4}, {a: 3}, {b: 2}) 
     >>> f.add('b', 3) 
     >>> f 
     ({b: 5}, {c: 4}, {a: 3}) 
     """ 

     current = self.head 
     found = False 
     prev = None 

     if self.head is None: 
      self.head = Frequency(letter, frequency) 
     else: 
      while current is not None: 
       if current.letter == letter: 
        current.frequency = current.frequency + frequency 
        found = True 
       prev = current 
       current = current.next 


      if found is False: 
       while current is not None: 
        if current.frequency > frequency: 
         current.next = Frequency(letter, frequency) 

        elif current.frequency < frequency: 
         temp = prev 
         prev = Frequency(letter, frequency) 
         current = temp 

        prev = current 
        current = current.next 
+0

S'il vous plaît ajouter un exemple comment vous l'appelez ... – plaes

+0

dans la coquille de l'aile im juste taper "de shannon_2 rtedFrequencyList "et le f = SortedFrequencyList(), puis f.add, vous pouvez le voir dans le doctest .. le problème avec mon code i que c'est juste en ajoutant la première lettre et la fréquence pas alors repos! et je ne sais pas pourquoi O_o – Nirali

Répondre

2

Le problème est que, après la première boucle current est toujours None, par conséquent le corps de la deuxième boucle n'est jamais exécuté même dans le cas found is False.

+0

im ne suit pas, pouvez-vous s'il vous plaît expliquer. merci – Nirali

+0

La première boucle utilise comme condition 'alors que le courant n'est pas None' donc après que la boucle se termine la variable' current' sera nécessairement 'None' (parce que sinon nous serions toujours en boucle dans le' while'). Après que while boucle il y a un 'if' et une deuxième boucle qui utilise cependant la même condition' alors que current n'est pas None' et donc le corps de cette deuxième boucle ne sera jamais exécuté. – 6502

0

il me semble qu'il y a un autre problème. trouvé quand est faux et current.frequency> fréquence, vous devez définir current.next.next au précédent suivant, quelque chose comme: temp = current.next current.next = Fréquence ( current.next.next = temp

0

Ceci est le bon moment pour apprendre à utiliser le débogueur Python! vous pouvez en apprendre beaucoup si vous l'utilisez. écrire un TestScript qui échoue et démarrer le débogueur avec python -m pdb testscript.py. Doug Hellmann écrit de bons articles sur les modules de python, vous devriez read the one about the pdb module