Hallo,
ich habe folgendes Problem. Ich studiere Elektrotechnik und habe große Probleme mit Java. Die Java Klausur schreibe ich zum 2ten Mal. Ich kann die Algorithmen sehr gut verstehen , nur wenn ich Java Codes schreiben möchte komme ich sehr häufig durcheinander wegen while-,if... schleifen. Ein Tipp wäre sehr nett.
Folgende Aufgabe kam in der letzten Klausur:
gegeben ist eine einfach verketete Liste . Ich muss eine Methode remove(int index) schreiben ,die die Daten an der Stelle "index" zurückgibt und löscht. Ich habe mir Folgendes überlegt:
ich definiere eine Zahl int k. und definiere ein Verweis curr (steht für current) curr fängt ab head an. wenn curr.next , dann k++ . Falls k = index muss müssen die Daten an der Stelle index zurückgeliefert und dann gelöscht. Nun die Frage ist: wie schreibe ich das richtig in Java?:rtfm:
Ich hoffe auf eine schnelle Antwort.
Liebe Grüße
poste doch mal code wie du ihn schreiben würdest .. das musst du ja schliesslich in der klausur auch können .. den korrigieren wir gerne, falls nötig .. und eventuell tauchen bei dir ja noch gleich andere fragen auf
classListe{Knoten anfang;publicvoidremove(int index){if(index ==0){//Speziallfall Listenanfangif(anfang !=null){
anfang = anfang.nachfolger;}}else{Knoten curr = anfang;//Am Anfangsknoten beginnenfor(int i =0; i < index-1&& curr !=null; i++){
curr = curr.nachfolger;//bis zum *Vorgänger* des zu löschenden Knotens gehen }if(curr !=null&& curr.nachfolger !=null){//dessen Referenz so manipulieren, dass er auf den übernächsten Knoten zeigt
curr.nachfolger = curr.nachfolger.nachfolger;}}}staticclassKnoten(){String wert;Knoten nachfolger;}}
Der Code ignoriert allerdings alle Fälle, in denen die Liste zukurz ist, je nach Aufgabenstellung musst du da eventuell stattdessen eine Exception werfen.
Danke für die schnelle Antwort.
Code:
class List <Daten>{
private ListEl head;
private ListEl curr;
private ListEl prev;
private class List{
private Daten arg;
private Daten value;
private ListEl next;
ListEl(Daten arg, Daten value,ListEl next){
this.arg=arg;
this.value=value;
this.next=next;
}
}// bisher wurde alles kopiert , da das gegeben wird. Ab hier schreibe ich selber.
die Java Tags (oder wenigstens Code Tags) tragen (gepart mit Einrückungen und so) schon sehr zur lesbarkeit eines Codes bei. Also das nächste mal berücksichtigen...
Deinem Code fehlen schon einige Klammern, desweiteren benutzt du falsche Klassenbezeichner (System, nicht system)
Außerdem ist der "gegebene" Code ebenfalls nicht kompilierbar, da eine innere Klasse nicht den gleichen Namen haben kann, wie die umschließende Klasse.
Selbst wenn der Name in Ordnung wäre, würden dir die Berechtigungen fehlen um auf die Variablen zuzugreifen. (aufgrund der Tatsache dass dort alles private deklariert ist)
Dumme Frage: Warum arg und value? Warum 4 (in Worten: vier) Referenzen auf List in einer einfach (?) verketteten Liste? Und was ist MappingEl? Kann es sein, dass dein Prof auch ein bisschen verwirrt ist?
Warum benutzt du Abkürzungen bei den Variablennamen? Nenn curr doch ruhig gleich `current` und k `zahl` oder `number`. Die paar Zeichen mehr bringen einen nicht um und der Code ist viel einfacher zu lesen
Warum benutzt du Abkürzungen bei den Variablennamen? Nenn curr doch ruhig gleich `current` und k `zahl` oder `number`. Die paar Zeichen mehr bringen einen nicht um und der Code ist viel einfacher zu lesen
naja...aber kompilierbaren code sollte er euch trotzdem als Grundlage geben, oder habt ihr die Aufgabe, die Fehler noch rauszubauen, oder liegt hier einfach nur ein übertragungsfehler vor?
wie gesagt ich habe den Anfang kopiert und die Klasse umbenennt. muss noch MappungE1 ändern. value wird in einer anderen Methode benutzt.
das Löschen haben wir immer mit 2 Verweisen gemacht current und previous. Übrigens: ich studiere an der TU Berlin .
Das code werde ich editieren. Bitte sagt mal , ob es falsch ist .
LG
Alex
Das hat weniger mit "verwirrend" zu tun, sondern damit, dass es falsch ist. Eine einfach verkettete Liste ist nun mal einfach verkettet. Wenn du auf den Vorgänger und Nachfolger zeigst, dann ist es eine doppelt verkettete Liste
naja...aber kompilierbaren code sollte er euch trotzdem als Grundlage geben, oder habt ihr die Aufgabe, die Fehler noch rauszubauen, oder liegt hier einfach nur ein übertragungsfehler vor?
Das hat weniger mit "verwirrend" zu tun, sondern damit, dass es falsch ist. Eine einfach verkettete Liste ist nun mal einfach verkettet. Wenn du auf den Vorgänger und Nachfolger zeigst, dann ist es eine doppelt verkettete Liste
Die vorgabe deines Profs ist einfach nicht kompilierbar und somit auch nicht ausführbar, darauf kannst du nicht aufbauen.
Also entweder ihr sollt die Vorgabe verbessern, heist die Fehler rausmachen (Sonecc hat sie ja aufgezählt) oder du hast es falsch abgeschrieben oder dein Prof ist ein idiot
Naja, dein Code ist nicht vollständig, deswegen weiß ich nicht was du gemacht hast
Aber in einer einfach verketteten Liste kannst du dich nur in eine Richtung bewegen. Bei einer doppelt verketteten eben in beide. Deswegen brauchst du bei der 1. nur den Vorgänger oder Nachfolger. Bei der doppelten beide.
Der Code hat doch nur remove-Methode, da fehlen noch ein paar Sachen bis zur Liste. Z.B. um irgendwas zu löschen musst du ja vorher die Möglichkeit haben irgendwas hinzuzufügen...
ja ich weiß. Ich wollte wissen wie man die Stelle des zu löschenden Elements findet. Löschen und einfügen kann ich selber machen. Ich bedanke mich für eure Hilfe. Ich würde gerne diesen Thread offen lassen ; falls ich noch weitere Fragen habe dann kann ich die hier posten.
Vielen Dank.
Alex
Sorry, aber wenn du sagst dass du den Code kopierst, dann tu es auch....
In der von der verlinkten Musterlösung ist der Code nämlich compilierbar und auch (auf den ersten blick) deutlich sinnvoller als das was du hier als gegeben dargestellt hattest...
Ich bin sehr froh , dass ich mich für dieses Forum entschieden habe. Offensichtlisch sind viele Mitglieder aktiv hier.
@Sonecc: sorry mein Fehler . Ich wollte den Namen der Klasse ändern . Nächstes mal kopiere ich den Code einfach wie der ist.
Neue Frage:
Was ist ein Iterator?Wozu wird ein Interface gebraucht?
LG
Alex