2016-05-06 5 views
-2

Iこの学校の割り当てを得た、ここに私のコードは次のとおりです。時には何も印刷されません - 時々そうではありませんが、なぜ取得できませんか?

class Doubly_linked_node(): 
    def __init__(self, val): 
     self.value = val 
     self.next = None 
     self.prev = None 

    def __repr__(self): 
     return str(self.value) 

class Deque(): 
    def __init__(self): 
     self.header = Doubly_linked_node(None) 
     self.tailer = self.header 
     self.length = 0 

    def __repr__(self): 
     string = str(self.header.value) 
     index = self.header 
     while not (index.next is None): 
      string+=" " + str(index.next.value) 
      index = index.next 
     return string 


    def head_insert(self, item): 
     new = Doubly_linked_node(item) 

     new.next=self.header 
     self.header.prev=new 

     self.header=new 
     self.length+=1 

     if self.tailer.value==None: 
      self.tailer = self.header 

    def tail_insert(self, item): 
     new = Doubly_linked_node(item) 

     new.prev=self.tailer 
     self.tailer.next=new 

     self.tailer=new 
     self.length+=1 

     if self.header.value==None: 
      self.header = self.tailer 

それはあなたが頭や尾から項目を追加および削除することができ、スタックを構築します(私は唯一の重要なもののすべてのコードが含まれていませんでした)。

私はself.nextそれがNone印刷しますが、私はself.prevを返す場合、それは、何も印刷していない、彼らは両方のあなたが見るとまったく同じに定義されているので、私は理由を理解していない、スキップ、およびを返す場合、私は、オブジェクトを開始

例えば、 for i in range(1,5): D.head_insert(i)のように数回だけ挿入して 5 4 3 2 1 Noneを印刷した場合、 for i in range(1,5): D.tail_insert(i)のように末尾に挿入して Dを印刷すると、 Noneを付けないと、 1 2 3 4 5"が印刷されます。何故ですか?

私がイメージ含まれている:あなたは空ではないDequeを作成することに注意してください

image

+1

代わりに==なしの「Noneです」、::http://stackoverflow.com/questions/3257919/is-none-vs-none – danielfranca

+1

してくださいここでは全体の変化でありますhttp://stackoverflow.com/help/mcveを参照してください。 - 同じ問題を再現するのに必要な最小限のコードをコードに含める必要があります。 –

+0

'Deque'クラスには' head'メソッドと 'tail'メソッドはありません –

答えて

1
  1. を。値がNoneのノードで初期化しています

  2. valueとNodeオブジェクトを交換しています。あなたがif self.tailer.value==None:をチェックしているとき、それはあなたが2を指すように続いて

  3. を意味しているものはおそらくありませんヘッダーとテイラーはここNone

ある空のDequeのための特別な処理は、私が持っているものです私がDequeを実装するかどうかを覚えておいてください。私は少し戻って__repr__の値を変更しました。 Günthersのアドバイスに従い

class Deque(): 
    def __init__(self): 
     self.header = None 
     self.tailer = None 
     self.length = 0 

    def __repr__(self): 
     if self.header is None: 
      return 'Deque<>' 
     string = str(self.header.value) 
     index = self.header.next 
     while index!=None: 
      string+=" " + str(index.value) 
      index = index.next 
     return 'Deque<'+string+'>' 

    def head_insert(self, item): 
     new = Doubly_linked_node(item) 

     new.next=self.header 
     if self.length==0: 
      self.tailer=new 
     else: 
      self.header.prev=new 

     self.header=new 
     self.length+=1 

    def tail_insert(self, item): 
     new = Doubly_linked_node(item) 

     new.prev=self.tailer 
     if self.length==0: 
      self.header=new 
     else: 
      self.tailer.next=new 

     self.tailer=new 
     self.length+=1 
+0

'Doubly_linked_node():'クラスは演習の一部として与えられています。そのため、私はその中に特定の値を挿入する必要があります。 'None'を挿入しないと' Deque'を開始するとどう思いますか? – Tallb

+0

'Doubly_linked_node'として' Deque'を起動せず、Noneへのノード参照を避けることで、Guntherは素晴らしい解決策です。私はすべての==のために長さを使用しなかった理由は、割り当ての別の部分のための後者の追加であることを指摘します(最初はヘッダーとテイラーしか持っていませんでした) – Tallb

+0

私はまだ私は、 (非常に醜いものですが) – Tallb

1

、私はこれに__repr__を変更した:問題を解決したことを

def __repr__(self): 
    string = str(self.header.value) 
    index = self.header 
    while not (str(index.next) == "None"): 
     string += (" " + str(index.next.value)) 
     index = index.next 
    return string 

が、それは私が今まで見た中で最も醜いソリューションです。

もっと良い方法を知っている人はいますか?

0

より良い__repr__方法の質問に続いて私の提案。 __iter__メソッドを使用してDequeクラスを拡張します。だから、例えば、あると便利ですDequeを反復処理することができます。:

__repr__方法が簡単であることに基づいて
for item in D: 
    print item 

を。使用経験則として

def __repr__(self): 
    return 'Deque<'+' '.join([str(item.value) for item in self])+'>' 

def __iter__(self): 
    index=self.header 
    while index is not None: 
    yield index.value 
    index=index.next 
+0

あらかじめ定義されているように、私は何も追加できません。コンテンツをいっぱいにするだけです – Tallb

関連する問題