2016-06-27 5 views
0

私はこのコードを持っています、それは現在の形で働いています、それは課題ですが、私たちの誰も本当にこの仕組みを理解していないように感じています。私は本当に答えが必要です。それは私を悩ますのと同じことです。 コード:クラスノードとクラスキュー、 "ポインタ"はどのように機能しますか?

class Node: 
    def __init__(self,data): 
     self.cargo=data 
     self.pekareinnan=None 

class Queue: 
    def __init__(self): 
     self.svans=None 
     self.huvud=None 

    def put(self,x): 
     item=Node(x) 
     if self.svans==None: 
      self.svans=item 
      self.huvud=item 
     else: 
      self.svans.pekareinnan=item #What does this line really do? 
      self.svans=item 

    def isempty(self): 
     return self.huvud==None 

    def get(self): 
     if self.huvud==None: 
      return None 
     else: 
      do=self.huvud.cargo 
      self.huvud=self.huvud.pekareinnan ##How does this line work? 
      return do 

それはハードのフォロー、pekareinnan = pointerbefore(スウェーデン)、svans =尾、huvud =頭だ場合。私はプログラミングよりもずっと多くのことを知っている人たちに私に比べて尋ねようとしました。そのうちの1人は、svansがsentinelnodeだと言っていました。私はそれに1,3,5というリストを持っているとしよう。私はそこに9を入れたいと思っています.pakareinnanは何ですか、svansは何ですか?何か助けてくれてありがとう、

答えて

1

それは空のqで始まるのを助ける。この場合、q.put(1)に電話する前にq.svansq.huvudの両方がNoneになります。あなたが呼ぶとき、あなたは1を含む新しいNodeオブジェクトを作成することによって、STAT:よう

item.cargo = 1 
item.pekareinnan = None 

は今、q.svans is None(ない==Noneと比較するisを使用)、 以来、私たちは、itemq.huvudq.svansの両方を設定します同じノードがリストの先頭と末尾となります。

     item 
         | 
         V 
q.huvud -----> +-----------+------+ 
       |  1  | None | 
q.svans -----> +-----------+------+ 

我々はq.put(3)を呼び出すとき、私たちはq.svans、その後、一人でq.huvudを残すが、古い尾の両方pekareinnanを更新することによって、リストの最後に3を追加します。

まず、新しいノードを作成:q.svans.pekareinnan = itemで既存のリストにリンク、

            item 
                | 
                V 
q.huvud -----> +-----------+------+ +------------+------+ 
       |  1  | None | |  3  | None | 
q.svans -----> +-----------+------+ +------------+------+ 

次へ:

            item 
                | 
                V 
q.huvud -----> +-----------+------+ +------------+------+ 
       |  1  | * --+->|  3  | None | 
q.svans -----> +-----------+------+ +------------+------+ 

その後q.svans = itemを設定することにより、キュー自体を更新:

            item 
                | 
                V 
q.huvud -----> +-----------+------+ +------------+------+ 
       |  1  | * --+->|  3  | None | 
q.svans   +-----------+------+ +------------+------+ 
    |          ^
    |           | 
    +------------------------------------------ 

5と9を追加すると同じことが起こります。新しいノードを割り当てます新しいノードにpekareinnanが既に存在し、q.svansに設定されている場合は、新しいノードにも同様にq.svansを設定します。


アイテムを削除するには、同じことをしますが、q.huvudとします。 q.huvudが最初のノードへの唯一のポインタであることに注意してください。q.huvudを更新してノードを削除する前に、貨物が何であるかを覚えておく必要があります。

cargo = q.huvud.cargo # 1 


q.huvud -----> +-----------+------+ +------------+------+ 
       |  1  | * --+->|  3  | None | 
q.svans   +-----------+------+ +------------+------+ 
    |          ^
    |           | 
    +------------------------------------------ 

今、私たちは、単にそれを次のノードにq.huvudを上書きすることによって頭部を削除することができます。

+-----------------------------------------+ 
    |           | 
    |           v 
q.huvud   +-----------+------+ +------------+------+ 
       |  1  | * --+->|  3  | None | 
q.svans   +-----------+------+ +------------+------+ 
    |          ^
    |           | 
    +------------------------------------------ 

1を含むノードを指すものが何もないため、効果的に削除されます。最終的にはガベージコレクションされます。

+0

ありがとうございました。あなたが最初に頭と尾の両方として機能するノードであることを理解していれば、別の番号を追加するとポインタを更新して新しい尾を指すようにする必要があります。私はこれまでに聞いたことがありますが、ノードが値を含むオブジェクトとポインタの両方が正しいと言えるでしょうか?最後の質問、なぜあなたは代わりに==を使用したいですか? –

+0

正しいです、ノードは値と次のノードへのポインタの両方を含んでいます。 'is'を使うことが主に好まれる慣例です。 'None'はその型の唯一のオブジェクトであるシングルトンなので安全です。 – chepner

+0

時間があれば、私はbinarysearchツリーにremove-methodを追加しようとしているので、これを尋ねました。私はすでにコードを完成させていますが、コードを見ていないときに助けてくれるのは分かりませんが、self.left = childとself.left.right = grandchildと言うと、それはどういう仕組みですか?私はそれを理解していれば左だけのポインタです、self.left.right、それは左に1歩、次に右に1歩ですか?助けてくれてありがとう! –

関連する問題