Вот модифицированная версия вашего кода с работающим методом delete_node
, и я сделал несколько других изменений в классе PlayerScore
.Я отделил идентификационный номер от данных баллов;идентификационный номер не является баллом, поэтому объединять их не имеет смысла.Я дал PlayerScore
метод __str__
, чтобы упростить печать узлов.Я избавился от этого __eq__
метода, потому что обнаружил, что он затрудняет чтение и анализ кода.
Я удалил материал modi
из delete_node
;этот материал не имеет ничего общего с удалением узла, поэтому он принадлежит отдельному методу.
Я также внес пару изменений в main
.Я дал ему цикл ввода, чтобы мы могли попробовать удалить несколько узлов, чтобы проверить наш метод delete_node
.И я добавил тест, чтобы убедиться, что введенный идентификационный номер можно преобразовать в целое число.
class PlayerScore:
def __init__(self, data, nxt=None):
self.idnum, *self.scores = data
self.nxt = nxt
def __len__(self):
return len(self.scores)
def __str__(self):
terms = ["No: " + str(self.idnum)]
terms += ["Game {}: {}".format(i, v)
for i, v in enumerate(self.scores, 1)]
return ', '.join(terms)
def delete_node(self, idnum):
curr = self
prev = None
# Find the node with idnum
while curr is not None:
if curr.idnum == idnum:
break
prev = curr
curr = curr.nxt
else:
print("Node {} not found".format(idnum))
return self
#print('CURR', curr, 'PREV', prev)
if prev is None:
new_head = curr.nxt
else:
new_head = self
prev.nxt = curr.nxt
del curr
return new_head
def print_score(score_list):
if score_list is None:
print("No player records")
return
print("Original linked list:")
curr = score_list
while curr is not None:
print(curr)
curr = curr.nxt
print()
def main():
data_list = [
[199, 94, 96, 109],
[185, 203, 156, 171],
[173, 104, 190, 224],
[154, 268, 287, 300],
]
#create SLL
head = None
for data in data_list:
head = PlayerScore(data, head)
print_score(head)
while head is not None:
value = input("Enter a Student's ID for deletion, or 0 to exit: ")
try:
value = int(value)
except ValueError:
print("ID must be an integer")
continue
if value == 0:
break
head = head.delete_node(value)
print_score(head)
if __name__ == "__main__":
main()
демонстрационный вывод
Original linked list:
No: 154, Game 1: 268, Game 2: 287, Game 3: 300
No: 173, Game 1: 104, Game 2: 190, Game 3: 224
No: 185, Game 1: 203, Game 2: 156, Game 3: 171
No: 199, Game 1: 94, Game 2: 96, Game 3: 109
Enter a Student's ID for deletion, or 0 to exit: abc
ID must be an integer
Enter a Student's ID for deletion, or 0 to exit: 200
Node 200 not found
Original linked list:
No: 154, Game 1: 268, Game 2: 287, Game 3: 300
No: 173, Game 1: 104, Game 2: 190, Game 3: 224
No: 185, Game 1: 203, Game 2: 156, Game 3: 171
No: 199, Game 1: 94, Game 2: 96, Game 3: 109
Enter a Student's ID for deletion, or 0 to exit: 199
Original linked list:
No: 154, Game 1: 268, Game 2: 287, Game 3: 300
No: 173, Game 1: 104, Game 2: 190, Game 3: 224
No: 185, Game 1: 203, Game 2: 156, Game 3: 171
Enter a Student's ID for deletion, or 0 to exit: 154
Original linked list:
No: 173, Game 1: 104, Game 2: 190, Game 3: 224
No: 185, Game 1: 203, Game 2: 156, Game 3: 171
Enter a Student's ID for deletion, or 0 to exit: 173
Original linked list:
No: 185, Game 1: 203, Game 2: 156, Game 3: 171
Enter a Student's ID for deletion, or 0 to exit: 185
No player records