Book Object with attributes: Title, Author, Year
class Book():
def __init__(self, title = "", author = "", year = None):
self.title = title
self.author = author
self.year = year
def getTitle(self):
return self.title
def getAuthor(self):
return self.author
def getYear(self):
return self.year
def getBookDetails(self):
string = ("Title: {}, Author: {}, Year: {}"\
.format(self.title, self.author, self.year))
return string
Linked List called BookCollection
class BookCollection()
def __init__(self):
self.head = None
def insertBook(self, book)
temp = BookCollectionNode(book)
temp.setNext(self.head)
self.head = temp
def getAllBooksInCollection(self):
node = self.head
Here is the issue below. I amUsing a while loop to print each node, however its printing the location of the node
while node:
print(node)
node = node.next
Node class called BookCollectionNode
class BookCollectionNode():
def __init__(self, data):
self.data = data
self.next = None
def getData(self):
return self.data
def getNext(self):
return self.next
def setData(self, newData):
self.data = newData
def setNext(self, newNext):
self.next = newNext
Using the functions below to print the nodes of the linked list
b0 = Book("Cujo", "King, Stephen", 1981)
b1 = Book("The Shining", "King, Stephen", 1977)
b2 = Book("Ready Player One", "Cline, Ernest", 2011)
b3 = Book("Rage", "King, Stephen", 1977)
bc = BookCollection()
bc.insertBook(b0)
bc.insertBook(b2)
bc.insertBook(b3)
print(bc.getAllBooksInCollection())
CodePudding user response:
Fix
As node is a BookCollectionNode
, you need to access it's book
attribut, then call getBookDetails()
method
def getAllBooksInCollection(self):
node = self.head
while node:
print(node.data.getBookDetails())
node = node.next
Improvements
It seems you don't really need methods to access your properties, but If you really want them, use
@property
class Book: def __init__(self, title="", author="", year=None): self._title = title self._author = author self._year = year @property def title(self): return self._title @property def author(self): return self._author @property def year(self): return self._year
Override method
__str__
to get a builtin string when printingclass BookCollectionNode: def __str__(self): return str(self.data) class Book: def __str__(self): return f"Title: {self._title}, Author: {self._author}, Year: {self._year}"
For
BookCollectionNode
getter/setter, the proper way isclass BookCollectionNode: def __init__(self, data): self._data = data self._next = None @property def data(self): return self._data @property def next(self): return self._next @data.setter def data(self, newData): self._data = newData @next.setter def next(self, newNext): self._next = newNext
Finally the BookCollection
class becomes
class BookCollection:
def __init__(self):
self.head = None
def insert_book(self, book):
temp = BookCollectionNode(book)
temp.next = self.head
self.head = temp
# 'print_' and not 'get_' as you don't return anything
def print_all_books_in_collection(self):
node = self.head
while node:
print(node)
node = node.next
CodePudding user response:
I think, that you need to add a data argument to your constructor to get something like this:
class Node:
def __init__(self, data, next=None):
self.data = data
self.next = next
# Using an object of a Book with attributes: Title, Author, Year
b0 = Book("Cujo", "King, Stephen", 1981)
b1 = Book("The Shining", "King, Stephen", 1977)
b2 = Book("Ready Player One", "Cline, Ernest", 2011)
b3 = Book("Rage", "King, Stephen", 1977)
head = Node(b0, Node(b1, Node(b2, Node(b3))))
def print_list(head, end='\n'):
while head:
# You can extend the below logic
print(head.data, end=' -> ' if head.next else '')
head = head.next
print(end=end)
print_list(head)