verkettete Liste

Status
Nicht offen für weitere Antworten.

Reen

Bekanntes Mitglied
Hallo!

Mal ne Frage. Beschäftige mich gerade mit verketteten Listen. Habe hierzu auch ein Bsp. gefunden http://www.hh.schule.de/julius-leber-schule/UlfChrist/verklisten.html. Das Prob am Ganzen ist, dass die Ausgabe in der genau umgekehrten Reihenfolge passiert, wie die Elemente in die Liste geschrieben wurden. d.h. das die neuen Elemente werden immer zwischen Kopf und dem aktuellen Nachfolger vom Kopf eingeschoben. Das ist aber irgendwie Mist.

Ich finde auch keinen Weg, wie ich das anders in die Liste schreiben kann, dass die Ausgabe der Eingabe entspricht.

Kann mir da ma jemand einen Tipp geben?

Danke
Reen
 

moormaster

Top Contributor
Ist doch klar... die Methode fuegeNache(knoten, neuerKnoten) fügt den neuen Knoten direkt hinter den anderen als Parameter angegebenen Knoten ein. In der Beispiel main Methode werden Elemente immer direkt hinter dem Kopf eingefügt.

D.h. wenn du eine leere Liste hast

k->[null]

und Elemente immer wieder direkt hinterm Kopf einfügst, veränderst du damit eben die Reihenfolge:

fuegeNach(k, "1"):
k->"1"->[ende]

fuegeNach(k, "2");
k->"2"->"1"->[ende]

fuegeNach(k, "3");
k->"3"->"2"->"1"->[ende]

Wenn die Reihenfolge der vom Kopf bis zum Ende gelesenen Elemente der Reihenfolge des Einfügens entsprechen soll, dann musst du neue Elemente immer hinter dem letzten Element der Liste einfügen... bedeutet natürlich mehr Arbeit, weil du immer wissen musst, welches gerade das letzte Element ist.


fuegeNach(k, "1");
k->"1"->[ende]

fuegeNach(Referenz auf "1", "2");
k->"1"->"2"->[ende]

fuegeNach(Referenz auf "2", "3");
k->"1"->"2"->"3"->[ende]
 

Reen

Bekanntes Mitglied
Moin.

Kann mir nochma einer erklären, was folgender Syntax bedeutet. Code aus obrigem Link (da ist übrigens ein Punkt am Ende des Links zu viel :wink: )

Code:
neuKnoten.naechstes  = vorgaenger.naechstes

Also mir gehts jetzt nich darum, was dieses Stück Code macht. Das weiss ich, aber mir ist der Syntax nich ganz klar.
Die Var. "vorgaenger" ist eine Var. der Klasse Liste und "naechster" eine Var. der Klasse Knoten vom Typ Knoten.

Diese Kombination der beiden Var. verstehe ich nich ganz. Wird eine neue Instanz von Knoten erstellt, steht NULL in "naechstes". In "vorgaenger" steht immer die Adresse von "kopf".

Was passiert jetzt eigentlich mit beiden Variablen in dieser Kombination. Beides sind ja eigentlich nur Variablen! :bahnhof:

Danke
Reen
 
S

SlaterB

Gast
alles vier sind Variablen, mit denen man Objekte ansprechen kann

vorgaenger kann zu diesem Zeitpunkt wohl einen sinnvollen naechstes haben (nicht unbedingt null)

diese Referenz auf ein Objekt möchte man kopieren,
man speichert sie in einer anderen Variablen, und zwar in
neuKnoten.naechstes

da ist doch nix dabei?

Normalfall:
KlassenName einObjekt = irgendas;
irgendeineVariable = einObjekt;

hier:
KlassenName einObjekt = vorgaenger.naechstes;
neuKnoten.naechstes= einObjekt;


kürzer in einer Zeile
 

Reen

Bekanntes Mitglied
Jo...danke. Bin dann langsam auch dahinter gekommen.

So....jetzt nochma zu der Liste. Die sollte ja in der gleichen Reihenfolge ausgegeben werden, wie es auch in die Liste geschrieben wurde. Einen kleinen Teilerfolg konnte ich erzielen. Nur ganz ist es noch nich so, wie es sein soll.

