Einfach verkette Liste

sngirl2010

Mitglied
Hallo lieber Community. Ich brauche bitte bitte eure Hilfe. Ich schreibe morgen meine erste Klausur und mache zur Vorbereitung gerade die Übungsklausur. Bis zur Aufgabe 5 bin ich gut durchgekommen. Aber jetzt scheiterst. Hier mal die Aufgabe:
public static SSLInt selectOdd(SSLInt list)
Die Klassenmethode soll eine neue Liste erzeugen, die der ubergebenen Liste list entspricht. Allerdings
sollen in der neuen Liste nur noch die ungeraden Zahlen aus der list enthalten sein. Die
ubergebene Liste list darf nicht verandert werden. Die Methode soll die neue Liste zuruckliefern.
Achten Sie darauf, dass sie keine unotigen Listenelemente anlegen.
Diese Klasse ist gegeben:
Code:
public class SSLChar {
public char element;
public SSLChar next;
public SSLChar (int element, SSLChar next) {
this.element = element;
this.next = next;
}
}
Hier ist meine bisherige Lösung:
Code:
public class Aufgabe5 {

    public static void main(String[] args) {
        SSLInt r = new SSLInt(8);
        SSLInt p = new SSLInt(4, r);
        SSLInt o = new SSLInt(7, p);
        SSLInt q = new SSLInt(5, o);
        selectOdd(q);

    }

    public static SSLInt selectOdd(SSLInt list) {
        SSLInt neu = list;
        SSLInt temp = null;
        while (neu != null) {
            if (neu.element % 2 == 0) {
                temp = neu;
            }         
            neu = neu.next;
            }
        return neu;
    }

}
Aus der übergebenen Liste liefert mein Code nur die 8 zurück. Aber soll ja 4 und 8 zurückgeben. Ich finde auf Teufel komm raus keinen Fehler und keine Lösung. Ich bitte bitte gnädigst um eure Hilfe.
 
Im Moment referenzieren die Listen neu und list dieselbe Liste. Da du die Liste neu zurückgeben willst, müsstest du also die überflüssigen Elemente daraus entfernen, wodurch du sie aber gleichzeitig unerwünschterweise auch aus list entfernen würdest.
Wenn du eine gerade Zahl findest, setzt du temp auf die aktuelle "Rest-Liste", so dass tempnun eine Liste referenziert, die alle Elemente, ab dieser geraden Zahl umfasst. Da du mit temp gar nichts machst, bleibt dieser Fehler aber ohne Konsequenz.
Deine Methode liefert eine Liste zurück, die lediglich das letzte Element der Ursprungsliste enthält (egal, ob gerade oder ungerade).

Du könntest einfach mit einer leeren Liste beginnen und bei jedem Treffer daraus eine neue Liste erzeugen, die den Treffer als zusätzliches Element enthält.
 
Danke vielmals für die Antwort. Aber ich komme nicht auf die Syntax. Ich habe jetzt den Code so geändert:
Code:
public static SSLInt selectOdd(SSLInt list) {
        SSLInt neu = list;
        SSLInt temp = null;
        while (neu != null) {
            if (neu.element % 2 == 0) {
                int tmp = neu.element;
                temp = new SSLInt(neu.element);
            }
            neu = neu.next;
        }
        return temp;
    }
}
Aber es macht immer noch das selbe.
 
Wieso setzt duneuauflist? Das soll doch eine ganz neue Liste werden.neu = null;macht da mehr Sinn. Und in deiner while Schleife gehst du dann durchlistdurch anstatt durchneu.
 
So oder wie?
Code:
public static SSLInt selectOdd(SSLInt list) {
        SSLInt neu = null;             
        SSLInt temp = null;
        while (neu != null) {
            if (list.element % 2 == 0) {
                int tmp = list.element;
                temp = new SSLInt(list.element);
            }
            list = list.next;
        }
        return temp;
    }
 

