Search code examples
pythonlinked-listnodespriority-queueabstract-data-type

My object apparently has no attribute 'cargo'


I'm a python/programming newb, and I am self-learning python. Unfortunately I'm really stuck! I'm in chapter 19 of "How to Think Like a Computer Scientist". The object here is to write an implementation of a Priority Queue ADT, using a linked list.

I'm getting an error at lines 22 and 32. My understanding of this error, is that one or more of my node objects do not have the attribute "cargo". I don't understand this, as all of my node objects are assigned a cargo of "None", or some number, when they are created. The node object is written as it was given in the book.

I should mention, that LINE 31 works FINE. I only have a problem when I add LINE 32, which calls LINE 22 (which is apparently where the problem is hiding) that I get an error.

Any insight would be helpful. Thank you so much!!!

I reproduced the problem on a smaller scale:

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


class Priority_Queue_For_Linked():
def __init__ (self):
    self.max = None
    self.nextmax = None
    self.min = None
    self.length = 0

def insert (self, cargo):
    node = Node(cargo)
    if self.length == 0:
        node = self.max = self.min
        self.length = 1
        return

    if node.cargo > self.max.cargo:     # <--LINE 22
        notmaxanymore = self.max
        notmaxanymore.next = node
        node = self.max
        self.nextmax = notmaxanymore
        self.length += 1
        return

testlist = Priority_Queue_For_Linked()
testlist.insert(12)
testlist.insert(22)                     # <--LINE 32

And here is the error:

=== RESTART: /Users/Desktop/Programming Career/Untitled6.py ===

Traceback (most recent call last):
File "/Users/Desktop/Programming Career/Untitled6.py", line 31, in <module>
testlist.insert(22)# <--line 32
  File "/Users/Desktop/Programming Career/Untitled6.py", line 21, in insert
if node.cargo > self.max.cargo:# <--line 22
AttributeError: 'NoneType' object has no attribute 'cargo'

I doubt you need more context, but in case it helps, here is all of the code:

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

def __str__(self):
    return str(self.cargo)

def print_backward (self):
    if self.next != None:
        tail = self.next
        tail.print_backward()
    print self.cargo,

def print_list(node):
    while node:
        print node,
        node = node.next
    print


class Priority_Queue_For_Linked():
def __init__ (self):
    self.max = None
    self.nextmax = None
    self.min = None
    self.length = 0

def is_empty (self):
    if self.length == 0:
        print "List is empty."

def insert (self, cargo):
    node = Node(cargo)
    if self.length == 0:
        node = self.max = self.min
        self.length = 1
        return

    if node.cargo > self.max.cargo:########40
        notmaxanymore = self.max
        notmaxanymore.next = node
        node = self.max
        self.nextmax = notmaxanymore
        self.length += 1
        return

    if node.cargo < self.min.cargo:
        notminanymore = self.min
        node.next = notminanymore
        node = self.min
        self.length += 1
        return

    else:
        comparisonnode = self.min.next
        comparisonprev = self.min
        for i in range (2, self.length):
            if node.cargo < comparisonnode.cargo:
                node.next = comparisonnode
                comparisonprev.next = node
                self.length += 1
                break
            comparisonnode = comparisonnode.next
            comparisonprev = comparisonprev.next

def remove (self):
    maxtoremove = self.max
    self.max = self.nextmax
    self.max.next = None
    length -=1 
    return maxtoremove.cargo

def print_list(self):
    tempnode = self.min
    print "[",
    while not tempnode == None:
        print tempnode,
        tempnode = tempnode.next
    print "]"



testlist = Priority_Queue_For_Linked()
testlist.insert(12)
testlist.insert(22)#######86

Solution

  • When you insert your first item you have a problem in your assignments:

    if self.length == 0:
        node = self.max = self.min
        self.length = 1
        return
    

    This will not change the value of self.max or self.min and they will stay as None, which of course won't have cargo. You also lose the node you are trying to add. I assume you wanted to do this:

    self.max = self.min = node