2016-11-20 21 views
0


プログラミングが開始されました。私はヘッドが正しく割り当てられることができないリンクされたリストでこの問題を抱えています。 LinkedList内のpushCar()関数でなければなりません。私が車を追加しようとすると、頭は決して割り当てられません。ちょうど問題を見つけることができません。誰かが見て、何が間違っているのかを指摘できたら、私はとても感謝しています。
おかげリンクされたリストのヘッドが割り当てられない


class Node: 
    def __init__(self, carData, nextNode = None, prevNode = None): 
     self.next = nextNode 
     self.prev = prevNode 
     self.data = carData 

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

    def emptyCheck(self): 
     return self.head == None 

    def pushCar(self, carData): 
     ref = self.head 
     if ref is None: 
      self.head = Node(carData) 
     elif ref.data.price < carData.price: 
      newNode = Node(carData) 
      newNode.next = ref 
      self.head = newNode 
     else: 
      while ref.next is not None: 
       if ref.next.data.price > carData.price: 
        ref = ref.next 
       else: 
        newNode = Node(carData) 
        newNode.next = ref.next 
        newNode.prev = ref 
        ref.next.prev = newNode 
        ref.next = newNode 
        return 
      ref.next = Node(carData) 

    def popCar(self): 
     if self.head is None: return None 
     data = self.head.data 
     self.head = self.head.next 
     return data 

    def printDB(self): 
     i = 1 
     ref = self.head 
     while ref is not None: 
      print("myCar{} \n".format(i) + str(ref.data)) 
      ref = ref.next 
      i += 1 

    def getDB(self): 
     return self 

    def getDBHead(self): 
     return self.head 

    def arrayPush(self, array): 
     for i in range(0, len(array)): 
      cars = Car(array[i][0], array[i][1], array[i][2], array[i][3], array[i][4]) 
      self.pushCar(cars) 

    def singlePush(self, car): 
      car = Car(car[0], car[1], car[2], car[3], car[4]) 
      self.pushCar(car) 

    def __str__(self): 
     retStr = "LinkedList: \n" 
     while self.head != None: 
      retStr += str(self.head.data) 
      self.head = self.head.next 
     return retStr 

class Car: 
    def __init__(self, identification, name, brand, price, active): 
     self.id = identification 
     self.name = name 
     self.brand = brand 
     self.price = price 
     self.active = active 

    def __str__(self): 
     return "ID: %3d" % self.id + "\tNAME:" + self.name + "\tBRAND:" + self.brand + "\tPRICE: %3d" % self.price + "\tSTATUS:" + str(self.active) + "\n" 


db = LinkedList() 
+1

これ、パースラインELIFのref.data.priceのcarData.priceをクリーンアップしません書かれたように、コード:そしてそれを私が掲示不正なコードのための –

+0

私の謝罪を取り巻くものは、今ではすべて正しいはずです。 –

答えて

1

だからもう一度、あなたのコードを見た後、私はあなたが問題を抱えている場所、私が見ると信じています。まず、コードは正常に動作しています。 pushCarメソッドにスクロールすると、print文を追加したことがわかります。このコードを実行すると、先頭が空白になっていて、emptyCheckFalseを返していることがわかります。最初にprint(db)に問題が発生してからヘッドを確認してください。理由はあなたの__str__の定義にあります。リンクされたリストを[なし]まで反復処理しますが、リンクされたリストをリセットすることはありません。言い換えれば、データを消費し、最後にヘッドをなしに設定します。私は先に進んで、__str__メソッドを更新して、データのコピーが繰り返し前に保存され、そのコピーを使用してリンクリストがリセットされるようにしました。それをパッチするもう1つの方法は、あなたが行ってきたように、の方法でref = self.headを使用することです。

class Node: 
    def __init__(self, carData, nextNode = None, prevNode = None): 
     self.next = nextNode 
     self.prev = prevNode 
     self.data = carData 

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

    def emptyCheck(self): 
     return self.head == None 

    def pushCar(self, carData): 
     ref = self.head 
     if ref is None: 
      print("Testing to see if head is emtpy, should see this only once") 
      self.head = Node(carData) 
     elif ref.data.price < carData.price: 
      newNode = Node(carData) 
      newNode.next = ref 
      self.head = newNode 
     else: 
      while ref.next is not None: 
       if ref.next.data.price > carData.price: 
        ref = ref.next 
       else: 
        newNode = Node(carData) 
        newNode.next = ref.next 
        newNode.prev = ref 
        ref.next.prev = newNode 
        ref.next = newNode 
        return 
      ref.next = Node(carData) 

    def popCar(self): 
     if self.head is None: return None 
     data = self.head.data 
     self.head = self.head.next 
     return data 

    def printDB(self): 
     i = 1 
     ref = self.head 
     while ref is not None: 
      print("myCar{} \n".format(i) + str(ref.data)) 
      ref = ref.next 
      i += 1 

    def getDB(self): 
     return self 

    def getDBHead(self): 
     return self.head 

    def arrayPush(self, array): 
     for i in range(0, len(array)): 
      cars = Car(array[i][0], array[i][1], array[i][2], array[i][3], array[i][4]) 
      self.pushCar(cars) 

    def singlePush(self, car): 
      car = Car(car[0], car[1], car[2], car[3], car[4]) 
      self.pushCar(car) 

    def __str__(self): 
     retStr = "LinkedList: \n" 
     copy = self.head 
     while self.head != None: 
      retStr += str(self.head.data) 
      self.head = self.head.next 
     self.head = copy 
     return retStr 

class Car: 
    def __init__(self, identification, name, brand, price, active): 
     self.id = identification 
     self.name = name 
     self.brand = brand 
     self.price = price 
     self.active = active 

    def __str__(self): 
     return "ID: %3d" % self.id + "\tNAME:" + self.name + "\tBRAND:" + self.brand + "\tPRICE: %3d" % self.price + "\tSTATUS:" + str(self.active) + "\n" 


db = LinkedList() 
db.pushCar(Car(213, 'smallcar', 'some germam car', 1000.0, 'yes')) 
db.pushCar(Car(312, 'smallcar', 'some germam car', 2000.0, 'no')) 
db.pushCar(Car(419, 'bigcar', 'some germam car', 19210.0, 'yes')) 
db.pushCar(Car(520, 'bigcar', 'some germam car', 1234.0, 'no')) 
print(db) 
print(db.emptyCheck()) 
print('\n') 
print(db) 
print(db.emptyCheck()) 
+0

'push'ではなぜ' .data'を再度割り当てますか? – tijko

+0

@tijkoああ、あなたが何を言っているのか分かりませんが、Nodeインスタンシエーションがそれを渡すことに気付かなかったのです。今すぐコードを更新しました。ありがとうございます。 – reticentroot

+0

@reticentroot申し訳ありませんが、私が投稿したコードがちょうど意味をなさないことに気付きました。今それは正しいはずです。それを確認できますか?私は車を価格で(高から低へ)並べ替えたい。頭の問題は依然として続きます。 –

関連する問題