Jetzt stimmt zwar die Reihenfolge der übergebenen Strings, aber mit dem Knoten "Kopf" und "Ende" hat er ein Prob.
Die Ausgabe sieht dann folgendermaßen aus.
Code:
kopf
ende
Element 1

Warum auch immer. Ich habe mir extra ein paar Ausgaben zusätzlich gemacht, um zu sehen, wie er die Adressen hin und her kopiert.

Also erstes zeigt ja "Kopf" auf "Ende". Der Knoten Ende wird ja dann durch einen neuen Knoten ersetzt, der dann Werte enthält. Die Adresse von Kopf zeigt ja immer noch auch die gleiche Folgeadresse, nur das eben der Knoten quasi ersetzt wurde. Eigentlich werden ja nur die Adressen verändert.

Jemand ne Idee, wie ich das jetzt noch vollkommen richtig in Reihe bekommen?

Danke
Reen

Code:
class Knoten                  
{                            
  public Knoten naechster;    

  public Object element;      
                             
  
  public Knoten(Object obj)   
  {                           
    element = obj;            
   
  }
}


Code:
class Kette                                     
	{                                           
	  public Knoten kopf = new Knoten("kopf");  
	  public Knoten ende = new Knoten("ende");  
	 
	  
	  public Kette()                            
	  {                                         
		kopf.naechster = ende;                  
	    ende.naechster = null;
	  }                                         


	  public void fuegeNach(Object neuObj)
	  {   System.out.println("Adresse Kopf: " + kopf); 
	      System.out.println("Adresse Kopf (naechster): " + kopf.naechster);
	      
	      System.out.println("Adresse Ende: " + ende);
	      System.out.println("Adresse Ende (naechster): " + ende.naechster);
	      
	      
	      Knoten neuKnoten = new Knoten(neuObj);
	      Knoten aktueller_neuKnoten = neuKnoten;
	      
	      	      
   	      System.out.println("\nneuKnoten (Adresse): " + neuKnoten);
     	  System.out.println("neuKnoten nächster: " + neuKnoten.naechster);
   	      
	      
	      neuKnoten = ende;
	      neuKnoten.naechster = aktueller_neuKnoten;
	      ende = aktueller_neuKnoten;
	      
	      System.out.println("\nAdresse vom neuKnoten mit Ende Knoten tauschen\n");
	      System.out.println("neuKnoten (Adresse): " + neuKnoten);
	      System.out.println("neuKnoten nächster (Adresse): " + neuKnoten.naechster);
	      
	      System.out.println("Ende Knoten: " + ende);
	      System.out.println("Ende Knoten (naechster): " + ende.naechster);
	  }                                                 
	  
	 
	  public void ausgeben()
	  {
	    Knoten aktuellerKnoten = kopf;                    

	    while (aktuellerKnoten != null)                   
	    {
	      System.out.println(aktuellerKnoten.element);    
	      aktuellerKnoten = aktuellerKnoten.naechster;    
	    }                                                 
	  }                                                   
	}


Code:
import java.util.Vector;

public class Kettentest
{
  public static void main(String[] params)
  {    
	Kette liste = new Kette ();
	
	liste.fuegeNach ("Element 1");

   liste.ausgeben ();
  }
}
 
S

SlaterB

Gast
also bei so bescheuerten Namen helfe ich zumindest nicht, sorry (bis auf die folgenen allgemeinen Tipps)
nenne sie 1,2,3,4


und überhaupt, versuche erstmal ein Element einzufügen, klappt das?
dann ein zweites, geht das?, Reihenfolge richtig? Schritte nachzuvollziehen?
dann drei, dann vier,

wann tritt das erste mal der Fehler aus?,
was genau geht, die Sache mit den Adressen habe ich nicht verstanden,

schön ist die Operation ausgeben, die hilft weiter,
beim fraglichen Schritt (beim ersten bei dem der Fehler auftritt, nicht wenn die Liste eh schon voll und alles durcheinander ist!) führe diese VOR und NACH dem Einfügen durch,

