2016-11-20 54 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方法時,你會看到我添加了一個打印語句。如果按原樣運行此代碼,則會看到頭只有一次是空的,並且emptyCheck返回False。如果您先登錄print(db),然後檢查頭部,則會出現問題。原因在於你的__str__定義。您遍歷鏈接列表直到無,但不會重置鏈接列表。換句話說,您正在使用數據,並在最後將頭部設置爲「無」。我繼續並更新了__str__方法,以便在迭代之前存儲數據的副本,然後使用該副本重置鏈接列表。修補它的另一種方法是代替迭代自己的方法__str__方法是使用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對不起,只是意識到我發佈的代碼沒有任何意義。現在應該是正確的。你能檢查一下嗎?我希望汽車按價格排序(從高到低)。頭部問題仍然存在。 –