Es sollte while (list != null) { sein.
Und nach der Zeile temp = new SSLInt(list.element); musst du das neu erzeugte SSLInt Objekt noch ans Ende der neuen Liste anfügen.
Alternativ könntest du die Liste auch erst einmal umdrehen. Dann vereinfacht sich der Rest des Codes.
 
Ok, es tut mir leid, dass ich blöd bin. Aber ich verstehe es nicht. Weiter als dieser Code kann ich nicht:
Code:
public static SSLInt selectOdd(SSLInt list) {
        SSLInt neu = null;             
        SSLInt temp = null;
        while (list != null) {
            if (list.element % 2 == 0) {
                int tmp = list.element;
                temp = new SSLInt(list.element);
                neu = new SSLInt(temp.element);
               
            }
            list = list.next;
        }
        return neu;
    }
 
Wahrschein sind wir Frauen zu blöd um das hier zu lernen. Es wäre bitte einfach nur sehr nett, wenn jemand hier meinen Fehler korrigieren würde damit ich auch sehe wie das geht.
 
Die Klasse SSLInt hat offenbar zwei Konstruktoren:
Java:
public SSLInt(int element, SSLInt next);
public SSLInt(int element);
Du hast oben zwar nur den ersten Konstruktor gepostet, deshalb kann man über die Funktionsweise des zweiten nur spekulieren, aber es ist ziemlich offensichtlich, dass der eine Liste erzeugt, die nur aus dem übergebenen Element besteht. Wenn du eine Liste mit mehr Elementen haben möchtest, musst du den ersten Konstruktor verwenden. In deiner main-Methode hast du das ja bereits gemacht.
 
Also ich danke euch für die Antworten. Und ich verstehe auch, dass ich einen falschen Konstruktor verwende. Ich komme nicht auf die Syntax. Ich programmiere das erste Mal. Programmieren haben wir nur die ersten beiden Semester. Danach kommt meine Vertiefungsrichtung der Elektrotechnik. Ich kämpfe hier nur mit diesem JAVA und ja ich bin zu blöd.
 
Meine BITTE: BITTE BITTE BITTE korrigiert meinen Code und postet die Korrektur. Ich versuche hier nicht zu schummeln oder die eierlegende Wollmichsau zu seien. Das ist die Aufgabe 5 aus der Probeklausur. Bis dahin habe ich niemanden hier oder sonst wo gefragt und alles selber gelöst. Ich bitte nur um diese Scheiß Aufgabe 5. Ich sitze heute seit knapp 13Uhr und komme nicht auf diese SCHEIß Lösung. Das ist bereits die pure Verzweiflung.
 
Und die Aufgabe 6 ist das selbe nur iterativ. Ich schreibe morgen diese Kack Klausur und ich bekomme ich es nicht diese drecks Aufgaben zu lösen. MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN!
 
Jedem, der noch keine Erfahrung hat, fallen solche Aufgaben erst einmal schwer. Das gibt sich aber im Laufe der Zeit, solange du nicht aufgibst. Und wenn man Elektrotechnik studiert, sollte man schon zumindest ein wenig programmieren können.
Hier mal zwei mögliche Lösungen. Die erste ist iterativ
Java:
public static SSLInt selectOdd(SSLInt list) {
    SSLInt neu = null;
    SSLInt temp = null;
    while(list != null) {
        if(list.element % 2 == 1) {
            SSLInt next = new SSLInt(list.element, null);
            if(neu == null) {
                neu = next;
                temp = next;
            } else {
                temp.next = next;
                temp = temp.next;
            }
        }
        list = list.next;
    }
    return neu;
}

Und die zweite rekursiv. Die rekursive Lösung ist deutlich kürzer, hat aber den Nachteil, dass sie für lange Listen von mehr als ein paar tausend Elementen nicht funktioniert (führt zu einem Stackoverflow Error).
Java:
public static SSLInt selectOdd(SSLInt list) {
    if(list == null) return null;
    else if(list.element % 2 == 1) return new SSLInt(list.element, selectOdd(list.next));
    else return selectOdd(list.next);
}
 
letzte Frage: Wie kann ich den return-Wert der Methode anzeigen lassen?
Code:
System.out.println(selectOdd(q));
Bringt mir nur die folgende Ausgabe heraus:
klausur2012.SSLInt@15db9742
Ja, ich vermute ich muss die Ausgabe in einen String umwandeln. Wie macht man das? Ich finde keine passende Syntax(((
 
Du kannst die toString Methode von der Listenklasse überschreiben, oder statt ein println in einer Schleife über die Listenelemente gehen und sie so ausgeben
 
Du könntest eine Methode schreiben um die Liste in einen String umzuwandeln.
z.B.
Java:
public static String toString(SSLInt list) {
  String s = "[";
  while(list != null) {
    s = s + list.element;
    if(list.next != null) s = s + ", ";
    list = list.next;
  }
  return s + "]";
}
 
Was meint du damit? Eine Klasse hat keinen Rückgabetyp. Du kannst eine Liste ausgeben mit System.out.println(toString(list))
Oder aber du integrierst die toString Methode in die SSLInt Klasse.
Also so
Java:
public class SSLInt {
  ...
  public String toString() {
    SSLInt list = this;
    String s = "[";
    while(list != null) {
      s = s + list.element;
      if(list.next != null) s = s + ", ";
      list = list.next;
    }
    return s + "]";
  }
}
In dem Fall kannst du einfach schreiben System.out.println(list)
 
Wieso ist "element" denn einmal char und einmal int?
Strings sollte man eigentlich nicht in einer Schleife verknüpfen.
Du kannst auch von außerhalb auf element (und next) zugreifen - sind ja (ausdrücklich) als public vorgegeben.

Gut, dass zw. Hamburg und Ulm nach maps google nur 700-800km liegen. 😀
 

Neue Themen


Zurück
Oben