Implementierung Listen-ADT

Snaer

Aktives Mitglied
Code:
public void append(SortedList l) {
        if (!l.isNil())
            if (first == null) {
                first = l.first;
            } else {
                Node neu;
                for (neu = l.first; neu.next != null; neu = neu.next) {
                    for (Node alt = first; alt.next != null; alt = alt.next) {
                        if (neu.value < alt.value) {
                            neu.next = alt.next;
                            alt.next = neu;
                        }
                    }
                }
            }
    }
Ich versuche hierbei durch beide Listen zu laufen und damit die Werte zu vergleichen.
Meine Idee ist es dabei mit der ersten Schleife die neue Liste zu durchlaufen z.B 6,8,4 bzw 4,6,8, da sie ja durch die Cons Methode bereits sortiert sein sollte, und durch die alte 5,7,9.
Wenn dann der Wert der neuen Liste kleiner ist als der der alten soll der neue Wert an die Stelle eingefügt werden. Jedoch bekomme ich als ersten Wert immer wieder die 5 ausgegeben. Ich habe schon einiges versucht zu verändern finde den Fehler allerdings dennoch nicht.
 
K

kneitzel

Gast
Ich habe schon einiges versucht zu verändern finde den Fehler allerdings dennoch nicht.

Hast Du das denn mal durchgespielt auf einem Zettel?
Der neue Node mit der 4 zeigt dann auf den ersten Node der existierenden Liste. Aber first verweist doch noch auf das ehemals erste Element aber nicht auf das neue Erste Element!

Also überleg Dir, wie Du first umsetzen kannst, so dies notwendig sein sollte....
 

Snaer

Aktives Mitglied
Hast Du das denn mal durchgespielt auf einem Zettel?
Der neue Node mit der 4 zeigt dann auf den ersten Node der existierenden Liste. Aber first verweist doch noch auf das ehemals erste Element aber nicht auf das neue Erste Element!

Also überleg Dir, wie Du first umsetzen kannst, so dies notwendig sein sollte....
Ich habe es zumindest versucht nur scheine ich ein klares Verständnis Problem zu haben.
Meine Überlegung sah ungefähr so aus :
neu (4) alt (5)
Wenn neu < alt
In dem Fall gegeben, dann soll neu.next also 4.next auf alt.next zeigen also 5.next.
und alt.next auf neu.
Dabei habe ich versucht mich an den Zeilen von mihe zu orientieren
Code:
toInsert.next = current.next;
        current.next = toInsert;
Also noch zuvor in der Cons Methode
Jedoch habe ich diese glaube nicht verstanden. Auf einem Zettel kam ich dabei auf die Umsetzung :
toInsert = n (5)
current =first (9)
Wenn also die 9 kleiner ist als die 5
Soll current.next (quasi dann 5.next) auf current .next zeigen
Aber wieso soll dann current.next toInsert werden, würde das dann nicht quasi bedeuten das die 5 nach der 9 kommt ?
Also das ich da irgendwo einen Denkfehler habe ist mir bewusst, da der Code ja so funktioniert nur leider bin ich gerade echt verwirrt. :rolleyes:
 

Snaer

Aktives Mitglied
Hast Du das denn mal durchgespielt auf einem Zettel?
Der neue Node mit der 4 zeigt dann auf den ersten Node der existierenden Liste. Aber first verweist doch noch auf das ehemals erste Element aber nicht auf das neue Erste Element!

Also überleg Dir, wie Du first umsetzen kannst, so dies notwendig sein sollte....
Ich verstehe nicht wieso first noch auf das ehemals erste Element zeigt. Ich habe es mir auch aufgezeichnet bzw zumindest versucht.
Also neu ist ja = l.first. Also ist neu der erste Knoten der neuen Liste in dem Fall dann 4 richtig ?
Wenn dann alt = first ist ist ja alt der erste Knoten der alten Liste also 5.
Somit sollte die if Anweisung sofort gelten da 4 < 5 ist.
Dann verweist der Knoten mit der 4 auf den vorherigen ersten Knoten mit der 5. Und der ehemals alte Knoten soll ersetzt werden.
Ich verstehe nicht wo genau der Unterschied zwischen dem Versuch und diesen Zeilen genau ist.
Code:
Node current = first;
        while (current.next != null && current.next.value < n) {
            current = current.next;
        }
        toInsert.next = current.next;
        current.next = toInsert;
        
    }
