2017-03-18 15 views
0

ノードを二重リンクリストに挿入しようとしています。操作を実行した後、正しい結果が得られません。二重リンクリストのノードの前に挿入

class createnode: 
    def __init__(self,data): 
     self.data=data 
     self.next=None 
     self.prev=None 

class Unordered_list: 
    def __init__(self): 
    self.head=None 
######Insertion at the starting### 
    def buildlst(self,data): 
    node=createnode(data) 
    if self.head is None: 
    self.head=node 
    else: 
    node.next=self.head 
    node.prev=None 
    self.head=node 
#######INsertion at the end#### 
    def buildlstend(self,data): 
    node=createnode(data) 
    ptr=self.head 
    while(ptr.next): 
     ptr=ptr.next 
    ptr.next=node 
    ptr=node.prev 

#######INsertion before some node i.e searched node#### 
    def insertbeforenode(self,data,srch_data): 
    node=createnode(data) 
    ptr=self.head 
    while(ptr): 
     if ptr.data==srch_data: 
     node.prev=ptr.prev 
     node.next=ptr 
     ptr.prev=node 
     ptr=ptr.next 


########Printitng the list########  
    def printlist(self): 
    temp=self.head  
    while(temp): 
     print(temp.data) 
     temp=temp.next  

A=Unordered_list() 
A.buildlst(10) 
A.buildlst(20) 
A.buildlstend(30) 
A.printlist() 
print("Here i will insert a new node 50 before 10") 
A.insertbeforenode(50,10) 
A.printlist() 

マイリスト20,10,30.Iが10.but前に新しいノードを持つようにしたいようにそれは、このリンクを介してInserting a node before a given node in doubly linked list .MYプログラムとなって同じresults.Haveがcouldnので、Pythonである私を出力するものいくつかを見て.tはそれから多くを集める。 insertbeforenodeは私が電話をかけている場所です。

+1

これはなぜPythonタグとCタグの両方にクロスポストされていますか? Pythonにはリストが組み込まれているので、 "正しい方法"は2つの言語では非常に異なっています。 – torek

答えて

0

Pythonはリストを操作するための組み込みのメカニズムをサポートしている、あなたは簡単にこのような何かを行うことができます:

list = [] 
list.append(10) 
list.insert(0, 20) 
list.append(30) 
list.insert(1, 50) 

をより多くの例https://docs.python.org/3/tutorial/datastructures.htmlための公式ドキュメントを参照してください。 - 私は変更を加えた、私は矢印(#<)を入れている

class createnode: 
    def __init__(self, data): 
     self.data = data 
     self.next = None 
     self.prev = None 


class Unordered_list: 
    def __init__(self): 
     self.head = None 

    def buildlst(self, data): 
     node = createnode(data) 
     if self.head is None: 
      self.head = node 
     else: 
      node.next = self.head 
      self.head.prev = node # <--- 
      # node.prev = None <---- this is not necessary 
      self.head = node 

    def buildlstend(self, data): 
     node = createnode(data) 
     ptr = self.head 
     while ptr.next: 
      ptr = ptr.next 
     ptr.next = node 
     node.prev = ptr # <--- 

    def insertbeforenode(self, data, srch_data): 
     if srch_data == self.head.data: # <-- if you try to insert before the head 
      self.buildlst(data) 
     else: 
      node = createnode(data) 
      ptr = self.head 
      while ptr: 
       if ptr.data == srch_data: 
        node.prev = ptr.prev 
        node.next = ptr 
        ptr.prev = node 
        node.prev.next = node # <-- 
        break # <--- when you find your node you have to quit from the loop 
       else: 
        ptr = ptr.next 

    def printlist(self): 
     temp = self.head 
     while (temp): 
      print(temp.data) 
      temp = temp.next 

:あなたはあなたの自己によって、二重リンクリストをプログラムしたい場合は

はとにかく私はあなたのコードにいくつかの変更を行いました。ポインタやその他の不正確な点で作業することには、いくつかの間違いがありました。これを試して私に知らせてください!

+0

事** node.prev.next = node **あなたが実際に私の問題を解決したと言いました。私はそれがあなたの前のノードtobe_insertednode、次のnode.soをリンクする単なる方法だと思っているからです。 node.prev = ptr.prev、node.next = ptr、ptr.prev = nodeのようなリンクが十分にあると思っています。@ Checkerator – codaholic

+0

あなたはダブルリンクリストを持ち、2つのノード間に新しいノードを挿入するので4つのポインタを移動する必要があります。最初に新しい挿入されたノードの前と次を設定してから、新しいノード( 'node.prev.next = node')の前のノードの_next-pointer_と次のノードの_previous-pointer_を変更する必要があります新しいノード( 'ptr.prev = node')に追加します。私は言葉のために申し訳ありません@コダホリック –

+0

説明をありがとう!!!! – codaholic

関連する問題