2017-12-22 16 views
0

2クラスのショールームを行うための学業を得ました。車&ノード、ノードデータにはデータとともにCarクラスが含まれています。次に、私はリンクされたリストを作成する必要があります、二重にする必要がありますが、私はシンプルでも、ノードを含むノードで動作すると思います。リンクされたリスト内の唯一の機能は、新規のCarで新しいノードを挿入することです。それは車の価格によって上向きにソートされるべきです。私はそれが動作するはずだと思う「原因、私は何かを欠場 リンクされたリストのクラスが機能しない

はこれを試してみましたが、それは私に
class Car: 
    def __init__(self, id = None, name = None, brand = None, price = None, active = None): 
     self.id = id 
     self.name = name 
     self.brand = brand 
     self.price = price 
     self.active = active 

class Node: 
    def __init__(self, data): 
     self.next = None 
     self.data = Car() 

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

    def insertNode(self, car): 
     newNode = Node(car) 
     curNode = self.head 
     if self.head.data is None: 
      self.head = newNode 
     if newNode.data.price < curNode.data.price: 
      newNode.next = curNode 
      self.head = newNode 
     else: 
      while curNode.next is not None and curNode.next.data.price <= newNode.data.price: 
       curNode = curNode.next 
      newNode.next = curNode.next 
      curNode.next = newNode 
db = LinkedList() 

def init(cars): 
    for car in cars: 
     db.insertNode(car) 

def add(car): 
    db.insertNode(car) 

TypeError: '<' not supported between instances of 'NoneType' and 'NoneType'

を言って続けています。

+0

ノードは正確に何を行い、 "データ"は何ですか?ノードを渡すと変数データが​​初期化されますが、ノードを作成するたびに空のカーのみが割り当てられます。 – Banana

+0

@Bananaもちろん、私は** car **を定義するより多くの機能を持っていますが、私はその関数を呼び出しますが、それでも私は同じエラーを伝え続けます。 –

+0

次のように編集します –

答えて

0

Node.__init__には、デフォルト値(すべてがNone)を使用してCarインスタンスを作成するself.data = Car()というインスタンスがあります。つまり、リスト内のすべてのCarの価格はNoneです。後で、値を比較できないため、価格をnewNode.data.price < curNode.data.priceと比較しようとすると例外が発生します。

おそらくself.data = Car()を別のものに置き換える必要があります。現在のコードから車のデータがどこに来るのか、どのようなフォーマットであるのかはわかりません。carsシーケンスがinitのトップレベルで反復処理されている場合は、すでにCarインスタンスのリストになっていますおそらくself.data = dataNode.__init__に入れてください。それ以外の場合は、車のデータを抽出してCarコンストラクタに渡すために何か別の処理を行う必要があります。デフォルトの引数をCar.__init__に取り除くことも考えられます。なぜなら、それを使わないで車を作るのはあまり意味がないようです。

+0

ええ、** self.headがNone **の場合は、例えばnewNode(car)を追加するよりも**。 _car =(1、 'car'、 'bmw'、3000、True)_ –

+0

私は_self.head = Node(car)_を持っている必要がありますか? これは正しく動作するはずですので、 私は** self.head **を持っています。その後、新しいノードとself.head(これはNode)との比較を開始できます。具体的には、データ(車)、特に_id、name、brand、price&active_ –

0

主にコードの型の一貫性に関するいくつかの問題があります。ここでクラス構造が正確に何をするのか、どのようにデフォルト値を設定するのか、考え直すべきでしょう。また、ノードを次の変数にして別のノードにしたいのですか?

次のように仮定します。私たちは車を持っています。各車は名前、ブランド、pricetagを持っています。私たちは2つの車がノードによって接続されることを望みます。そして、ノードを保持し、新しいノードを挿入できるようにするリストが必要です。ノード階層が昇順価格で自動車を接続するような挿入が行われるべきである。隣接する2つのノードは1台の車を共有します。

class Car: 
    def __init__(self, name = " ", brand = " ", price = 0): 
     self.name = name 
     self.brand = brand 
     self.price = price 

class Node: 
    def __init__(self,car1,car2): 
     assert type(car1) == type(car2) == Car 
     if car1.price > car2.price: 
      self.next = car1 
      self.current = car2 
     else: 
      self.next = car2 
      self.current = car1 

class LinkedList: 
    def __init__(self,firstnode): 
     self.ListOfNodes = [firstnode] 

    def insertNode(self, car): 
     for i in range(0,len(self.ListOfNodes)): 
      curnod = self.ListOfNodes[i] 
      newnod = Node(car,car) 
      if car.price < curnod.current.price: 
       if i<len(self.ListOfNodes): #If its not the last node 
        newnod.next = curnod.current 
       if i>0: #If its not the first node, i.e. it has a predecessor 
        ListOfNodes[i-1].next = newnod.current 
       self.ListOfNodes.insert(i,newnod) 
       return 
      elif car.price < curnod.next.price: 
       newnod.current = curnod.current 
       curnod.current = car 
       self.ListOfNodes.insert(i,newnod) 
       return 
     newnod.current = self.ListOfNodes[-1].next #this is only reached if the price is higher than all before 
     self.ListOfNodes.append(newnod) 




car1 = Car(name = "baby",brand= "honda", price = 1000) 
car2 = Car(name = "yomomma",brand= "Benz", price = 10) 
car3 = Car(name = "PussyWagon",brand= "Dodge", price = 100) 
car4 = Car(name = "FakeTaxi",brand= "HellNah", price = 10000000) 
car5 = Car(name = "LondonTaxi",brand= "ChumBucket", price = 1) 
p = Node(car2,car1) 
lst = LinkedList(p) 
lst.insertNode(car3) 
lst.insertNode(car4) 
lst.insertNode(car5) 

非常に一般的ですが、動作するはずです。

関連する問題