und in der Einfüge-Operation Schritt für Schritt-Ausgaben der Änderungen,
da hast du ja schon ne Menge, verstehst du es trotzdem nicht oder was ist das Problem?
 

Reen

Bekanntes Mitglied
So....ich habs ma bissl abgeändert (oben den Code).

Ich poste ma die Ausgabe der Adressen, wo die Objekte liegen

Code:
Adresse Kopf: Knoten@119c082
Adresse Kopf (naechster): Knoten@1add2dd
Adresse Ende: Knoten@1add2dd
Adresse Ende (naechster): null

neuKnoten (Adresse): Knoten@eee36c
neuKnoten nächster: null

Adresse vom neuKnoten mit Ende Knoten tauschen

neuKnoten (Adresse): Knoten@1add2dd
neuKnoten nächster (Adresse): Knoten@eee36c
Ende Knoten: Knoten@eee36c
Ende Knoten (naechster): null

Das sieht für mich alles logisch aus. Kopf hat die Adresse "119c082" und zeigt auf den EndeKonten mit "1add2dd".

Jetzt legt es einen neuen Knoten mit Adr. "eee36c" an, welcher vorerst auf NULL zeigt. Im nächsten Schritt tausche ich die Adressen von Ende-Knoten mit dem neuen Knoten. d.h. der neue Knoten bekommt die Adresse "1add2dd" und der Ende Knoten die Adresse "eee36c".

Jetzt verstehe ich nich, warum die Ausgabe folgendermaßen aussieht !

Code:
kopf
ende
Element 1

Element 1 ist das erste Object, was dann vom "main" Prog. übergeben wird.

Wo könnte der Fehler denn liegen? Ist es vllt der Fall, dass ich zwar die Adresse tausche, aber nicht gleichzeitig auf den neues Inhalt verweise, was ich mir aber nich wirklich vorstellen kann!

Gebt mir mal bitte einen Tipp!

Danke
Reen
 
S

SlaterB

Gast
geniale Idee, neben den (eindeutigen!) NAMEN der Knoten auch noch deren Hashcode zu betrachten,
komplizierter gehts ja kaum..
----

davon abgesehen, was ist das Problem?
wo sollte das neu eingefügte Element hin wenn nicht ans Ende?

und du schreibst ja auch 'Adresse vom neuKnoten mit Ende Knoten tauschen'
was danach klingt, dass neuKnoten ans Ende soll?

und du führst ja auch genau die Schritte aus, die den neuKnoten genau ans Ende setzen,
alles paletti?

-------

Code:
class Kette
{
    public Knoten kopf = new Knoten("kopf");
    public Knoten ende = new Knoten("ende");


    public Kette()
    {
        kopf.naechster = ende;
        ende.naechster = null;
    }

    public void fuegeNach(Object neuObj)
    {
        System.out.println("Kopf: " + kopf);
        System.out.println("Ende: " + ende);

        Knoten neuKnoten = new Knoten(neuObj);
        Knoten aktueller_neuKnoten = neuKnoten;

        System.out.println("\nneu : " + neuKnoten);


        neuKnoten = ende;
        neuKnoten.naechster = aktueller_neuKnoten;
        ende = aktueller_neuKnoten;

        System.out.println("\nAdresse vom neuKnoten mit Ende Knoten tauschen\n");
        System.out.println("neu : " + neuKnoten);
        System.out.println("Ende: " + ende);
    }

    public void ausgeben()
    {
        Knoten aktuellerKnoten = kopf;

        while (aktuellerKnoten != null)
        {
            System.out.println(aktuellerKnoten.getSingleDescription());
            aktuellerKnoten = aktuellerKnoten.naechster;
        }
    }


    public static void main(String[] params)
    {
        Kette liste = new Kette();
        System.out.println("Liste vor einfügen: ");
        liste.ausgeben();

        liste.fuegeNach("Element 1");

        System.out.println("\nListe nach einfügen: ");
        liste.ausgeben();
    }