Wenn ich die Zeilen durchspiele müsste es ja so aussehen.
Zuallererst wird die 9 in die leere Liste hineingefügt. Anschließend soll die ein Knoten mit der 5 eingefügt werden.
Daher verweist der Knoten mit der 5 auf current.next also dem Knoten mit der 9.
Und an die Stelle von current.next wird die 5 eingeschoben.
 

mihe7

Top Contributor
Naja, der Übungsleiter muss ja wohl nicht extra dazu sagen, dass nur genutzt werden kann, was auch definiert ist. Eine Methode cons() ohne Parameter gibt es nicht.
 

mihe7

Top Contributor
Ich verstehe nicht wo genau der Unterschied zwischen dem Versuch und diesen Zeilen genau ist.
Die alte Liste sei 5->6->null und die neue Liste 1->2->null

Die äußere Schleife iteriert mit neu über die neue Liste, also ist neu erstmal 1.

neu=1->2 (neu ist ein Knoten mit dem Wert 1 und der Knoten zeigt auf einen anderen Knoten mit dem Wert 2).

In der inneren Schleife iterierst Du mit alt über die alte Liste, also ist alt erstmal 5.

alt=5->6

Jetzt prüfst Du, ob neu.value < alt.value gilt, was offensichtlich der Fall ist, denn 1 < 5. Also führst Du aus:
neu.next = alt.next, d. h. neu=1->6 und
alt.next = neu, d. h. alt=5->1

Durch die Änderung der next-Zeiger ergibt sich also:
1. für die alte Liste 5->1->6-null
2. für die neue Liste 1->6->null

Mal abgesehen davon, dass die 2 nun ganz verloren ist, stimmt die Reihenfolge in der alten Liste auch nicht.
 

Snaer

Aktives Mitglied
Jetzt prüfst Du, ob neu.value < alt.value gilt, was offensichtlich der Fall ist, denn 1 < 5. Also führst Du aus:
neu.next = alt.next, d. h. neu=1->6 und
alt.next = neu, d. h. alt=5->1

Durch die Änderung der next-Zeiger ergibt sich also:
1. für die alte Liste 5->1->6-null
2. für die neue Liste 1->6->null

Mal abgesehen davon, dass die 2 nun ganz verloren ist, stimmt die Reihenfolge in der alten Liste auch nicht.
Gut danke das macht es mir ersichtlich, aber wieso verhält es sich dann nicht genauso bei dem Code ?
Code:
Node current = first;
        while (current.next != null && current.next.value < n) {
            current = current.next;
        }
        toInsert.next = current.next;
        current.next = toInsert;
Ist first selbst ein Element der Liste oder ist es nur der erste Zeiger auf den nächsten Knoten?
 

mihe7

Top Contributor
Das Problem ist einfach das er nicht mal erklärt hat wie man eine ADT List implementiert
Das können wir hier schlecht beurteilen, ich bin aber schon verwundert, dass hier gleich mehrere Leute sind, die ernsthafte Probleme haben.

Schau doch mal Deine cons-Methode an, die erwartet einen Parameter, nämlich den einzufügenden Wert.

Wenn Du also eine Methode schreibst:
Java:
public void append(SortedList l) {
    cons(5);
    cons(2);
    cons(9);
}
Dann fügt diese Methode die Werte 5, 2 und 9 zur aktuellen Liste hinzu.

Statt der fixen Werte willst Du cons nun für alle Elemente aus l aufrufen, also musst Du über l iterieren. Dafür gibt es verschiedene Möglichkeiten, in jedem Fall brauchst Du eine Schleife.
 

mihe7

Top Contributor
aber wieso verhält es sich dann nicht genauso bei dem Code ?
1. Ist das der Code für cons und nicht für append.
2. Wird hier bis zum richtigen Element iteriert und nicht einfach eingefügt, sobald neu < alt gilt.
3. Ist es denn wirklich so schwer, das selbst durchzuspielen?

Nimm die Grafik aus 107 und etwas, womit Du auf einen Knoten zeigen kannst, sagen wir mal einen Stift. Dann repräsentiert Dein Stift current. Und dann gehst Du den Code Zeile für Zeile durch. Wenn im Code steht: current=first, dann zeigst Du mit dem Stift auf den ersten Knoten (der auf den first zeigt). Wenn im Code steht: current = current.next, dann zeigst Du mit dem Stift auf den Knoten auf den - ausgehend vom aktuellen - next zeigt (kurz: auf den nächsten Knoten). Das ganze probierst Du aus für die Fälle 1, 4, 7 und 10. Dann sollte klar sein, wie der Code funktioniert.

