链表头部未被指定

2024-09-22 22:33:56 发布

您现在位置:Python中文网/ 问答频道 /正文


刚开始编程。我对链表有这个问题,我不能正确地分配头。应该是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()

Tags: selfnonerefnodedatareturndefcar
1条回答
网友
1楼 · 发布于 2024-09-22 22:33:56

所以在再次查看您的代码后,我相信我看到了您遇到的问题。首先,代码运行正常。当您滚动到pushCar方法时,您将看到我添加了一个print语句。如果按原样运行此代码,您将看到head只空一次,并且emptyCheck返回False。如果先print(db)然后检查头部,就会出现问题。原因在于你的定义。在链表上迭代,直到没有,但从不重置链表。换句话说,您正在使用数据,并在最后将head设置为None。我继续更新了您的__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())

相关问题 更多 >