    class Knoten
    {
        public Knoten naechster;
        public Object element;

        public Knoten(Object obj)
        {
            element = obj;

        }

        public String getSingleDescription()
        {
            String info = "Knoten, Inhalt: " + (element == null ? "leer" : element.toString());
            return info;
        }

        public String toString()
        {
            return getSingleDescription() + "  ----  naechser: " + 
               (naechster == null ? "null" : naechster.getSingleDescription());
        }

    }


}
 

Reen

Bekanntes Mitglied
Moin...

Ich meinte das so, dass das neu eingefügte Element genau zwischen "Kopf" und "Ende" Knoten soll.

Also in Form von

Code:
Kopf
Element 1
Element 2
usw.
Ende

Das war eigentlich mein Anliegen. Kam vllt nich so deutlich rüber. Sry

Warum ist das Kompliziert, die Hashadressen zu betrachten. Meiner Meinung nach kann man ja dann zumindest sehen, an welchen Adressen die Objekte im Speicher liegen und wie man was tauschen kann :?

mfg
Reen

PS: Nich gleich aufregen, weil irgendwas zu kompliziert ist. Bin schließlich noch Java Anfänger.
 
S

SlaterB

Gast
ja, aber jeder Knoten hat doch einen Inhalt,
ist doch viel leichter wenn da steht 'hier ist Element 1' also was da steht 'hier ist Element df8907s9' und ich noch nicht weiß, ob das kopf, ende oder Element 1 ist

> Nich gleich aufregen, weil irgendwas zu kompliziert ist. Bin schließlich noch Java Anfänger

mich kann nichts schocken, ich zeige dir nur was man alles falsch machen kann und was das für Folgen hat,
erst nachdenken, dann programmieren

und ist natürlich nur eine Meinung, manche finden Hashcode eben schicker ;)

-----

also zum Zwischeneinfügen hast du bisher noch nichts gemacht,
darüber kann man nun nachdenken ;)

wo soll es denn hin wenn die Liste 10 Elemente hat?
genau in die Mitte oder eins nach Anfang oder eins vor Ende?
letzteres klingt ja noch am besten,

da brauchst du nun das Element VOR ende,
mit einer doppelt verketteten Liste könntest du den 'vorgaener' von Ende abfragen,
hast du aber nicht, also musst du bei kopf anfangen und die ganze Liste durchlaufen und dir jeweils den Vorgänger merken bis du am Ende bist,

dann ist doch nicht schwer:
dieser Vorgaenger zeigt in seiner naechster-Referenz auf das neue Element (vorher auf ende),
das neue zeigt bei naechster auf ende (vorher auf gar nix)

ende selber musst du überhaupt nicht verändern oder neusetzen
 

Reen

Bekanntes Mitglied
Oki...danke. Werde ich ma versuchen.

Eins musst du mir aber nochma verraten. Du hast die Funkt. Knoten um zwei Funktionen erweitert, aber an keiner Stelle im Prog. rufst du diese Funktion auf. Trotzdem werden diese abgearbeitet.

Über welchen Umweg ruft dann Java diese Funkt. auf?

thx
 
S

SlaterB

Gast
toString ist eine Standard-Operation

System.out.println("Kopf: " + kopf);
=
System.out.println("Kopf: " + kopf.toString()); // wenn nicht null



normalerweise liefert sie Klassenname + Hashcode: Knoten@119c082
 

NTB

Bekanntes Mitglied
Ich fand die Betrachtung der Hashcodes jetzt nicht so schlimm, aber man sieht einfach schneller, was man macht, wenn man sich eine vernünftige Ausgabe bastelt.

Ein Tip, was mir dazu einfällt: Wenn Du sowas baust, mal Dir auf jeden Fall ein Bild mit den Objekten und was Du mt den Zeigern machen willst etc und arbeite dann Dein Bild in Programmcode um. Das hilft enorm, weil man sich das dann einfach besser vorstellen kann.

