Methoden Single Linked List

Hyperbit

Mitglied
Hallo ich bin dabei
in eine Einfach Verkettete Liste etwas einzufügen.
Leider klappt es nicht so recht wenn der einzufügende Wert größer als der Listenwert ist.

Evtl habt ihr eine Idee (der Konstruktor ist vorgegeben)
Constructor SSLInt.java
Java:
public class SLLInt {     // SLLInt: SingleLinkedList

    public int element;   // aktuelles Element
    public SLLInt next;   // Referenz auf das naechste Element bzw. auf den Rest der Liste

    public SLLInt(int e, SLLInt n) {
        element = e;
        next = n;
    }

    public SLLInt(int e) {
        element = e;
        next = null;
    }
}

die Main
Java:
   public static void main(String[] args) {
        SLLInt l2 = new SLLInt(2, new SLLInt(5, new SLLInt(5, new SLLInt(13))));
        System.out.println(getString(insert(8, l2)));
}

  public static SLLInt insert(int value, SLLInt seq) {
        SLLInt a = new SLLInt(value);
        SLLInt b = new SLLInt(seq.element, seq.next);
        if (seq == null) {
            return a;
        }
        if (seq.element > value) {
            seq = a;
            seq.next = b;
            return seq;
        }

  

        return seq;

    }
 

Gucky

Top Contributor
Was meinst du damit, dass der einzufügende Wert größer ist, als der Listenwert?

Was funktioniert nicht?
Was sollte passieren?
Was passiert stattdessen?
Was hast du schon versucht?
Woran könnte es liegen?
 

Hyperbit

Mitglied
Es soll die 8 an der Richtigen stelle (die Liste ist aufsteigend SOrtiert) eingefügt werden.
leider gibt es nur die liste aus :(

Also soll zur Liste L2 die 8 Hinzugefügt werden.
 

Gucky

Top Contributor
Du musst mit einer Schleife über die Liste laufen und alle Elemente mit dem einzufügenden vergleichen. Ist das Nächste größer, als das, dass du einfügen willst, wird das einzufügende an der Stelle eingefügt. Ich sehe nirgends eine Schleife.

BTW: Statt
Code:
getString()
sollte das Element die Methode
Code:
toString()
überschreiben. Dann kannst du dir mit einem Sysout immer den Inhalt ausgeben lassen, die meisten (wenn nicht alle) Debugger rufen diese Methode auf, um den Inhalt anzuzeigen und es ist besserer Stil.
 

Hyperbit

Mitglied
get string ist selbst geschrieben :)
getstring
Java:
public static String getString(SLLInt seq) {
        if (seq == null) {
            return "";
        } else if (seq.next == null) {
            return "" + seq.element + "";
        } else {
            return "" + seq.element + ":" + getString(seq.next);
        }
    }

habe es halb lauffähig

ich rufe das wie folgt auf
Java:
SLLInt l2 = new SLLInt(2, new SLLInt(5, new SLLInt(5, new SLLInt(13))));
        System.out.println(getString(insert(8, l2)));
        System.out.println(getString(l2));

Programm
Java:
public static SLLInt insert(int value, SLLInt seq) {
        int zaehler = 1;
        SLLInt a = new SLLInt(value);
        SLLInt b = new SLLInt(seq.element, seq.next);
        if (seq == null) {
            return a;
        }
        if (seq.element > value) {
            seq.element = a.element;
            seq.next = b;
            return seq;
        }
        int vergleich = getLength(seq);
        while (vergleich != zaehler) {

            zaehler++;
            
            if (seq.next.element <= value) {
              
                seq = seq.next;
            }
            if (seq.next != null && seq.next.element > value) { // richtigen punkte gefunden und Injezieren
                b.next = seq.next;
                seq.next = a;
                seq.next.next = b.next;

            }
            if (seq.next == null) {
          
                seq.next = a;
            }

        }
       
        return new SLLInt(b.element,a);

    }

AUSGABE
Java:
2:8:13 //** (Ausgabe von insert(8,l2)  hierbei wird die Liste l2 bearbeitet*/
2:5:5:8:13 //**(Ausgabe von l2)*/
die Letzte zeile liefert das richtige ergebnis aber warum wird das nicht beim 1. Aufruf ausgegeben
 

Gucky

Top Contributor
Ich werde aus deinem Code nicht schlau. Kannst du mal bitte den gesamten Code posten?

toString wäre auch selbstgeschrieben. Wo ist dabei dein Problem?
 

Hyperbit

Mitglied
Java:
public class Aufgabe1 {

   
    public static void main(String[] args) {
    
        SLLInt l0 = null;
        SLLInt l1 = new SLLInt(7);
        SLLInt l2 = new SLLInt(2, new SLLInt(5, new SLLInt(5, new SLLInt(13))));

        
        System.out.println(getString(insert2(1, l2)));
        System.out.println(getString(l2));
    }

    public static String getString(SLLInt seq) {
        if (seq == null) {
            return "";
        } else if (seq.next == null) {
            return "" + seq.element + "";
        } else {
            return "" + seq.element + ":" + getString(seq.next);
        }
    }
  
 

    public static SLLInt insert(int value, SLLInt seq) {
        int zaehler = 1;
        SLLInt a = new SLLInt(value);
        SLLInt b = new SLLInt(seq.element, seq.next);
        if (seq == null) {
            return a;
        }
        if (seq.element > value) {
            seq.element = a.element;
            seq.next = b;
            return seq;
        }
        int vergleich = getLength(seq);
        while (vergleich != zaehler) {

            zaehler++;
            
            if (seq.next.element <= value) {
              
                seq = seq.next;
            }
            if (seq.next != null && seq.next.element > value) { // richtigen punkte gefunden und Injezieren
                b.next = seq.next;
                seq.next = a;
                seq.next.next = b.next;

            }
            if (seq.next == null) {
          
                seq.next = a;
            }

        }
       
        return new SLLInt(b.element,a);

    }
   
}
 

Gucky

Top Contributor
Hast du schon mal debuggt? Führ den Code mal zeilenweise aus und sieh dir die Belegung der Variablen an.

Außerdem ist der Geist von OOP, dass für solche Dinge, wie verkettete Listen eigene Klassen geschrieben werden, die die Liste verwalten und der Anwender dieser Liste muss sich um nichts kümmern. Das ist bei dir nicht gegeben.
 

Neue Themen


Oben