Ich habe ein Projekt, um eine verknüpfte Liste in Python zu machen.Erstellen einer verketteten Liste ohne eingebaute Funktionen
Mein Programm muss zur Liste hinzufügen, daraus entfernen und Elemente abrufen. Klingt einfach, oder? Falsch! Wir sind nicht berechtigt, normale Listen oder eingebaute Funktionen zu verwenden (andere als die grundlegenden print
, str
...)
Ich habe ein Problem mit meinem Code, ich muss eine leere Liste initialisieren und dann die Elemente hinzufügen, 1 zu 1. Alles andere funktioniert gut.
Meine Fragen:
Ist dies, wie eine normale Python-Liste funktioniert?
Ist es möglich, Elemente zu einer verknüpften Liste mit einer Schleife hinzuzufügen? (Ohne eine andere Liste)
Hier ist der Code:
class Node: # the node class
def __init__(self, cargo = None, next = None): # __init__ stands for initialize
self.cargo = cargo # e.g. steve
self.next = next # represents the next node or None if its the last
def __str__(self): # __str__ is called when the node is printed or converted to a string
return str(self.cargo) # return a string
class List: # the main list class
def __init__(self): # default is to initialize an empty list
self.first_node = None
self.last_node = None
self.length = 0
def get(self, position, length): # function for efficiency
if position == "end":
position = length - 1 # last
if position > length - 1: # can't go beyond last
raise ValueError("List index out of range")
prv_node = self.first_node
node = self.first_node # start at the first
num = 0
while num < position: # go up to position
prv_node = node # remember the previous node
node = node.next # next node!
num = num + 1
return prv_node, node, position
def add_node(self, cargo, position = "end"): # adds a node
prv_node, node, position = self.get(position, self.length + 1) # +1 because the length is being increased
print("adding node at "+str(position)+": "+str(cargo))
if position == 0: # first
self.first_node = Node(cargo, next = self.first_node) # the first node is the new node
if self.length == 0: # first node to be added
self.last_node = self.first_node # there is only one node
elif position == self.length: # last
self.last_node.next = Node(cargo, next = None) # last_node.next was None, it is now a new node
self.last_node = self.last_node.next # last node is now the new last node
else: # normal
prv_node.next = Node(cargo, next = node) # stick it in between
self.length = self.length + 1 # length is now + 1
def get_node(self, position): # gets a node
...
def remove_node(self, position): # removes a node
...
def __str__(self): # when the list is printed
node = self.first_node # start from the first
string = ""
while node != self.last_node: # go to the end
string = string + str(node) + ", " # print each node
node = node.next
string = string + str(self.last_node) # last node hasn't been added yet
return string
# initialize
mylist = List()
mylist.add_node("steve")
mylist.add_node("james")
mylist.add_node("tom")
mylist.add_node("david")
mylist.add_node("hoe-yin")
mylist.add_node("daniel")
print(mylist)
[EDIT] zweite Frage neu formuliert
Was meinen Sie mit Ihrer zweiten Frage? – MooingRawr
"* So funktioniert eine normale Python-Liste *" - könnte sein, möglicherweise nicht. Die Sprache spezifiziert nicht * wie * Listen implementiert werden, sondern nur die benötigten Funktionen. Die C-Implementierung verwendet ein C-Array von Zeigern auf Python-Objekte, aber die Objekte selbst enthalten keine Links, also in diesem Fall keine. – cdarke
Was meinen Sie mit der Frage "Ist es möglich, eine verknüpfte Liste mit einer Schleife zu initialisieren?" ? Sie möchten wissen, ob es eine Möglichkeit gibt, Elemente zur Liste in der Schleife hinzuzufügen? – Nf4r