Edit:
So wie das da z.B.
http://www.peter-junglas.de/fh/vorlesungen/algorithmen/images/bild18.gif
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Verkettete Liste Java Basics - Anfänger-Themen 1
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
Igig1 Autoparkplatz verkettete Liste erstes und letztes Auto Java Basics - Anfänger-Themen 13
R Rückgabe: verkettete Liste Java Basics - Anfänger-Themen 2
R einfach verkettete Liste Java Basics - Anfänger-Themen 1
R einfach verkettete Liste Java Basics - Anfänger-Themen 12
B Verkettete Liste durchgehen und einzelne Elemente in neue Liste tun Java Basics - Anfänger-Themen 9
B Bin komplett am verzweifeln :( Verkettete Liste die Objekte hat Attribut auslesen Java Basics - Anfänger-Themen 14
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
A Doppelt verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 17
D Doppelt Verkettete Zirkular-Liste Java Basics - Anfänger-Themen 1
A Verkettete Liste Java Basics - Anfänger-Themen 2
B Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 8
L verkettete Liste Java Basics - Anfänger-Themen 15
scratchy1 doppelt verkettete Liste testen Java Basics - Anfänger-Themen 8
R Methoden Entferne alle identische Knoten (Typ String) aus verkettete Liste Java Basics - Anfänger-Themen 8
C Methoden Über eine einfach verkettete Liste Java Basics - Anfänger-Themen 8
H Verkettete Liste Java Basics - Anfänger-Themen 7
N Verkettete liste rückwärts ausgeben Java Basics - Anfänger-Themen 18
K Verkettete Liste und seine Methoden Java Basics - Anfänger-Themen 1
N Verkettete Liste implementieren Java Basics - Anfänger-Themen 5
O Einfach verkettete Liste - Revert Methode Java Basics - Anfänger-Themen 1
G Verkettete Liste - Neu erzeugte Elemente werden nicht ausgegeben Java Basics - Anfänger-Themen 5
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
B Doppelt Verkettete Liste - Ist alles gut so? Java Basics - Anfänger-Themen 3
C Verkettete Liste - sortiert einfügen Java Basics - Anfänger-Themen 7
R Erste Schritte Verkettete Liste will einfach nicht in meinen Schädel Java Basics - Anfänger-Themen 11
U Datentypen Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 13
J Methoden Doppelt verkettete Liste remove(Object) Java Basics - Anfänger-Themen 8
B OOP Über eine doppelt verkettete Liste iterieren Java Basics - Anfänger-Themen 4
hooked Verkettete Liste / linked list Java Basics - Anfänger-Themen 2
L Doppelt verkettete Liste Java Basics - Anfänger-Themen 6
J Eine Art verkettete Liste aber mit teils mehr als einem Nachfolger Java Basics - Anfänger-Themen 8
V Verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 3
R doppelt verkettete Liste aus Arrays erstellen Java Basics - Anfänger-Themen 1
K Einfach Verkettete Liste - addFirst() Java Basics - Anfänger-Themen 7
G 2 Aufgabe rund um eine verkettete Liste Java Basics - Anfänger-Themen 2
O Verkettete Liste Java Basics - Anfänger-Themen 10
E Methoden auf von Methoden erstellte Objekte zugreifen (verkettete Liste) Java Basics - Anfänger-Themen 10
X Einfach verkettete Liste, keine Fehlermeldung Programm friert ein Java Basics - Anfänger-Themen 4
S Doppelt verkettete Liste Java Basics - Anfänger-Themen 3
G Doppelt Verkettete Liste Java Basics - Anfänger-Themen 2
A Doppelt Verkettete Liste Java Basics - Anfänger-Themen 16
E doppelt verkettete liste Java Basics - Anfänger-Themen 10
V Verkettete Liste. Java Basics - Anfänger-Themen 7
X Einfach Verkettete Liste Java Basics - Anfänger-Themen 16
K Verkettete Liste - Methode entwerfen Java Basics - Anfänger-Themen 14
S Verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 12
B Insertionsort verkettete Liste Java Basics - Anfänger-Themen 4
B Stack in eine verkettete Liste pushen Java Basics - Anfänger-Themen 4
R verkettete liste ansEndeSchieben Java Basics - Anfänger-Themen 13
T Verkettete Liste Java Basics - Anfänger-Themen 14
A Klassen Innere Klassen, verkettete Liste Java Basics - Anfänger-Themen 9
B Zweifach-verkettete Liste umkehren Java Basics - Anfänger-Themen 6
X verkettete Liste Java Basics - Anfänger-Themen 13
E Datentypen Doppelt verkettete Liste Java Basics - Anfänger-Themen 10
P Einfügen in doppelt verkettete Liste Java Basics - Anfänger-Themen 7
kae verkettete Liste Java Basics - Anfänger-Themen 5
S Queue als doppelt verkettete Liste Java Basics - Anfänger-Themen 2
S Stack als verkettete liste/ toString methode Java Basics - Anfänger-Themen 3
B OOP Verkettete Liste Java Basics - Anfänger-Themen 7
R verkettete liste Java Basics - Anfänger-Themen 5
M Verkettete Liste Java Basics - Anfänger-Themen 4
M verkettete liste Java Basics - Anfänger-Themen 7
N doppelt verkettete liste einfügen Java Basics - Anfänger-Themen 7
K Datentypen Einfach/Doppelt verkettete Liste Java Basics - Anfänger-Themen 4
N einfach verkettete liste fehler Java Basics - Anfänger-Themen 5
N einfach verkettete liste Java Basics - Anfänger-Themen 3
G verkettete Liste - invertieren Java Basics - Anfänger-Themen 2
B OOP Einfach verkettete Liste - rekursive Methoden Java Basics - Anfänger-Themen 1
B verkettete Liste Java Basics - Anfänger-Themen 8
S zyklisch verkettete Liste erstellen Java Basics - Anfänger-Themen 3
S einfach verkettete Liste Java Basics - Anfänger-Themen 19
O Stack Implementierung als verkettete Liste Java Basics - Anfänger-Themen 8
W Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 2
T Einfach verkettete Liste: Wie Elemente löschen? Java Basics - Anfänger-Themen 4
J verkettete Liste Java Basics - Anfänger-Themen 2
D Einfach verkettete Liste Java Basics - Anfänger-Themen 20
DasDogma Verkettete Liste - Element löschen Java Basics - Anfänger-Themen 2
H Verkettete Liste Java Basics - Anfänger-Themen 5
M verkettete Liste auslesen Java Basics - Anfänger-Themen 7
K eigene verkettete Liste Java Basics - Anfänger-Themen 4
G Doppelt verkettete, generische Liste Java Basics - Anfänger-Themen 11
A Eine verkettete Liste Java Basics - Anfänger-Themen 43
G verkettete lineare Liste Java Basics - Anfänger-Themen 2
L verkettete Liste - Ausgabeproblem Java Basics - Anfänger-Themen 2
G Wie kann ich eine verkettete Liste in ein JTable einfügen? Java Basics - Anfänger-Themen 7
D doppelt verkettete Liste Java Basics - Anfänger-Themen 16
S Doppelt Verkettete Liste Java Basics - Anfänger-Themen 7
R ArrayList Objekt -> verkettete Liste Java Basics - Anfänger-Themen 4
R verkettete Liste in und aus Datei Java Basics - Anfänger-Themen 5
M Doppelt verkettete Liste Zeiger Vorgänger beim Einfügen Java Basics - Anfänger-Themen 2
J doppelt verkettete Liste Java Basics - Anfänger-Themen 5
L doppelt verkettete Liste Java Basics - Anfänger-Themen 6
C einfach verkettete Liste -> Elemente vertauschen Java Basics - Anfänger-Themen 2
0 Binärbaum als verkettete Liste Java Basics - Anfänger-Themen 3
B Doppelt verkettete Liste implementieren Java Basics - Anfänger-Themen 12
G Dopplelt verkettete liste Java Basics - Anfänger-Themen 4
B Doppelt verkettete Liste Java Basics - Anfänger-Themen 16
R einfach verkettete Liste, intersect Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben