2016-10-31 10 views
0

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

+0

Was meinen Sie mit Ihrer zweiten Frage? – MooingRawr

+1

"* 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

+0

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

Antwort

0

Hier ist, wie Python-Listen in CPython implementiert: http://www.laurentluce.com/posts/python-list-implementation/

Wenn Sie Ihre Werte in anderen iterierbaren Werten haben, dann ja:

for item in list_of_items: 
    mylist.add_node(item) 
+0

Dies würde funktionieren, aber ich kann nicht die Variable list_of_items verwenden, weil es eine integrierte Python-Liste ist –

+0

@TomFuller Ich nehme an, Sie könnten es tun mit 'input', aber das ist wahrscheinlich auch nicht erlaubt. Die Sache mit Loops ist, dass man etwas haben muss, um Werte von –

+0

zu kopieren oder zu kopieren. Ich stimme zu, alle Webseiten, die ich mir angeschaut habe, sagen dasselbe –

Verwandte Themen