2016-11-20 2 views
0


только что начал программировать. У меня есть эта проблема со связанным списком, где я не могу правильно назначить голову. Это должна быть функция pushCar() внутри LinkedList, что дает мне проблемы. Если я попытаюсь добавить автомобиль, голова никогда не будет назначена. Просто не могу найти проблему. Если бы кто-нибудь мог взглянуть и указать, что случилось, я был бы очень благодарен.
БлагодаряСвязанный список 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: 
      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

Этот код, как написано не разобрать, очистить линию Элиф ref.data.price carData.price: и все окружающие его –

+0

Мои извинения за неверный код, который я разместил, теперь должно быть все правильно. –

ответ

1

Таким образом, после снова глядя на свой код, я считаю, что я вижу, где у вас возникли проблемы. Сначала вы выполняете код очень хорошо. Когда вы перейдете к методу pushCar, вы увидите, что я добавил заявление печати. Если вы запустите этот код, вы увидите, что голова была только каждый пустой раз и что вы emptyCheck возвращает False. Проблема возникает, если вы сначала print(db), а затем проверьте голову. Причина заключается в определении вашего __str__. Вы перебираете связанный список до None, но никогда не перезапускаете Связанный список. Другими словами, вы потребляете данные и устанавливаете головку на None в конце. Я пошел дальше и обновил ваш метод __str__, чтобы копия данных хранилась до итерации, а затем с помощью этой копии связанный список сбрасывался. Другой способ исправить это вместо того, чтобы перебирать self.head в вашем методе __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 oh Я вижу, о чем вы говорите, я не заметил, что экземпляр Node передает его. Обновлен код только сейчас, спасибо. – reticentroot

+0

@reticentroot Простите, что только что понял, что код, который я опубликовал, просто не имеет никакого смысла. Теперь это должно быть правильно. Не могли бы вы это проверить? Я хочу, чтобы автомобили сортировались по цене (от высокой к низкой). Проблема с головой все еще сохраняется. –