Ist first selbst ein Element der Liste oder ist es nur der erste Zeiger auf den nächsten Knoten?
first ist nur der Zeiger auf den ersten Knoten der Liste.
 
K

kneitzel

Gast
Ja, aber das ist doch auch nicht das erste Mal, dass hier so eine Gruppe aufschlägt oder ist das jetzt lediglich die Gruppe, die vor paar Wochen hier schon aktiv war?

Aber wie dem auch sei: Ich bin hier teilweise mit meinem Latein am Ende. So im Forum können wir nicht alle Grundlagen so ausführlich bringen. Dafür gibt es Lehrbücher. Ein Dozent mag schlecht sein, aber dann muss doch wenigstens auf brauchbare Literatur verwiesen werden.....

Vor allem sehe ich das Problem, dass wir an einer Aufgabe rumhantieren und nicht wirklich sehen, wo die Verständnisprobleme sind. Ich denke, dass da irgend eine Kleinigkeit fehlt. Ich versuche so z.B. immer einen Bezug zu Objekten zu schaffen, die weniger abstrakt sind.... Dann klappt es mit der Vorstellung evtl. und ich habe da immer die Hoffnung, dass es dann "Klick" macht.

Ich glaube auch, dass man ein paar Dinge einfach im Detail vormachen müsste. Dieses durchspielen auf einem Zettel ist da ein Beispiel. Und da staune ich dann teilweise über die Ascii Zeichnungen die hier teilweise gebracht werden. Ich hab mir noch einmal TeX installiert weil ich dachte, dass ich da dann schnell paar einfache Skizzen machen kann. Einige Dinge gehen ganz schnell, aber auch das ist noch einiges an Aufwand.... Und der blöde Export hin zu html haut nicht wirklich hin, sonst hätte ich da Erläuterungen in mein Blog gepackt .... Aber da geht wahnsinnig Zeit drauf. Man will ja noch einmal drüber schauen und so ...

Also lange Rede einmal kurz gefasst: Ich sehe hier gerade keinen Ansatz, wie das zu lösen ist....
 

Snaer

Aktives Mitglied
Das können wir hier schlecht beurteilen, ich bin aber schon verwundert, dass hier gleich mehrere Leute sind, die ernsthafte Probleme haben.

Schau doch mal Deine cons-Methode an, die erwartet einen Parameter, nämlich den einzufügenden Wert.

Wenn Du also eine Methode schreibst:
Java:
public void append(SortedList l) {
    cons(5);
    cons(2);
    cons(9);
}
Dann fügt diese Methode die Werte 5, 2 und 9 zur aktuellen Liste hinzu.

Statt der fixen Werte willst Du cons nun für alle Elemente aus l aufrufen, also musst Du über l iterieren. Dafür gibt es verschiedene Möglichkeiten, in jedem Fall brauchst Du eine Schleife.
Ich habe mal versucht es mithilfe des Methoden Aufrufs von cons zu regeln.
Code:
public void append(SortedList l) {
        if (!l.isNil())
            if (first == null) {
                first = l.first;
            } else {
                for (Node neu = l.first; neu.next != null; neu = neu.next) {
                    this.cons(neu.value);
                }
            }
    }
Dies funktioniert seltsamerweise jedoch nur für 2 von 3 Werten. Während die 4 und die 6 wohl korrekt eingefügt werden, wird die 8 wohl übersprungen
 
K

kneitzel

Gast
Dann spielt es doch mal durch:
Du bist beim vorletzten Element, dann Rückstand du eins weiter und er prüft: neu.next != null und steigt aus.

Also aufzeichnen und schauen, wie lange du weiter gehen musst, damit es funktioniert.

Und brauchst die Sonderbehandlung mit der Prüfung, ob First Null ist?
 

mihe7

Top Contributor
Die Bedingung habe ich für den Fall eingesetzt, dass die erste Liste null sei, sodass quasi die neue Liste diese einfach ersetzen kann.
Leute, Leute... bevor Ihr Euch an irgendwelche Optimierungen wagt, solltet ihr halbwegs wissen, was ihr da betreibt. Bei Euch fehlt wirklich alles an Grundlagen, was ich mir vorstellen kann. Dozent hin oder her: IHR müsst Euch darum kümmern, die Zeiten, in denen der Lehrer dem Schüler alles nachträgt sind für Euch vorbei.

