diff --git a/linkedAfter/.cs50.yml b/linkedAfter/.cs50.yml new file mode 100644 index 0000000..39c54b8 --- /dev/null +++ b/linkedAfter/.cs50.yml @@ -0,0 +1,10 @@ +submit50: + files: &submit50_files + - !exclude "*" + - !include "*.py" + - !require linkedAfter.py + +check50: + files: *submit50_files + checks: checks/main.py + \ No newline at end of file diff --git a/linkedAfter/checks/__init__.py b/linkedAfter/checks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/linkedAfter/checks/main.py b/linkedAfter/checks/main.py new file mode 100644 index 0000000..296cb8c --- /dev/null +++ b/linkedAfter/checks/main.py @@ -0,0 +1,160 @@ +import check50 +import check50.py + +FILE_NAME = "linkedAfter.py" + + +def to_list(ll): + """LinkedList -> Python-Liste (mit Zyklus-Schutz).""" + out = [] + cur = ll.head + seen = 0 + while cur is not None: + out.append(cur.value) + cur = cur.next + seen += 1 + if seen > 10_000: + msg = f"Linked list appears to have a cycle (more than {seen} nodes)" + raise check50.Failure(msg) + return out + + +def build_ll(module, values): + """Erzeugt eine LinkedList über FromPythonlist (wie in der Aufgabe vorgegeben).""" + ll = module.LinkedList() + ll.FromPythonlist(values) + return ll + + +def a(self, b): + c = self.head + while c is not None: + if c.value == b: + return c + c = c.next + return None + + +@check50.check() +def exists(): + """linkedAfter.py exists""" + check50.exists(FILE_NAME) + + +@check50.check(exists) +def compiles(): + """linkedAfter.py compiles""" + check50.py.compile(FILE_NAME) + + +@check50.check(compiles) +def has_classes_and_method(): + """ListNode, LinkedList and insertAfterNode exist""" + module = check50.py.import_(FILE_NAME) + + if not hasattr(module, "ListNode"): + msg = f"Class `ListNode` not found in {FILE_NAME}" + raise check50.Failure(msg) + + if not hasattr(module, "LinkedList"): + msg = f"Class `LinkedList` not found in {FILE_NAME}" + raise check50.Failure(msg) + + if not hasattr(module.LinkedList(), "insertAfterNode"): + msg = "Method `insertAfterNode` not found in Class `LinkedList`" + raise check50.Failure(msg) + + +@check50.check(has_classes_and_method) +def test_frompythonlist_order_is_head_insertion(): + """FromPythonlist: inserts after head (result is reversed input order)""" + module = check50.py.import_(FILE_NAME) + + ll = build_ll(module, [1, 2, 8, 4]) + expected = [4, 8, 2, 1] # weil insertAfterHead bei Vorwärtsiteration umdreht + actual = to_list(ll) + + if actual != expected: + raise check50.Mismatch(str(expected), str(actual)) + + +@check50.check(has_classes_and_method) +def test_insert_after_middle(): + """insertAfterNode inserts after a middle node (in reversed-built list)""" + module = check50.py.import_(FILE_NAME) + + ll = build_ll(module, [1, 2, 8, 4]) # Liste: 4 -> 8 -> 2 -> 1 + module.LinkedList.searchValue = a + node = ll.searchValue(8) + if node is None: + msg = "searchValue(8) returned None, but 8 should be in the list" + raise check50.Failure(msg) + + ll.insertAfterNode(node, module.ListNode(3)) + + expected = [4, 8, 3, 2, 1] + actual = to_list(ll) + if actual != expected: + raise check50.Mismatch(str(expected), str(actual)) + + +@check50.check(has_classes_and_method) +def test_insert_after_head(): + """insertAfterNode inserts after head""" + module = check50.py.import_(FILE_NAME) + + ll = build_ll(module, [10, 20, 30]) # Liste: 30 -> 20 -> 10 + module.LinkedList.searchValue = a + head = ll.head + if head is None: + msg = "Linked list head is None after FromPythonlist" + raise check50.Failure(msg) + + ll.insertAfterNode(head, module.ListNode(25)) + + expected = [30, 25, 20, 10] + actual = to_list(ll) + if actual != expected: + raise check50.Mismatch(str(expected), str(actual)) + + +@check50.check(has_classes_and_method) +def test_insert_after_tail(): + """insertAfterNode inserts after last node (tail)""" + module = check50.py.import_(FILE_NAME) + + ll = build_ll(module, [10, 20, 30]) # Liste: 30 -> 20 -> 10 + module.LinkedList.searchValue = a + tail = ll.searchValue(10) # 10 ist Tail + if tail is None: + msg = "searchValue(10) returned None, but 10 should be in the list" + raise check50.Failure(msg) + + ll.insertAfterNode(tail, module.ListNode(5)) + + expected = [30, 20, 10, 5] + actual = to_list(ll) + if actual != expected: + raise check50.Mismatch(str(expected), str(actual)) + + +@check50.check(has_classes_and_method) +def test_insert_after_none_prevnode(): + """insertAfterNode with prevNode=None: + We expect an exception (ValueError) rather than silently doing nothing.""" + module = check50.py.import_(FILE_NAME) + + ll = build_ll(module, [1, 2, 3]) + module.LinkedList.searchValue = a + prev = ll.searchValue(999) # not in list -> None + new_node = module.ListNode(4) + + threw = False + try: + ll.insertAfterNode(prev, new_node) + except ValueError: + threw = True + + if not threw: + msg = "insertAfterNode should raise an ValueError when prevNode is None" + raise check50.Failure(msg) diff --git a/linkedAfter/html/linkedAfter.html b/linkedAfter/html/linkedAfter.html new file mode 100644 index 0000000..fb71ea7 --- /dev/null +++ b/linkedAfter/html/linkedAfter.html @@ -0,0 +1,204 @@ +
+ In dieser Übung werden Sie die Datenstruktur Verkettete Liste (Linked List) erweitern.
+ Gegeben sind bereits die Klassen ListNode und LinkedList, sowie einige
+ Hilfsmethoden: FromPythonlist(inputList) zur Erzeugung einer verketteten Liste aus einer Python-Liste
+ und printList() zur Ausgabe der Liste. Ebenfalls gegeben ist die Methode
+ searchValue(value), mit deren Hilfe Sie ein Listenelement mit einem bestimmten Wert
+ suchen können. Ihre Aufgabe ist es, die Methode insertAfterNode(prevNode, newNode)
+ zu implementieren, die ein neues Listenelement newNode direkt nach dem gegebenen
+ Element prevNode einfügt.
+
+ Implementieren Sie die Methode insertAfterNode(self, prevNode, newNode) in der Klasse LinkedList.
+ Die Methode erhält das Element prevNode und das neue Element newNode
+ und soll das neue Element direkt nach prevNode in die Liste einfügen. Ist prevNode None,
+ soll eine ValueError-Exception ausgelöst werden.
+
+ Erstellen Sie eine Datei mit dem Namen
+ linkedAfter.py und
+ Implementieren Sie die Methode insertAfterNode in Ihrer Datei. Kopieren Sie dazu den
+ folgenden Codeblock in die Datei linkedAfter.py,
+ und ergänzen Sie die Methode insertAfterNode:
+
+class ListNode:
+ def __init__(self, value: int):
+ self.value: int = value
+ self.next: ListNode | None = None
+
+
+class LinkedList:
+ def __init__(self):
+ self.head = None
+
+ def FromPythonlist(self, inputList: list[int]):
+ for val in inputList:
+ newNode = ListNode(value=val)
+ self.insertAfterHead(newNode)
+
+ def searchValue(self, value: int) -> ListNode:
+ # Siehe Problem 'linkedFind.py' für die Implementierung dieser Methode
+ return
+
+ def insertAfterNode(self, prevNode: ListNode | None, newNode: ListNode):
+ # TODO: Implementieren Sie diese Methode
+ return
+
+ def printList(self):
+ current = self.head
+ while current is not None:
+ print(current.value, end=" -> ")
+ current = current.next
+ print("None")
+
+ def insertAfterHead(self, newNode: ListNode):
+ newNode.next = self.head
+ self.head = newNode
+
+Melden Sie sich bei cs50.dev an, klicken Sie
+ auf Ihr Terminal und führen Sie cd ohne Parameter aus. Sie
+ sollten feststellen, dass der Prompt Ihres Terminals wie unten aussieht:
$Als nächstes führen Sie
+mkdir
+ linkedAfteraus, um einen Ordner namens linkedAfter in Ihrem Codespace
+ zu erstellen.
Führen Sie anschließend
+cd
+ linkedAfteraus, um in dieses Verzeichnis zu wechseln. Der Prompt Ihres Terminals sollte
+ nun linkedAfter/$ anzeigen.
+ Jetzt können Sie
code
+ linkedAfter.pyausführen, um eine Datei namens linkedAfter.py zu erstellen, in der Sie Ihr
+ Programm schreiben.
+
So können Sie Ihr Programm manuell testen:
+ +
+ Testen Sie Ihre Implementierung, indem Sie das Skript ausführen.
+ Erstellen Sie dazu eine Instanz der LinkedList, fügen Sie Elemente hinzu und rufen Sie dann Ihre Methode insertAfterNode auf.
+ Überprüfen Sie anschließend, ob die Liste die erwartete Struktur hat, indem Sie printList() verwenden.
+
+ # Erstellen einer verketteten Liste aus einer Python-Liste
+ inputList = [4, 8, 2, 1]
+ ll = LinkedList()
+ ll.FromPythonlist(inputList)
+
+ print("Liste vorher:")
+ ll.printList()
+
+ node = ll.searchValue(8)
+ newNode = ListNode(3)
+ # Einfügen von 3 nach 8
+ ll.insertAfterNode(node, newNode)
+
+ print("Liste nachher:")
+ ll.printList()
+ # Erwartete Ausgabe: 1 -> 2 -> 8 -> 3 -> 4 -> None
+
+Sie können das folgende Kommando ausführen, um Ihren Code mit check50 zu überprüfen, einem Programm, das bei
+ der Abgabe verwendet wird um Ihren Code zu testen. Testen Sie Ihr Programm
+ aber auch selbst!
+ check50 HSDDigitalLabor/problems/adg2025/linkedAfter
+
+ Grüne Smileys :)
+ bedeuten, dass Ihr Programm einen Test bestanden hat! Rote
+ traurige Smileys :(
+ zeigen an, dass Ihr Programm etwas Unerwartetes ausgegeben
+ hat. Besuchen Sie die URL, die check50
+ ausgibt, um zu sehen, welche Eingabe check50
+ an Ihr Programm übergeben hat, welche Ausgabe erwartet wurde und welche
+ Ausgabe Ihr Programm tatsächlich geliefert hat.
+
Führen Sie im Terminal den folgenden Befehl aus, um Ihre Arbeit einzureichen. +
+
+ submit50 HSDDigitalLabor/problems/adg2025/linkedAfter
+ + Führen Sie diesen Befehl vor dem Fälligkeitsdatum aus. Sie können Ihre Lösung + nach dem ersten Einsenden noch ändern und erneut einreichen. Bewertet wird + die zuletzt eingereichte Version vor dem Fälligkeitsdatum. Nach Ablauf der + Frist können Sie technisch zwar noch Abgaben tätigen, Ihre Lösung wird jedoch + nicht mehr gewertet. Das Ergebnis kann ausschließlich mit obigem Befehl abgegeben + werden, eine Abgabe in Moodle ist nicht möglich. +
+ +Nach dem Einreichen der Lösung mit submit50,
+ nehmen Sie eine Pseudolösung in Moodle vor, indem Sie auf den Button
+
+ weiter unten auf dieser Seite betätigen und in das sich öffnende Feld unter
+ "Texteingabe online" den folgenden Text ein:
+
Mit submit50 abgegeben.
+Schließen Sie die Eingabe durch Klick auf den Button + unterhalb des Textfeldes ab. +
++ Zur besseren Übersicht markieren Sie das Problem linkedAfter.py in Moodle als erledigt, + indem Sie ganz oben auf dieser Seite den Button +
++ + klicken. Daraufhin erscheint der Button + +
+ +generated 2025-12-22 12:27:59
\ No newline at end of file diff --git a/linkedAfter/html/params.json b/linkedAfter/html/params.json new file mode 100644 index 0000000..579ab35 --- /dev/null +++ b/linkedAfter/html/params.json @@ -0,0 +1,9 @@ +{ + "id": "linkedAfter", + "title": "Linked List: Insert After Node", + "foldername": "linkedAfter", + "filename": "linkedAfter.py", + "asciicast_id": "", + "check50_path": "HSDDigitalLabor/problems/adg2025/linkedAfter", + "submit50_path": "HSDDigitalLabor/problems/adg2025/linkedAfter" +} \ No newline at end of file diff --git a/linkedAfter/html/template.html b/linkedAfter/html/template.html new file mode 100644 index 0000000..fe136b9 --- /dev/null +++ b/linkedAfter/html/template.html @@ -0,0 +1,112 @@ +{% include "header.html" %} + +
+ In dieser Übung werden Sie die Datenstruktur Verkettete Liste (Linked List) erweitern.
+ Gegeben sind bereits die Klassen ListNode und LinkedList, sowie einige
+ Hilfsmethoden: FromPythonlist(inputList) zur Erzeugung einer verketteten Liste aus einer Python-Liste
+ und printList() zur Ausgabe der Liste. Ebenfalls gegeben ist die Methode
+ searchValue(value), mit deren Hilfe Sie ein Listenelement mit einem bestimmten Wert
+ suchen können. Ihre Aufgabe ist es, die Methode insertAfterNode(prevNode, newNode)
+ zu implementieren, die ein neues Listenelement newNode direkt nach dem gegebenen
+ Element prevNode einfügt.
+
+ Implementieren Sie die Methode insertAfterNode(self, prevNode, newNode) in der Klasse LinkedList.
+ Die Methode erhält das Element prevNode und das neue Element newNode
+ und soll das neue Element direkt nach prevNode in die Liste einfügen. Ist prevNode None,
+ soll eine ValueError-Exception ausgelöst werden.
+
+ {% include "file.html" %}
+ Implementieren Sie die Methode insertAfterNode in Ihrer Datei. Kopieren Sie dazu den
+ folgenden Codeblock in die Datei {{filename}},
+ und ergänzen Sie die Methode insertAfterNode:
+
+class ListNode:
+ def __init__(self, value: int):
+ self.value: int = value
+ self.next: ListNode | None = None
+
+
+class LinkedList:
+ def __init__(self):
+ self.head = None
+
+ def FromPythonlist(self, inputList: list[int]):
+ for val in inputList:
+ newNode = ListNode(value=val)
+ self.insertAfterHead(newNode)
+
+ def searchValue(self, value: int) -> ListNode | None:
+ # Siehe Problem 'linkedFind.py' für die Implementierung dieser Methode
+ return
+
+ def insertAfterNode(self, prevNode: ListNode | None, newNode: ListNode):
+ # TODO: Implementieren Sie diese Methode
+ return
+
+ def printList(self):
+ current = self.head
+ while current is not None:
+ print(current.value, end=" -> ")
+ current = current.next
+ print("None")
+
+ def insertAfterHead(self, newNode: ListNode):
+ newNode.next = self.head
+ self.head = newNode
+
+
+ Testen Sie Ihre Implementierung, indem Sie das Skript ausführen.
+ Erstellen Sie dazu eine Instanz der LinkedList, fügen Sie Elemente hinzu und rufen Sie dann Ihre Methode insertAfterNode auf.
+ Überprüfen Sie anschließend, ob die Liste die erwartete Struktur hat, indem Sie printList() verwenden.
+
+ # Erstellen einer verketteten Liste aus einer Python-Liste
+ inputList = [4, 8, 2, 1]
+ ll = LinkedList()
+ ll.FromPythonlist(inputList)
+
+ print("Liste vorher:")
+ ll.printList()
+
+ node = ll.searchValue(8)
+ newNode = ListNode(3)
+ # Einfügen von 3 nach 8
+ ll.insertAfterNode(node, newNode)
+
+ print("Liste nachher:")
+ ll.printList()
+ # Erwartete Ausgabe: 1 -> 2 -> 8 -> 3 -> 4 -> None
+
+
+ In dieser Übung werden Sie die Datenstruktur Verkettete Liste (Linked List) erweitern.
+ Gegeben sind bereits die Klassen ListNode und LinkedList, sowie einige
+ Hilfsmethoden: FromPythonlist(inputList) zur Erzeugung einer verketteten Liste aus einer Python-Liste
+ und printList() zur Ausgabe der Liste.
+ Ihre Aufgabe ist es, die Methode searchValue(value)
+ zu implementieren, mit deren Hilfe Sie ein Listenelement mit einem bestimmten Wert
+ suchen können.
+
+ Implementieren Sie die Methode searchValue(self, value) in der Klasse LinkedList.
+ Die Methode erhält den Wert value, nach dem gesucht werden soll, und
+ soll das erste ListNode-Objekt zurückgeben, das diesen Wert enthält. Wird kein Element mit dem
+ gesuchten Wert gefunden, soll None zurückgegeben werden.
+
+ Erstellen Sie eine Datei mit dem Namen
+ linkedFind.py und
+ Implementieren Sie die Funktion searchValue(self, value) in Ihrer Datei.
+ Kopieren Sie dazu den folgenden Codeblock in die Datei
+ linkedFind.py,
+ und ergänzen Sie die Methode searchValue(self, value):
+
+class ListNode:
+ def __init__(self, value: int):
+ self.value: int = value
+ self.next: ListNode | None = None
+
+
+class LinkedList:
+ def __init__(self):
+ self.head = None
+
+ def FromPythonlist(self, inputList: list[int]):
+ for val in inputList:
+ newNode = ListNode(value=val)
+ self.insertAfterHead(newNode)
+
+ def searchValue(self, value: int) -> ListNode | None:
+ # TODO implementieren Sie hier die Suche nach dem Wert
+ return None
+
+ def printList(self):
+ current = self.head
+ while current is not None:
+ print(current.value, end=" -> ")
+ current = current.next
+ print("None")
+
+ def insertAfterHead(self, newNode: ListNode):
+ newNode.next = self.head
+ self.head = newNode
+
+Melden Sie sich bei cs50.dev an, klicken Sie
+ auf Ihr Terminal und führen Sie cd ohne Parameter aus. Sie
+ sollten feststellen, dass der Prompt Ihres Terminals wie unten aussieht:
$Als nächstes führen Sie
+mkdir
+ linkedFindaus, um einen Ordner namens linkedFind in Ihrem Codespace
+ zu erstellen.
Führen Sie anschließend
+cd
+ linkedFindaus, um in dieses Verzeichnis zu wechseln. Der Prompt Ihres Terminals sollte
+ nun linkedFind/$ anzeigen.
+ Jetzt können Sie
code
+ linkedFind.pyausführen, um eine Datei namens linkedFind.py zu erstellen, in der Sie Ihr
+ Programm schreiben.
+
So können Sie Ihr Programm manuell testen:
+ +
+ Testen Sie Ihre Implementierung, indem Sie das Skript ausführen.
+ Erstellen Sie dazu eine Instanz der LinkedList,
+ fügen Sie Elemente hinzu und rufen Sie dann Ihre Methode searchValue auf.
+ Überprüfen Sie anschließend, ob die Liste die erwartete Struktur hat,
+ indem Sie printList() verwenden.
+
+ # Erstellen einer verketteten Liste aus einer Python-Liste
+ inputList = [1, 2, 8, 4]
+ ll = LinkedList()
+ ll.FromPythonlist(inputList)
+
+ print("Liste:")
+ ll.printList()
+
+ node = ll.searchValue(8)
+ if node is not None:
+ print(f"Gefundenes Element: {node.value}")
+ else:
+ print("Element nicht gefunden.")
+
+
+Sie können das folgende Kommando ausführen, um Ihren Code mit check50 zu überprüfen, einem Programm, das bei
+ der Abgabe verwendet wird um Ihren Code zu testen. Testen Sie Ihr Programm
+ aber auch selbst!
+ check50 HSDDigitalLabor/problems/adg2025/linkedFind
+
+ Grüne Smileys :)
+ bedeuten, dass Ihr Programm einen Test bestanden hat! Rote
+ traurige Smileys :(
+ zeigen an, dass Ihr Programm etwas Unerwartetes ausgegeben
+ hat. Besuchen Sie die URL, die check50
+ ausgibt, um zu sehen, welche Eingabe check50
+ an Ihr Programm übergeben hat, welche Ausgabe erwartet wurde und welche
+ Ausgabe Ihr Programm tatsächlich geliefert hat.
+
Führen Sie im Terminal den folgenden Befehl aus, um Ihre Arbeit einzureichen. +
+
+ submit50 HSDDigitalLabor/problems/adg2025/linkedFind
+ + Führen Sie diesen Befehl vor dem Fälligkeitsdatum aus. Sie können Ihre Lösung + nach dem ersten Einsenden noch ändern und erneut einreichen. Bewertet wird + die zuletzt eingereichte Version vor dem Fälligkeitsdatum. Nach Ablauf der + Frist können Sie technisch zwar noch Abgaben tätigen, Ihre Lösung wird jedoch + nicht mehr gewertet. Das Ergebnis kann ausschließlich mit obigem Befehl abgegeben + werden, eine Abgabe in Moodle ist nicht möglich. +
+ +Nach dem Einreichen der Lösung mit submit50,
+ nehmen Sie eine Pseudolösung in Moodle vor, indem Sie auf den Button
+
+ weiter unten auf dieser Seite betätigen und in das sich öffnende Feld unter
+ "Texteingabe online" den folgenden Text ein:
+
Mit submit50 abgegeben.
+Schließen Sie die Eingabe durch Klick auf den Button + unterhalb des Textfeldes ab. +
++ Zur besseren Übersicht markieren Sie das Problem linkedFind.py in Moodle als erledigt, + indem Sie ganz oben auf dieser Seite den Button +
++ + klicken. Daraufhin erscheint der Button + +
+ +generated 2025-12-22 10:29:53
\ No newline at end of file diff --git a/linkedFind/html/params.json b/linkedFind/html/params.json new file mode 100644 index 0000000..198cb71 --- /dev/null +++ b/linkedFind/html/params.json @@ -0,0 +1,9 @@ +{ + "id": "linkedFind", + "title": "Linked List: Ist der Wert in der Liste", + "foldername": "linkedFind", + "filename": "linkedFind.py", + "asciicast_id": "", + "check50_path": "HSDDigitalLabor/problems/adg2025/linkedFind", + "submit50_path": "HSDDigitalLabor/problems/adg2025/linkedFind" +} \ No newline at end of file diff --git a/linkedFind/html/template.html b/linkedFind/html/template.html new file mode 100644 index 0000000..77d73cb --- /dev/null +++ b/linkedFind/html/template.html @@ -0,0 +1,108 @@ +{% include "header.html" %} + +
+ In dieser Übung werden Sie die Datenstruktur Verkettete Liste (Linked List) erweitern.
+ Gegeben sind bereits die Klassen ListNode und LinkedList, sowie einige
+ Hilfsmethoden: FromPythonlist(inputList) zur Erzeugung einer verketteten Liste aus einer Python-Liste
+ und printList() zur Ausgabe der Liste.
+ Ihre Aufgabe ist es, die Methode searchValue(value)
+ zu implementieren, mit deren Hilfe Sie ein Listenelement mit einem bestimmten Wert
+ suchen können.
+
+ Implementieren Sie die Methode searchValue(self, value) in der Klasse LinkedList.
+ Die Methode erhält den Wert value, nach dem gesucht werden soll, und
+ soll das erste ListNode-Objekt zurückgeben, das diesen Wert enthält. Wird kein Element mit dem
+ gesuchten Wert gefunden, soll None zurückgegeben werden.
+
+ {% include "file.html" %}
+ Implementieren Sie die Funktion searchValue(self, value) in Ihrer Datei.
+ Kopieren Sie dazu den folgenden Codeblock in die Datei
+ {{filename}},
+ und ergänzen Sie die Methode searchValue(self, value):
+
+class ListNode:
+ def __init__(self, value: int):
+ self.value: int = value
+ self.next: ListNode | None = None
+
+
+class LinkedList:
+ def __init__(self):
+ self.head = None
+
+ def FromPythonlist(self, inputList: list[int]):
+ for val in inputList:
+ newNode = ListNode(value=val)
+ self.insertAfterHead(newNode)
+
+ def searchValue(self, value: int) -> ListNode | None:
+ # TODO implementieren Sie hier die Suche nach dem Wert
+ return None
+
+ def printList(self):
+ current = self.head
+ while current is not None:
+ print(current.value, end=" -> ")
+ current = current.next
+ print("None")
+
+ def insertAfterHead(self, newNode: ListNode):
+ newNode.next = self.head
+ self.head = newNode
+
+
+ Testen Sie Ihre Implementierung, indem Sie das Skript ausführen.
+ Erstellen Sie dazu eine Instanz der LinkedList,
+ fügen Sie Elemente hinzu und rufen Sie dann Ihre Methode searchValue auf.
+ Überprüfen Sie anschließend, ob die Liste die erwartete Struktur hat,
+ indem Sie printList() verwenden.
+
+ # Erstellen einer verketteten Liste aus einer Python-Liste
+ inputList = [1, 2, 8, 4]
+ ll = LinkedList()
+ ll.FromPythonlist(inputList)
+
+ print("Liste:")
+ ll.printList()
+
+ node = ll.searchValue(8)
+ if node is not None:
+ print(f"Gefundenes Element: {node.value}")
+ else:
+ print("Element nicht gefunden.")
+
+
+
+ In dieser Übung werden Sie die Datenstruktur Verkettete Liste (Linked List) erweitern.
+ Gegeben sind bereits die Klassen ListNode und LinkedList, sowie einige
+ Hilfsmethoden: FromPythonlist(inputList) zur Erzeugung einer verketteten Liste aus einer Python-Liste
+ und printList() zur Ausgabe der Liste.
+ Ihre Aufgabe ist es, die Methode insertAfterLast(newNode)
+ zu implementieren, die ein neues Listenelement newNode an das Ende der Liste einfügt.
+
+ Implementieren Sie die Methode insertAfterLast(self, newNode) in der Klasse LinkedList.
+ Die Methode erhält das neue Element newNode und soll dieses am Ende der Liste einfügen.
+ Wenn die Liste leer ist, wird das neue Element zum Kopf (Head) der Liste.
+
+ Erstellen Sie eine Datei mit dem Namen
+ linkedInsert.py und
+ Implementieren Sie die Methode insertAfterLast in Ihrer Datei. Kopieren Sie dazu den
+ folgenden Codeblock in die Datei linkedInsert.py,
+ und ergänzen Sie die Methode insertAfterLast:
+
+class ListNode:
+ def __init__(self, value: int):
+ self.value: int = value
+ self.next: ListNode | None = None
+
+
+class LinkedList:
+ def __init__(self):
+ self.head = None
+
+ def FromPythonlist(self, inputList: list[int]):
+ for val in inputList:
+ newNode = ListNode(value=val)
+ self.insertAfterHead(newNode)
+
+ def searchValue(self, value: int) -> ListNode | None:
+ # Siehe Problem 'linkedFind.py' für die Implementierung dieser Methode
+ return None
+
+ def insertAfterNode(self, prevNode: ListNode | None, newNode: ListNode):
+ # Siehe Problem 'linkedAfter.py' für die Implementierung dieser Methode
+ return
+
+ def insertAfterLast(self, newNode: ListNode):
+ # TODO: Implementieren Sie diese Methode
+ pass
+
+ def printList(self):
+ current = self.head
+ while current is not None:
+ print(current.value, end=" -> ")
+ current = current.next
+ print("None")
+
+ def insertAfterHead(self, newNode: ListNode):
+ newNode.next = self.head
+ self.head = newNode
+
+Melden Sie sich bei cs50.dev an, klicken Sie
+ auf Ihr Terminal und führen Sie cd ohne Parameter aus. Sie
+ sollten feststellen, dass der Prompt Ihres Terminals wie unten aussieht:
$Als nächstes führen Sie
+mkdir
+ linkedInsertaus, um einen Ordner namens linkedInsert in Ihrem Codespace
+ zu erstellen.
Führen Sie anschließend
+cd
+ linkedInsertaus, um in dieses Verzeichnis zu wechseln. Der Prompt Ihres Terminals sollte
+ nun linkedInsert/$ anzeigen.
+ Jetzt können Sie
code
+ linkedInsert.pyausführen, um eine Datei namens linkedInsert.py zu erstellen, in der Sie Ihr
+ Programm schreiben.
+
So können Sie Ihr Programm manuell testen:
+ +
+ Testen Sie Ihre Implementierung, indem Sie das Skript ausführen.
+ Erstellen Sie dazu eine Instanz der LinkedList, fügen Sie Elemente hinzu und rufen Sie dann Ihre Methode insertAfterLast auf.
+ Überprüfen Sie anschließend, ob die Liste die erwartete Struktur hat, indem Sie printList() verwenden.
+
+ # Erstellen einer verketteten Liste aus einer Python-Liste
+ inputList = [4, 8, 2, 1]
+ ll = LinkedList()
+ ll.FromPythonlist(inputList)
+
+ print("Liste vorher:")
+ ll.printList()
+
+ newNode = ListNode(99)
+ # Einfügen von 99 am Ende
+ ll.insertAfterLast(newNode)
+
+ print("Liste nachher:")
+ ll.printList()
+ # Erwartete Ausgabe: 1 -> 2 -> 8 -> 4 -> 99 -> None
+
+Sie können das folgende Kommando ausführen, um Ihren Code mit check50 zu überprüfen, einem Programm, das bei
+ der Abgabe verwendet wird um Ihren Code zu testen. Testen Sie Ihr Programm
+ aber auch selbst!
+ check50 HSDDigitalLabor/problems/adg2025/linkedInsert
+
+ Grüne Smileys :)
+ bedeuten, dass Ihr Programm einen Test bestanden hat! Rote
+ traurige Smileys :(
+ zeigen an, dass Ihr Programm etwas Unerwartetes ausgegeben
+ hat. Besuchen Sie die URL, die check50
+ ausgibt, um zu sehen, welche Eingabe check50
+ an Ihr Programm übergeben hat, welche Ausgabe erwartet wurde und welche
+ Ausgabe Ihr Programm tatsächlich geliefert hat.
+
Führen Sie im Terminal den folgenden Befehl aus, um Ihre Arbeit einzureichen. +
+
+ submit50 HSDDigitalLabor/problems/adg2025/linkedInsert
+ + Führen Sie diesen Befehl vor dem Fälligkeitsdatum aus. Sie können Ihre Lösung + nach dem ersten Einsenden noch ändern und erneut einreichen. Bewertet wird + die zuletzt eingereichte Version vor dem Fälligkeitsdatum. Nach Ablauf der + Frist können Sie technisch zwar noch Abgaben tätigen, Ihre Lösung wird jedoch + nicht mehr gewertet. Das Ergebnis kann ausschließlich mit obigem Befehl abgegeben + werden, eine Abgabe in Moodle ist nicht möglich. +
+ +Nach dem Einreichen der Lösung mit submit50,
+ nehmen Sie eine Pseudolösung in Moodle vor, indem Sie auf den Button
+
+ weiter unten auf dieser Seite betätigen und in das sich öffnende Feld unter
+ "Texteingabe online" den folgenden Text ein:
+
Mit submit50 abgegeben.
+Schließen Sie die Eingabe durch Klick auf den Button + unterhalb des Textfeldes ab. +
++ Zur besseren Übersicht markieren Sie das Problem linkedInsert.py in Moodle als erledigt, + indem Sie ganz oben auf dieser Seite den Button +
++ + klicken. Daraufhin erscheint der Button + +
+ +generated 2025-12-22 10:30:01
\ No newline at end of file diff --git a/linkedInsert/html/params.json b/linkedInsert/html/params.json new file mode 100644 index 0000000..8feb51e --- /dev/null +++ b/linkedInsert/html/params.json @@ -0,0 +1,9 @@ +{ + "id": "linkedInsert", + "title": "Linked List: Insert After Last Node", + "foldername": "linkedInsert", + "filename": "linkedInsert.py", + "asciicast_id": "", + "check50_path": "HSDDigitalLabor/problems/adg2025/linkedInsert", + "submit50_path": "HSDDigitalLabor/problems/adg2025/linkedInsert" +} \ No newline at end of file diff --git a/linkedInsert/html/template.html b/linkedInsert/html/template.html new file mode 100644 index 0000000..9005e14 --- /dev/null +++ b/linkedInsert/html/template.html @@ -0,0 +1,112 @@ +{% include "header.html" %} + +
+ In dieser Übung werden Sie die Datenstruktur Verkettete Liste (Linked List) erweitern.
+ Gegeben sind bereits die Klassen ListNode und LinkedList, sowie einige
+ Hilfsmethoden: FromPythonlist(inputList) zur Erzeugung einer verketteten Liste aus einer Python-Liste
+ und printList() zur Ausgabe der Liste.
+ Ihre Aufgabe ist es, die Methode insertAfterLast(newNode)
+ zu implementieren, die ein neues Listenelement newNode an das Ende der Liste einfügt.
+
+ Implementieren Sie die Methode insertAfterLast(self, newNode) in der Klasse LinkedList.
+ Die Methode erhält das neue Element newNode und soll dieses am Ende der Liste einfügen.
+ Wenn die Liste leer ist, wird das neue Element zum Kopf (Head) der Liste.
+
+ {% include "file.html" %}
+ Implementieren Sie die Methode insertAfterLast in Ihrer Datei. Kopieren Sie dazu den
+ folgenden Codeblock in die Datei {{filename}},
+ und ergänzen Sie die Methode insertAfterLast:
+
+class ListNode:
+ def __init__(self, value: int):
+ self.value: int = value
+ self.next: ListNode | None = None
+
+
+class LinkedList:
+ def __init__(self):
+ self.head = None
+
+ def FromPythonlist(self, inputList: list[int]):
+ for val in inputList:
+ newNode = ListNode(value=val)
+ self.insertAfterHead(newNode)
+
+ def searchValue(self, value: int) -> ListNode | None:
+ # Siehe Problem 'linkedFind.py' für die Implementierung dieser Methode
+ return None
+
+ def insertAfterNode(self, prevNode: ListNode | None, newNode: ListNode):
+ # Siehe Problem 'linkedAfter.py' für die Implementierung dieser Methode
+ return
+
+ def insertAfterLast(self, newNode: ListNode):
+ # TODO: Implementieren Sie diese Methode
+ pass
+
+ def printList(self):
+ current = self.head
+ while current is not None:
+ print(current.value, end=" -> ")
+ current = current.next
+ print("None")
+
+ def insertAfterHead(self, newNode: ListNode):
+ newNode.next = self.head
+ self.head = newNode
+
+
+ Testen Sie Ihre Implementierung, indem Sie das Skript ausführen.
+ Erstellen Sie dazu eine Instanz der LinkedList, fügen Sie Elemente hinzu und rufen Sie dann Ihre Methode insertAfterLast auf.
+ Überprüfen Sie anschließend, ob die Liste die erwartete Struktur hat, indem Sie printList() verwenden.
+
+ # Erstellen einer verketteten Liste aus einer Python-Liste
+ inputList = [4, 8, 2, 1]
+ ll = LinkedList()
+ ll.FromPythonlist(inputList)
+
+ print("Liste vorher:")
+ ll.printList()
+
+ newNode = ListNode(99)
+ # Einfügen von 99 am Ende
+ ll.insertAfterLast(newNode)
+
+ print("Liste nachher:")
+ ll.printList()
+ # Erwartete Ausgabe: 1 -> 2 -> 8 -> 4 -> 99 -> None
+
+
+ In dieser Übung werden Sie die Datenstruktur Verkettete Liste (Linked List) erweitern.
+ Gegeben sind bereits die Klassen ListNode und LinkedList, sowie einige
+ Hilfsmethoden: FromPythonlist(inputList) zur Erzeugung einer verketteten Liste aus einer Python-Liste
+ und printList() zur Ausgabe der Liste.
+ Ihre Aufgabe ist es, die Funktion mergeTwoLists(list1, list2)
+ zu implementieren, die zwei sortierte verkettete Listen (Objekte vom Typ LinkedList) zu einer einzigen sortierten Liste zusammenfügt.
+
+
+ Implementieren Sie die Funktion mergeTwoLists(list1, list2) außerhalb der Klasse LinkedList.
+ Die Funktion erhält zwei sortierte LinkedList-Objekte, list1 und list2.
+ Sie soll die beiden Listen so verknüpfen, dass eine einzige, aufsteigend sortierte Liste entsteht.
+ Geben Sie ein neues LinkedList-Objekt zurück, das die gemergte Liste enthält.
+
+ Erstellen Sie eine Datei mit dem Namen
+ linkedMerge.py und
+ Implementieren Sie die Funktion mergeTwoLists in Ihrer Datei. Kopieren Sie dazu den
+ folgenden Codeblock in die Datei linkedMerge.py,
+ und ergänzen Sie die Funktion mergeTwoLists:
+
+class ListNode:
+ def __init__(self, value: int):
+ self.value: int = value
+ self.next: ListNode | None = None
+
+
+class LinkedList:
+ def __init__(self):
+ self.head = None
+
+ def FromPythonlist(self, inputList: list[int]):
+ for val in inputList:
+ newNode = ListNode(value=val)
+ self.insertAfterHead(newNode)
+
+ def printList(self):
+ current = self.head
+ while current is not None:
+ print(current.value, end=" -> ")
+ current = current.next
+ print("None")
+
+ def searchValue(self, value: int) -> ListNode | None:
+ # Siehe Problem 'linkedFind.py' für die Implementierung dieser Methode
+ return None
+
+ def insertAfterNode(self, prevNode: ListNode | None, newNode: ListNode):
+ # Siehe Problem 'linkedAfter.py' für die Implementierung dieser Methode
+ return
+
+ def insertAfterLast(self, newNode: ListNode):
+ # Siehe Problem 'linkedInsert.py' für die Implementierung dieser Methode
+ return
+
+ def insertAfterHead(self, newNode: ListNode):
+ newNode.next = self.head
+ self.head = newNode
+
+def mergeTwoLists(list1: LinkedList, list2: LinkedList) -> LinkedList:
+ mergedList = LinkedList()
+ # TODO: Implementieren Sie diese Funktion
+ return mergedList
+
+Melden Sie sich bei cs50.dev an, klicken Sie
+ auf Ihr Terminal und führen Sie cd ohne Parameter aus. Sie
+ sollten feststellen, dass der Prompt Ihres Terminals wie unten aussieht:
$Als nächstes führen Sie
+mkdir
+ linkedMergeaus, um einen Ordner namens linkedMerge in Ihrem Codespace
+ zu erstellen.
Führen Sie anschließend
+cd
+ linkedMergeaus, um in dieses Verzeichnis zu wechseln. Der Prompt Ihres Terminals sollte
+ nun linkedMerge/$ anzeigen.
+ Jetzt können Sie
code
+ linkedMerge.pyausführen, um eine Datei namens linkedMerge.py zu erstellen, in der Sie Ihr
+ Programm schreiben.
+
So können Sie Ihr Programm manuell testen:
+ +
+ Testen Sie Ihre Implementierung, indem Sie das Skript ausführen.
+ Erstellen Sie dazu eine Instanz der LinkedList, fügen Sie Elemente hinzu und rufen Sie dann Ihre Funktion mergeTwoLists auf.
+ Überprüfen Sie anschließend, ob die Liste die erwartete Struktur hat.
+
+ # Erstellen zweier sortierter Listen
+ # Hinweis: FromPythonlist fügt vorne ein, daher umgekehrte Reihenfolge für korrekte Sortierung
+
+ # Liste 1: 1 -> 2 -> 4
+ ll1 = LinkedList()
+ ll1.FromPythonlist([4, 2, 1])
+
+ # Liste 2: 1 -> 3 -> 4
+ ll2 = LinkedList()
+ ll2.FromPythonlist([4, 3, 1])
+
+ print("Liste 1:")
+ ll1.printList()
+ print("Liste 2:")
+ ll2.printList()
+
+ # Mergen der Listen
+ merged_list = mergeTwoLists(ll1, ll2)
+
+ print("Gemergte Liste:")
+ merged_list.printList()
+ # Erwartete Ausgabe: 1 -> 1 -> 2 -> 3 -> 4 -> 4 -> None
+
+Sie können das folgende Kommando ausführen, um Ihren Code mit check50 zu überprüfen, einem Programm, das bei
+ der Abgabe verwendet wird um Ihren Code zu testen. Testen Sie Ihr Programm
+ aber auch selbst!
+ check50 HSDDigitalLabor/problems/adg2025/linkedMerge
+
+ Grüne Smileys :)
+ bedeuten, dass Ihr Programm einen Test bestanden hat! Rote
+ traurige Smileys :(
+ zeigen an, dass Ihr Programm etwas Unerwartetes ausgegeben
+ hat. Besuchen Sie die URL, die check50
+ ausgibt, um zu sehen, welche Eingabe check50
+ an Ihr Programm übergeben hat, welche Ausgabe erwartet wurde und welche
+ Ausgabe Ihr Programm tatsächlich geliefert hat.
+
Führen Sie im Terminal den folgenden Befehl aus, um Ihre Arbeit einzureichen. +
+
+ submit50 HSDDigitalLabor/problems/adg2025/linkedMerge
+ + Führen Sie diesen Befehl vor dem Fälligkeitsdatum aus. Sie können Ihre Lösung + nach dem ersten Einsenden noch ändern und erneut einreichen. Bewertet wird + die zuletzt eingereichte Version vor dem Fälligkeitsdatum. Nach Ablauf der + Frist können Sie technisch zwar noch Abgaben tätigen, Ihre Lösung wird jedoch + nicht mehr gewertet. Das Ergebnis kann ausschließlich mit obigem Befehl abgegeben + werden, eine Abgabe in Moodle ist nicht möglich. +
+ +Nach dem Einreichen der Lösung mit submit50,
+ nehmen Sie eine Pseudolösung in Moodle vor, indem Sie auf den Button
+
+ weiter unten auf dieser Seite betätigen und in das sich öffnende Feld unter
+ "Texteingabe online" den folgenden Text ein:
+
Mit submit50 abgegeben.
+Schließen Sie die Eingabe durch Klick auf den Button + unterhalb des Textfeldes ab. +
++ Zur besseren Übersicht markieren Sie das Problem linkedMerge.py in Moodle als erledigt, + indem Sie ganz oben auf dieser Seite den Button +
++ + klicken. Daraufhin erscheint der Button + +
+ +generated 2025-12-22 11:31:27
\ No newline at end of file diff --git a/linkedMerge/html/linked_list_graphic.png b/linkedMerge/html/linked_list_graphic.png new file mode 100644 index 0000000..ac8e5e8 Binary files /dev/null and b/linkedMerge/html/linked_list_graphic.png differ diff --git a/linkedMerge/html/params.json b/linkedMerge/html/params.json new file mode 100644 index 0000000..6630cee --- /dev/null +++ b/linkedMerge/html/params.json @@ -0,0 +1,9 @@ +{ + "id": "linkedMerge", + "title": "Linked List: Füge zwei sortierte verkettete Listen zusammen", + "foldername": "linkedMerge", + "filename": "linkedMerge.py", + "asciicast_id": "", + "check50_path": "HSDDigitalLabor/problems/adg2025/linkedMerge", + "submit50_path": "HSDDigitalLabor/problems/adg2025/linkedMerge" +} \ No newline at end of file diff --git a/linkedMerge/html/template.html b/linkedMerge/html/template.html new file mode 100644 index 0000000..0659acb --- /dev/null +++ b/linkedMerge/html/template.html @@ -0,0 +1,129 @@ +{% include "header.html" %} + +
+ In dieser Übung werden Sie die Datenstruktur Verkettete Liste (Linked List) erweitern.
+ Gegeben sind bereits die Klassen ListNode und LinkedList, sowie einige
+ Hilfsmethoden: FromPythonlist(inputList) zur Erzeugung einer verketteten Liste aus einer Python-Liste
+ und printList() zur Ausgabe der Liste.
+ Ihre Aufgabe ist es, die Funktion mergeTwoLists(list1, list2)
+ zu implementieren, die zwei sortierte verkettete Listen (Objekte vom Typ LinkedList) zu einer einzigen sortierten Liste zusammenfügt.
+
+
+ Implementieren Sie die Funktion mergeTwoLists(list1, list2) außerhalb der Klasse LinkedList.
+ Die Funktion erhält zwei sortierte LinkedList-Objekte, list1 und list2.
+ Sie soll die beiden Listen so verknüpfen, dass eine einzige, aufsteigend sortierte Liste entsteht.
+ Geben Sie ein neues LinkedList-Objekt zurück, das die gemergte Liste enthält.
+
+ {% include "file.html" %}
+ Implementieren Sie die Funktion mergeTwoLists in Ihrer Datei. Kopieren Sie dazu den
+ folgenden Codeblock in die Datei {{filename}},
+ und ergänzen Sie die Funktion mergeTwoLists:
+
+class ListNode:
+ def __init__(self, value: int):
+ self.value: int = value
+ self.next: ListNode | None = None
+
+
+class LinkedList:
+ def __init__(self):
+ self.head = None
+
+ def FromPythonlist(self, inputList: list[int]):
+ for val in inputList:
+ newNode = ListNode(value=val)
+ self.insertAfterHead(newNode)
+
+ def printList(self):
+ current = self.head
+ while current is not None:
+ print(current.value, end=" -> ")
+ current = current.next
+ print("None")
+
+ def searchValue(self, value: int) -> ListNode | None:
+ # Siehe Problem 'linkedFind.py' für die Implementierung dieser Methode
+ return None
+
+ def insertAfterNode(self, prevNode: ListNode | None, newNode: ListNode):
+ # Siehe Problem 'linkedAfter.py' für die Implementierung dieser Methode
+ return
+
+ def insertAfterLast(self, newNode: ListNode):
+ # Siehe Problem 'linkedInsert.py' für die Implementierung dieser Methode
+ return
+
+ def insertAfterHead(self, newNode: ListNode):
+ newNode.next = self.head
+ self.head = newNode
+
+def mergeTwoLists(list1: LinkedList, list2: LinkedList) -> LinkedList:
+ mergedList = LinkedList()
+ # TODO: Implementieren Sie diese Funktion
+ return mergedList
+
+
+ Testen Sie Ihre Implementierung, indem Sie das Skript ausführen.
+ Erstellen Sie dazu eine Instanz der LinkedList, fügen Sie Elemente hinzu und rufen Sie dann Ihre Funktion mergeTwoLists auf.
+ Überprüfen Sie anschließend, ob die Liste die erwartete Struktur hat.
+
+ # Erstellen zweier sortierter Listen
+ # Hinweis: FromPythonlist fügt vorne ein, daher umgekehrte Reihenfolge für korrekte Sortierung
+
+ # Liste 1: 1 -> 2 -> 4
+ ll1 = LinkedList()
+ ll1.FromPythonlist([4, 2, 1])
+
+ # Liste 2: 1 -> 3 -> 4
+ ll2 = LinkedList()
+ ll2.FromPythonlist([4, 3, 1])
+
+ print("Liste 1:")
+ ll1.printList()
+ print("Liste 2:")
+ ll2.printList()
+
+ # Mergen der Listen
+ merged_list = mergeTwoLists(ll1, ll2)
+
+ print("Gemergte Liste:")
+ merged_list.printList()
+ # Erwartete Ausgabe: 1 -> 1 -> 2 -> 3 -> 4 -> 4 -> None
+
+
+ In dieser Übung werden Sie die Datenstruktur Verkettete Liste (Linked List) erweitern.
+ Gegeben sind bereits die Klassen ListNode und LinkedList, sowie einige
+ Hilfsmethoden: FromPythonlist(inputList) zur Erzeugung einer verketteten Liste aus einer Python-Liste
+ und printList() zur Ausgabe der Liste.
+ Ihre Aufgabe ist es, die Methode removeElement(node)
+ zu implementieren, die das übergebene Listenelement node aus der Liste entfernt.
+
+ Implementieren Sie die Methode removeElement(self, node) in der Klasse LinkedList.
+ Die Methode erhält das Element node, das entfernt werden soll. Sie soll dieses Element aus der Liste entfernen.
+ Achten Sie darauf, den Vorgänger des Elements korrekt mit dem Nachfolger zu verbinden.
+ Wenn das Element der Kopf (Head) der Liste ist, muss der Kopf aktualisiert werden.
+
+ Erstellen Sie eine Datei mit dem Namen
+ linkedRemove.py und
+ Implementieren Sie die Methode removeElement in Ihrer Datei. Kopieren Sie dazu den
+ folgenden Codeblock in die Datei linkedRemove.py,
+ und ergänzen Sie die Methode removeElement:
+
+class ListNode:
+ def __init__(self, value: int):
+ self.value: int = value
+ self.next: ListNode | None = None
+
+
+class LinkedList:
+ def __init__(self):
+ self.head = None
+
+ def FromPythonlist(self, inputList: list[int]):
+ for val in inputList:
+ newNode = ListNode(value=val)
+ self.insertAfterHead(newNode)
+
+ def searchValue(self, value: int) -> ListNode | None:
+ # Siehe Problem 'linkedFind.py' für die Implementierung dieser Methode
+ return None
+
+ def insertAfterNode(self, prevNode: ListNode | None, newNode: ListNode):
+ # Siehe Problem 'linkedAfter.py' für die Implementierung dieser Methode
+ return
+
+ def insertAfterLast(self, newNode: ListNode):
+ # Siehe Problem 'linkedInsert.py' für die Implementierung dieser Methode
+ pass
+
+ def removeElement(self, node: ListNode):
+ # TODO: Implementieren Sie diese Methode
+ pass
+
+ def printList(self):
+ current = self.head
+ while current is not None:
+ print(current.value, end=" -> ")
+ current = current.next
+ print("None")
+
+ def insertAfterHead(self, newNode: ListNode):
+ newNode.next = self.head
+ self.head = newNode
+
+Melden Sie sich bei cs50.dev an, klicken Sie
+ auf Ihr Terminal und führen Sie cd ohne Parameter aus. Sie
+ sollten feststellen, dass der Prompt Ihres Terminals wie unten aussieht:
$Als nächstes führen Sie
+mkdir
+ linkedRemoveaus, um einen Ordner namens linkedRemove in Ihrem Codespace
+ zu erstellen.
Führen Sie anschließend
+cd
+ linkedRemoveaus, um in dieses Verzeichnis zu wechseln. Der Prompt Ihres Terminals sollte
+ nun linkedRemove/$ anzeigen.
+ Jetzt können Sie
code
+ linkedRemove.pyausführen, um eine Datei namens linkedRemove.py zu erstellen, in der Sie Ihr
+ Programm schreiben.
+
So können Sie Ihr Programm manuell testen:
+ +
+ Testen Sie Ihre Implementierung, indem Sie das Skript ausführen.
+ Erstellen Sie dazu eine Instanz der LinkedList, fügen Sie Elemente hinzu und rufen Sie dann Ihre Methode removeElement auf.
+ Überprüfen Sie anschließend, ob die Liste die erwartete Struktur hat, indem Sie printList() verwenden.
+
+ # Erstellen einer verketteten Liste aus einer Python-Liste
+ inputList = [4, 8, 2, 1]
+ ll = LinkedList()
+ ll.FromPythonlist(inputList)
+
+ print("Liste vorher:")
+ ll.printList()
+
+ # Suchen und Entfernen von 8
+ node = ll.searchValue(8)
+ if node:
+ ll.removeElement(node)
+
+ print("Liste nachher:")
+ ll.printList()
+ # Erwartete Ausgabe: 1 -> 2 -> 4 -> None
+
+Sie können das folgende Kommando ausführen, um Ihren Code mit check50 zu überprüfen, einem Programm, das bei
+ der Abgabe verwendet wird um Ihren Code zu testen. Testen Sie Ihr Programm
+ aber auch selbst!
+ check50 HSDDigitalLabor/problems/adg2025/linkedRemove
+
+ Grüne Smileys :)
+ bedeuten, dass Ihr Programm einen Test bestanden hat! Rote
+ traurige Smileys :(
+ zeigen an, dass Ihr Programm etwas Unerwartetes ausgegeben
+ hat. Besuchen Sie die URL, die check50
+ ausgibt, um zu sehen, welche Eingabe check50
+ an Ihr Programm übergeben hat, welche Ausgabe erwartet wurde und welche
+ Ausgabe Ihr Programm tatsächlich geliefert hat.
+
Führen Sie im Terminal den folgenden Befehl aus, um Ihre Arbeit einzureichen. +
+
+ submit50 HSDDigitalLabor/problems/adg2025/linkedRemove
+ + Führen Sie diesen Befehl vor dem Fälligkeitsdatum aus. Sie können Ihre Lösung + nach dem ersten Einsenden noch ändern und erneut einreichen. Bewertet wird + die zuletzt eingereichte Version vor dem Fälligkeitsdatum. Nach Ablauf der + Frist können Sie technisch zwar noch Abgaben tätigen, Ihre Lösung wird jedoch + nicht mehr gewertet. Das Ergebnis kann ausschließlich mit obigem Befehl abgegeben + werden, eine Abgabe in Moodle ist nicht möglich. +
+ +Nach dem Einreichen der Lösung mit submit50,
+ nehmen Sie eine Pseudolösung in Moodle vor, indem Sie auf den Button
+
+ weiter unten auf dieser Seite betätigen und in das sich öffnende Feld unter
+ "Texteingabe online" den folgenden Text ein:
+
Mit submit50 abgegeben.
+Schließen Sie die Eingabe durch Klick auf den Button + unterhalb des Textfeldes ab. +
++ Zur besseren Übersicht markieren Sie das Problem linkedRemove.py in Moodle als erledigt, + indem Sie ganz oben auf dieser Seite den Button +
++ + klicken. Daraufhin erscheint der Button + +
+ +generated 2025-12-22 10:45:25
\ No newline at end of file diff --git a/linkedRemove/html/params.json b/linkedRemove/html/params.json new file mode 100644 index 0000000..49a5feb --- /dev/null +++ b/linkedRemove/html/params.json @@ -0,0 +1,9 @@ +{ + "id": "linkedRemove", + "title": "Linked List: Entferne ein Element aus einer Liste", + "foldername": "linkedRemove", + "filename": "linkedRemove.py", + "asciicast_id": "", + "check50_path": "HSDDigitalLabor/problems/adg2025/linkedRemove", + "submit50_path": "HSDDigitalLabor/problems/adg2025/linkedRemove" +} \ No newline at end of file diff --git a/linkedRemove/html/template.html b/linkedRemove/html/template.html new file mode 100644 index 0000000..0c93d47 --- /dev/null +++ b/linkedRemove/html/template.html @@ -0,0 +1,118 @@ +{% include "header.html" %} + +
+ In dieser Übung werden Sie die Datenstruktur Verkettete Liste (Linked List) erweitern.
+ Gegeben sind bereits die Klassen ListNode und LinkedList, sowie einige
+ Hilfsmethoden: FromPythonlist(inputList) zur Erzeugung einer verketteten Liste aus einer Python-Liste
+ und printList() zur Ausgabe der Liste.
+ Ihre Aufgabe ist es, die Methode removeElement(node)
+ zu implementieren, die das übergebene Listenelement node aus der Liste entfernt.
+
+ Implementieren Sie die Methode removeElement(self, node) in der Klasse LinkedList.
+ Die Methode erhält das Element node, das entfernt werden soll. Sie soll dieses Element aus der Liste entfernen.
+ Achten Sie darauf, den Vorgänger des Elements korrekt mit dem Nachfolger zu verbinden.
+ Wenn das Element der Kopf (Head) der Liste ist, muss der Kopf aktualisiert werden.
+
+ {% include "file.html" %}
+ Implementieren Sie die Methode removeElement in Ihrer Datei. Kopieren Sie dazu den
+ folgenden Codeblock in die Datei {{filename}},
+ und ergänzen Sie die Methode removeElement:
+
+class ListNode:
+ def __init__(self, value: int):
+ self.value: int = value
+ self.next: ListNode | None = None
+
+
+class LinkedList:
+ def __init__(self):
+ self.head = None
+
+ def FromPythonlist(self, inputList: list[int]):
+ for val in inputList:
+ newNode = ListNode(value=val)
+ self.insertAfterHead(newNode)
+
+ def searchValue(self, value: int) -> ListNode | None:
+ # Siehe Problem 'linkedFind.py' für die Implementierung dieser Methode
+ return None
+
+ def insertAfterNode(self, prevNode: ListNode | None, newNode: ListNode):
+ # Siehe Problem 'linkedAfter.py' für die Implementierung dieser Methode
+ return
+
+ def insertAfterLast(self, newNode: ListNode):
+ # Siehe Problem 'linkedInsert.py' für die Implementierung dieser Methode
+ return
+
+ def removeElement(self, node: ListNode):
+ # TODO: Implementieren Sie diese Methode
+ pass
+
+ def printList(self):
+ current = self.head
+ while current is not None:
+ print(current.value, end=" -> ")
+ current = current.next
+ print("None")
+
+ def insertAfterHead(self, newNode: ListNode):
+ newNode.next = self.head
+ self.head = newNode
+
+
+ Testen Sie Ihre Implementierung, indem Sie das Skript ausführen.
+ Erstellen Sie dazu eine Instanz der LinkedList, fügen Sie Elemente hinzu und rufen Sie dann Ihre Methode removeElement auf.
+ Überprüfen Sie anschließend, ob die Liste die erwartete Struktur hat, indem Sie printList() verwenden.
+
+ # Erstellen einer verketteten Liste aus einer Python-Liste
+ inputList = [4, 8, 2, 1]
+ ll = LinkedList()
+ ll.FromPythonlist(inputList)
+
+ print("Liste vorher:")
+ ll.printList()
+
+ # Suchen und Entfernen von 8
+ node = ll.searchValue(8)
+ if node:
+ ll.removeElement(node)
+
+ print("Liste nachher:")
+ ll.printList()
+ # Erwartete Ausgabe: 1 -> 2 -> 4 -> None
+
+
+ In dieser Übung werden Sie die Datenstruktur Verkettete Liste (Linked List) verwenden, um einen Stack (Stapel) zu implementieren.
+ Gegeben sind bereits die Klassen ListNode und LinkedList.
+ Ihre Aufgabe ist es, die Klasse Stack zu implementieren, die intern eine LinkedList verwendet, um die Stack-Operationen durchzuführen.
+
+
+ Implementieren Sie die Klasse Stack mit den folgenden Methoden:
+
push(value): Legt einen Wert auf den Stack (fügt ihn am Anfang der Liste ein).pop(): Entfernt das oberste Element vom Stack und gibt dessen Wert zurück. Gibt None zurück, wenn der Stack leer ist.peek(): Gibt den Wert des obersten Elements zurück, ohne es zu entfernen. Gibt None zurück, wenn der Stack leer ist.LinkedList.
+
+
+
+
+ Erstellen Sie eine Datei mit dem Namen
+ linkedStack.py und
+ Implementieren Sie die Klasse Stack in Ihrer Datei. Kopieren Sie dazu den
+ folgenden Codeblock in die Datei linkedStack.py,
+ und ergänzen Sie die fehlenden Methoden:
+
+class ListNode:
+ def __init__(self, value: int):
+ self.value: int = value
+ self.next: ListNode | None = None
+
+
+class LinkedList:
+ def __init__(self):
+ self.head = None
+
+ def insertAfterHead(self, newNode: ListNode):
+ newNode.next = self.head
+ self.head = newNode
+
+ def removeAfterHead(self):
+ # TODO: Eine hilfreiche Methode zum Erstellen eines Stacks
+
+ def printList(self):
+ current = self.head
+ while current is not None:
+ print(current.value, end=" -> ")
+ current = current.next
+ print("None")
+
+
+class Stack:
+ def __init__(self):
+ self.ll = LinkedList()
+
+ def push(self, value: int):
+ # TODO: Implementieren Sie diese Methode
+ pass
+
+ def pop(self) -> int | None:
+ # TODO: Implementieren Sie diese Methode
+ pass
+
+ def peek(self) -> int | None:
+ # TODO: Implementieren Sie diese Methode
+ pass
+
+Melden Sie sich bei cs50.dev an, klicken Sie
+ auf Ihr Terminal und führen Sie cd ohne Parameter aus. Sie
+ sollten feststellen, dass der Prompt Ihres Terminals wie unten aussieht:
$Als nächstes führen Sie
+mkdir
+ linkedStackaus, um einen Ordner namens linkedStack in Ihrem Codespace
+ zu erstellen.
Führen Sie anschließend
+cd
+ linkedStackaus, um in dieses Verzeichnis zu wechseln. Der Prompt Ihres Terminals sollte
+ nun linkedStack/$ anzeigen.
+ Jetzt können Sie
code
+ linkedStack.pyausführen, um eine Datei namens linkedStack.py zu erstellen, in der Sie Ihr
+ Programm schreiben.
+
So können Sie Ihr Programm manuell testen:
+ +
+ Testen Sie Ihre Implementierung, indem Sie das Skript ausführen.
+ Erstellen Sie dazu eine Instanz der Klasse Stack, führen Sie einige Operationen durch und überprüfen Sie die Ausgaben.
+
+ stack = Stack()
+
+ print("Push 10, 20, 30")
+ stack.push(10)
+ stack.push(20)
+ stack.push(30)
+
+ print("Stack Inhalt (via LinkedList):")
+ stack.ll.printList()
+ # Erwartet: 30 -> 20 -> 10 -> None
+
+ print(f"Peek: {stack.peek()}")
+ # Erwartet: 30
+
+ print(f"Pop: {stack.pop()}")
+ # Erwartet: 30
+
+ print("Stack Inhalt nach Pop:")
+ stack.ll.printList()
+ # Erwartet: 20 -> 10 -> None
+
+ print(f"Pop: {stack.pop()}")
+ print(f"Pop: {stack.pop()}")
+ print(f"Pop (leer): {stack.pop()}")
+ # Erwartet: 20, 10, None
+
+Sie können das folgende Kommando ausführen, um Ihren Code mit check50 zu überprüfen, einem Programm, das bei
+ der Abgabe verwendet wird um Ihren Code zu testen. Testen Sie Ihr Programm
+ aber auch selbst!
+ check50 HSDDigitalLabor/problems/adg2025/linkedStack
+
+ Grüne Smileys :)
+ bedeuten, dass Ihr Programm einen Test bestanden hat! Rote
+ traurige Smileys :(
+ zeigen an, dass Ihr Programm etwas Unerwartetes ausgegeben
+ hat. Besuchen Sie die URL, die check50
+ ausgibt, um zu sehen, welche Eingabe check50
+ an Ihr Programm übergeben hat, welche Ausgabe erwartet wurde und welche
+ Ausgabe Ihr Programm tatsächlich geliefert hat.
+
Führen Sie im Terminal den folgenden Befehl aus, um Ihre Arbeit einzureichen. +
+
+ submit50 HSDDigitalLabor/problems/adg2025/linkedStack
+ + Führen Sie diesen Befehl vor dem Fälligkeitsdatum aus. Sie können Ihre Lösung + nach dem ersten Einsenden noch ändern und erneut einreichen. Bewertet wird + die zuletzt eingereichte Version vor dem Fälligkeitsdatum. Nach Ablauf der + Frist können Sie technisch zwar noch Abgaben tätigen, Ihre Lösung wird jedoch + nicht mehr gewertet. Das Ergebnis kann ausschließlich mit obigem Befehl abgegeben + werden, eine Abgabe in Moodle ist nicht möglich. +
+ +Nach dem Einreichen der Lösung mit submit50,
+ nehmen Sie eine Pseudolösung in Moodle vor, indem Sie auf den Button
+
+ weiter unten auf dieser Seite betätigen und in das sich öffnende Feld unter
+ "Texteingabe online" den folgenden Text ein:
+
Mit submit50 abgegeben.
+Schließen Sie die Eingabe durch Klick auf den Button + unterhalb des Textfeldes ab. +
++ Zur besseren Übersicht markieren Sie das Problem linkedStack.py in Moodle als erledigt, + indem Sie ganz oben auf dieser Seite den Button +
++ + klicken. Daraufhin erscheint der Button + +
+ +generated 2025-12-22 12:14:08
\ No newline at end of file diff --git a/linkedStack/html/params.json b/linkedStack/html/params.json new file mode 100644 index 0000000..d899a42 --- /dev/null +++ b/linkedStack/html/params.json @@ -0,0 +1,9 @@ +{ + "id": "linkedStack", + "title": "Stack mit verketteter Liste implementieren", + "foldername": "linkedStack", + "filename": "linkedStack.py", + "asciicast_id": "", + "check50_path": "HSDDigitalLabor/problems/adg2025/linkedStack", + "submit50_path": "HSDDigitalLabor/problems/adg2025/linkedStack" +} \ No newline at end of file diff --git a/linkedStack/html/stack_graphic.png b/linkedStack/html/stack_graphic.png new file mode 100644 index 0000000..ae6bc2a Binary files /dev/null and b/linkedStack/html/stack_graphic.png differ diff --git a/linkedStack/html/template.html b/linkedStack/html/template.html new file mode 100644 index 0000000..d7094cd --- /dev/null +++ b/linkedStack/html/template.html @@ -0,0 +1,129 @@ +{% include "header.html" %} + +
+ In dieser Übung werden Sie die Datenstruktur Verkettete Liste (Linked List) verwenden, um einen Stack (Stapel) zu implementieren.
+ Gegeben sind bereits die Klassen ListNode und LinkedList.
+ Ihre Aufgabe ist es, die Klasse Stack zu implementieren, die intern eine LinkedList verwendet, um die Stack-Operationen durchzuführen.
+
+
+ Implementieren Sie die Klasse Stack mit den folgenden Methoden:
+
push(value): Legt einen Wert auf den Stack (fügt ihn am Anfang der Liste ein).pop(): Entfernt das oberste Element vom Stack und gibt dessen Wert zurück. Gibt None zurück, wenn der Stack leer ist.peek(): Gibt den Wert des obersten Elements zurück, ohne es zu entfernen. Gibt None zurück, wenn der Stack leer ist.LinkedList.
+
+
+
+
+ {% include "file.html" %}
+ Implementieren Sie die Klasse Stack in Ihrer Datei. Kopieren Sie dazu den
+ folgenden Codeblock in die Datei {{filename}},
+ und ergänzen Sie die fehlenden Methoden:
+
+class ListNode:
+ def __init__(self, value: int):
+ self.value: int = value
+ self.next: ListNode | None = None
+
+
+class LinkedList:
+ def __init__(self):
+ self.head = None
+
+ def insertAfterHead(self, newNode: ListNode):
+ newNode.next = self.head
+ self.head = newNode
+
+ def removeAfterHead(self):
+ # TODO: Eine hilfreiche Methode zum Erstellen eines Stacks
+
+ def printList(self):
+ current = self.head
+ while current is not None:
+ print(current.value, end=" -> ")
+ current = current.next
+ print("None")
+
+
+class Stack:
+ def __init__(self):
+ self.ll = LinkedList()
+
+ def push(self, value: int):
+ # TODO: Implementieren Sie diese Methode
+ pass
+
+ def pop(self) -> int | None:
+ # TODO: Implementieren Sie diese Methode
+ pass
+
+ def peek(self) -> int | None:
+ # TODO: Implementieren Sie diese Methode
+ pass
+
+
+ Testen Sie Ihre Implementierung, indem Sie das Skript ausführen.
+ Erstellen Sie dazu eine Instanz der Klasse Stack, führen Sie einige Operationen durch und überprüfen Sie die Ausgaben.
+
+ stack = Stack()
+
+ print("Push 10, 20, 30")
+ stack.push(10)
+ stack.push(20)
+ stack.push(30)
+
+ print("Stack Inhalt (via LinkedList):")
+ stack.ll.printList()
+ # Erwartet: 30 -> 20 -> 10 -> None
+
+ print(f"Peek: {stack.peek()}")
+ # Erwartet: 30
+
+ print(f"Pop: {stack.pop()}")
+ # Erwartet: 30
+
+ print("Stack Inhalt nach Pop:")
+ stack.ll.printList()
+ # Erwartet: 20 -> 10 -> None
+
+ print(f"Pop: {stack.pop()}")
+ print(f"Pop: {stack.pop()}")
+ print(f"Pop (leer): {stack.pop()}")
+ # Erwartet: 20, 10, None
+
+