2010-12-05 7 views
1

Je suis coincé en implémentant la fonction add d'une liste circulaire en python. J'ai un pointeur de tête qui devrait être une référence à un nœud, mais chaque fois que j'ajoute quelque chose à la liste, la tête est toujours None. Voici le code que j'ai jusqu'à présent:Liste chaînée en python

class CircleList(): 

    __slots__ = ('head', 'size') 

    def __init__(self): 
     self.head = None 
     self.size = 0 

    def __str__(self): 
     result = "<" 
     node = self.head 
     count = self.size 
     while count != 0: 
      result = result + str(node.data) 
      if count != 1: 
       result = result + ", " 
      node = node.next 
      count -= 1 
     result = result + ">" 
     return result 

    def add(self, element): 
     head = self.head 
     print(head) 
     size = self.size 
     if head == None: 
      head = Node(element, None) 
      head.next = head 
     else: 
      cursor = head 
      while cursor.next != head: 
       cursor = cursor.next 
      temp = Node(element, head) 
      cursor.next = temp 
     size += 1 


class Node(): 
    __slots__ = ('data','next') 

    def __init__(self, data, next): 
     self.data = data 
     self.next = next 

Voici le pilote:

stream = open('data.txt', 'r') 

circlelist = CircleList() 

for name in stream 
    circlelist.add(name) 

print(circlelist) 
+1

Toute raison pour laquelle vous implémentez comme ça? Ce n'est pas vraiment pythonique, et vous pourriez facilement trouver une version beaucoup plus élégante qui étend 'list', fournissant des méta-méthodes comme' __getitem__' etc. et utilisant des index. Cela élimine également le besoin de la classe 'Node' superflue. Aussi, je suggère de coller à l'interface bien connue de la liste. –

Répondre

1

Vous affectez uniquement le nouveau nœud à votre variable locale head dans votre méthode add(), et non au membre d'instance CircleList réel.

Vous voudrez peut-être faire quelque chose comme:

def add(self, element): 
    head = self.head 
    print(head) 
    size = self.size 
    if head is None: 
     self.head = head = Node(element, None) # Also set the instance member. 
     head.next = head 
0

Facile à fixer! Dans votre fonction d'ajout, vous affectez la nouvelle tête à la variable head - qui est limitée à la portée de la fonction, et disparaîtra quand elle reviendra!

Vous devez définir la valeur self.head, l'attribut de l'instance en cours. Editer: lorsque vous affectez head = self.head, vous les faites pointer tous les deux sur le même objet.

Mais ce sont des références séparées: qu'elles se réfèrent ou non à la même chose, changer une ne changera pas l'autre.