Zurück zum Thema: first ist eine Referenz(!) auf ein Node-Objekt. Wenn Du first einfach auf l.first setzt, dann referenzieren first und l.first das selbe(!) Objekt. Die Listen bestehen dann nicht aus gleichen Objekten sondern aus identischen. So gut wie jede Änderung der einen Liste wirkt sich damit automatisch auf die andere Liste aus. Das ist nicht das, was Du willst.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ruutaiokwu JRE-/JDK-unabhängige PBKDF2WithHmacSHA512-Implementierung Java Basics - Anfänger-Themen 16
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
K Fehler bei der Implementierung Java Basics - Anfänger-Themen 6
J Implementierung gcd();square() Java Basics - Anfänger-Themen 98
J Implementierung von Observer und Singleton-Pattern Java Basics - Anfänger-Themen 9
A Implementierung von String toString methode() Java Basics - Anfänger-Themen 4
G Projekt architektur (implementierung) Java Basics - Anfänger-Themen 3
M Implementierung einer getNextId Methode Java Basics - Anfänger-Themen 5
J Implementierung eines Zustandsdiagramms Java Basics - Anfänger-Themen 19
I GenericQueue / Implementierung als Ringspeicher Java Basics - Anfänger-Themen 4
MiMa Log4j2 implementierung Java Basics - Anfänger-Themen 4
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
G Array implementierung Java Basics - Anfänger-Themen 23
J ANTLR Installierung und Implementierung Java Basics - Anfänger-Themen 2
E Hilfe bei Implementierung von Methoden Java Basics - Anfänger-Themen 10
S SkipList Implementierung Java Basics - Anfänger-Themen 1
J Methoden Suche effiziente Implementierung für eine Methode Java Basics - Anfänger-Themen 3
J Interface Probleme bei der Implementierung Java Basics - Anfänger-Themen 1
E hashCode implementierung Java Basics - Anfänger-Themen 9
S Implementierung der Klasse Konto und Nutzung bereits vorhandener Klassen Java Basics - Anfänger-Themen 7
H Implementierung eines Interfaces erweitern Java Basics - Anfänger-Themen 13
O Generics - Implementierung Java Basics - Anfänger-Themen 7
A Hilfestellung zur Implementierung des Gaußsches Eliminationsverfahren Java Basics - Anfänger-Themen 4
B OOP Implementierung eines Heaps Java Basics - Anfänger-Themen 13
K Bucketsort Implementierung Java Basics - Anfänger-Themen 0
K Mergesort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
K Quicksort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
S Klassen Klassendiagramm Implementierung? Java Basics - Anfänger-Themen 5
J Bucketsort Implementierung Java Basics - Anfänger-Themen 0
C Stack - listenbasierte Implementierung Java Basics - Anfänger-Themen 4
N Was bedeutet "Implementierung vor dem Client verbergen" bei Design Patterns? Java Basics - Anfänger-Themen 2
T Collections LinkedList<LinkedList<T>> - Implementierung Java Basics - Anfänger-Themen 10
F Implementierung von Interfaces -> Problem mit main Java Basics - Anfänger-Themen 12
D Resourcebundle implementierung Java Basics - Anfänger-Themen 2
M Implementierung des Knuth-Morris-Pratt-Algorithmus Java Basics - Anfänger-Themen 0
Q Implementierung von Listenern Java Basics - Anfänger-Themen 4
B Klassen Hilfe bei Implementierung Java Basics - Anfänger-Themen 5
N Compiler-Fehler Comparable / compareTo implementierung Java Basics - Anfänger-Themen 2
S Fragen zur Implementierung eines Binärbaums Java Basics - Anfänger-Themen 3
I Erste Schritte Implementierung der API Java Basics - Anfänger-Themen 2
S Fragen zur Implementierung eines Adressbuches Java Basics - Anfänger-Themen 20
M falsche implementierung von currentTimeMillis() ? Java Basics - Anfänger-Themen 14
G Implementierung eines Kontos Java Basics - Anfänger-Themen 11
M Quicksort implementierung Java Basics - Anfänger-Themen 23
SexyPenny90 Implementierung einer doubly linked list Java Basics - Anfänger-Themen 5
N Binärbaum/Implementierung Java Basics - Anfänger-Themen 9
U Doppelte Interfcae Implementierung Java Basics - Anfänger-Themen 10
K Kleiner Fehler bei Methoden Implementierung Java Basics - Anfänger-Themen 6
M Collections Problem bei Überschreibung von hashcode() und equals() bei Hashset-Implementierung Java Basics - Anfänger-Themen 5
S OOP Implementierung Komposition, Aggregation, Assoziation und Generalisierung Java Basics - Anfänger-Themen 2
C Klassenhirarchien zur Implementierung von Fahrzegen Java Basics - Anfänger-Themen 26
BinaryLogic Datentypen Statistik Interface - untersch. Implementierung Java Basics - Anfänger-Themen 5
E Performante Implementierung eines "Hintergrundprogramms" Java Basics - Anfänger-Themen 10
S Saubere Implementierung Java Basics - Anfänger-Themen 2
K Dijkstra implementierung 2.0 Java Basics - Anfänger-Themen 19
K dijskral implementierung Java Basics - Anfänger-Themen 14
U Probleme mit Server-Client implementierung Java Basics - Anfänger-Themen 5
K Game of Life Implementierung Java Basics - Anfänger-Themen 30
B OOP Problem bei Implementierung von Interface Java Basics - Anfänger-Themen 6
J HashSet Implementierung Java Basics - Anfänger-Themen 16
R NullPointerException in Queue-Implementierung Java Basics - Anfänger-Themen 11
X Frage zur Implementierung von equals() Java Basics - Anfänger-Themen 2
B Effektive Implementierung für Darstellung großer Datenmengen in Jogl Java Basics - Anfänger-Themen 5
D Datentypen Implementierung eines Binärbaumes Java Basics - Anfänger-Themen 7
B Implementierung Java Basics - Anfänger-Themen 2
N Implementierung Tic tac toc Java Basics - Anfänger-Themen 25
O Stack Implementierung als verkettete Liste Java Basics - Anfänger-Themen 8
Y Implementierung einer Potenzturm Funktion Java Basics - Anfänger-Themen 4
S Implementierung gegen Interfaces / List, ArrayList, LinkedList Java Basics - Anfänger-Themen 11
J Quicksort Implementierung-- Exception ArrayOutOfBounds Java Basics - Anfänger-Themen 6
U Implementierung Constructor Java Basics - Anfänger-Themen 7
T Problem mit Implementierung von einer HashMap aufgabe Java Basics - Anfänger-Themen 2
G Implementierung des Observer/Observable Patterns - Gut so? Java Basics - Anfänger-Themen 3
I Zugriff auf Implementierung verhindern Java Basics - Anfänger-Themen 8
D Implementierung nach MVC Java Basics - Anfänger-Themen 6
B Theoretische Frage zum Programmbau (nun zur Implementierung) Java Basics - Anfänger-Themen 8
H Implementierung von Interfaces Java Basics - Anfänger-Themen 4
G Implementierung von Bäumen Java Basics - Anfänger-Themen 2
N Probleme mit paint() bei Implementierung in ein Panel Java Basics - Anfänger-Themen 4
B Wie funktioniert die implementierung von c code in Java? Java Basics - Anfänger-Themen 7
D Listen in Listen in Listen ... ??? Java Basics - Anfänger-Themen 2
XWing listen Java Basics - Anfänger-Themen 7
FunkyPhil94 addLast und addFirst bei Listen Java Basics - Anfänger-Themen 6
S Einfach-Verkettete-Listen Ausgabe zeigt nur 1. und letzte instanz Java Basics - Anfänger-Themen 2
J 2 listen vergleichen, die auch null Elemente haben können ! Java Basics - Anfänger-Themen 9
W Liste mit Listen in JTable darstellen Java Basics - Anfänger-Themen 1
Buroto Threads Verschiedene .txt Dateien Auf Listen und Verbinden Java Basics - Anfänger-Themen 3
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
S Lineare listen verkettung Java Basics - Anfänger-Themen 7
S Listen Java Basics - Anfänger-Themen 12
S Listen , Nodes am ende anängen Java Basics - Anfänger-Themen 6
P Sortieren von Listen nach Attributen Java Basics - Anfänger-Themen 3
M Java Listen Java Basics - Anfänger-Themen 4
V einfach verkettete Listen Java Basics - Anfänger-Themen 10
A PhoneBook mit verketteten listen Java Basics - Anfänger-Themen 48
F ich brauche Hilfe bei Listen Java Basics - Anfänger-Themen 13
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
G Java Listen und Iterator Java Basics - Anfänger-Themen 2
S Erklaerung Listen Java Basics - Anfänger-Themen 27

Ähnliche Java Themen

Neue Themen


Oben