doppelt verkettete Liste

Status
Nicht offen für weitere Antworten.

JP

Mitglied
Servus,

hab hier ein problem mit meiner tollen doppelt verketteten Liste. Ich kann zwar wunderbar Elemtente in meine Liste einfügen, aber wenn ich nach einem Element suchen möchte um genau das zu entfernen läuft irgendwas im Code schief. Es kommt zu keiner Exception oder sonstigen fehlermeldung, aber ich nehme mal an das ich die suche nach dem element falsch programmiert habe. Habe die Stelle der Suche in der Klasse Liste kommentiert. Schon mal danke für sämtliche Hinweise, Kritik und Anregungen.

Gruß

P.S. Ich weiß das es mit der API schneller und einfacher geht, soll aber nich!



Hier mal der Code:



Code:
public class Knoten {
	public int Daten ;
	Knoten next;
	Knoten previous;
	public Knoten(int d){
		
		Daten=d;
	}
	public void zeigeKnoten(){
		System.out.print("{"+Daten+"}");
	}
	public final Knoten getNext(){
		return next;
	}
	public final Knoten getPrevious(){
		return previous;
	}
	public final void setNext(Knoten next){
		this.next=next;
	}
	public final void setPrevious(Knoten prev){
		this.previous=prev;
	}


}

public class Liste {
	private Knoten first;	/*Erstes Element*/
	private Knoten last;	/*Letztes Element*/
	static int count;		/*Anzahl der Elemente*/
	
	public Liste(){
		first = null;
		last  = null;
		count = 0;
	}
	boolean isLeer(){
		return(first==null);
	}
	public void add(int d){
		Knoten x = new Knoten(d);
		if(!isLeer()){
			x.setNext(first);
			x.setPrevious(null);
			first.setPrevious(x);
			first=x;
		}else{
			x.setNext(null);
			x.setPrevious(null);
			first=x;
			last=x;
		}
		count++;
	}
	public Knoten   remove(int d){
		Knoten z = new Knoten(d);
//		Knoten current = first;
		if(!isLeer()){
/*An dieser Stelle wird gesucht*/
			Knoten current=first;
			while((current!=null)&&(current!=z)){
				current=current.getNext();
			}
/*Ab hier fange ich an das jeweilige Element an der entsprechenden Stelle auszuketten*/
			if(current!=null){
				if((current==first)&&(current==last)){
					first=null;
					last=null;
				}else if(current==last){
					last=last.getPrevious();
					last.setNext(null);
				}else if(current==first){
					first=first.getNext();
					first.setPrevious(null);
				}else{
					Knoten previous=current.getPrevious();
					Knoten next=current.getNext();
					previous.setNext(next);
					next.setPrevious(previous);
				}
				count--;
			}
		}
		return z;
	}
	public void print(){
		Knoten current = first;
		while(current!=null){
			current.zeigeKnoten();
			current=current.next;
		}
		System.out.print("\t Anzahl der Elemente:"+count);
		System.out.println();
	}
	public static void main(String[]args){
		Liste neueListe = new Liste();
		neueListe.add(5);
		neueListe.print();
		neueListe.remove(5);
		neueListe.print();

		
	}




}
 
Fehlermeldung (mit Zeilennummer) sind schon sehr hilfreich!
ganz ganz grob gesehen ist sonst zumindest von mir nichts zu entdecken

edit: oder doch, liegst vielleicht an Stellen wie

first=first.getNext();
first.setPrevious(null);

wenn nur ein Element in der Liste ist liefert first.getNext() vielleicht null




--------

bei solch einfachen Vorgängen solltest du aber auch alle Probleme selber finden können,
vergleiche das was du dir vorstellst mit dem was das Programm tut,

wenn du nicht genau siehst was das Programm tut (insbesondere innerhalb von Schleifen),
dann mache eine Ausgabe wie:

Zeile 64: System.out.println("lese nun .getNext() von current: "+current);
Zeile 65: current=current.getNext();

wenn sich dann dein Programm mit NullpointerException in Zeile 65 verabschiedet und du als letzte Logausgabe
'lese nun .getNext() von current: null'
liest, dann weißt du woran es gelegen hat 😉

ist ein triviales Beispiel, aber so in der Art kann man bei dieser Art Programmen jeden beliebigen Fehler selber finden
 
Also erstmal danke für die Antwort. Aber wie du sicher gelesen hast kommt es zu "keiner" Fehlermeldung.

Und laut meiner Vorstellung solte das gewünschte Element über meine Suche gefunden werden, wird es aber nich!

Das mit den Ausgaben in den schleifen is natürlich keine schlechte idee, ich persöhnlich bevorzuge da aber den debugger. Daher meine Frage anders gestellt is meine Bedingung in der while Schleife falsch mir fällt im moment keine andere ein.
 
Moin,

schau mal bitte hier:

Code:
      Knoten z = new Knoten(d);
//      Knoten current = first;
      if(!isLeer()){
/*An dieser Stelle wird gesucht*/
         Knoten current=first;
         while((current!=null)&&(current!=z)){
            current=current.getNext();
         }


Du weist z ein neues Objekt zu. Und versuchts anschließend in der While-Schleife mit einem Vergleich des neuen Objektes und den in der Liste das gewünschte zu finden:
Code:
while((current!=null)&&(current!=z)){
Entweder du überschreibst in der Knotenklasse die methode "public boolean equals(Object obj)" so, dass diese nachschaut,, erstens ob das übergebene Objekt vom Typ Klasse ist und zweitens ob es die selben Daten hält. In deinem fall wäre das der vergleich von den public Variabeln Daten.

Code:
   public boolean equals(Object obj) {
	if (obj instanceof Knoten) {
		Knoten knoten = (Knoten) obj;
		return (this.Daten == knoten.Daten);
	}
	return false;
   }

Diese Variante kann man so nutzen aber ist auch mit Einschränkungen genießen, da nun kein Vergleich mehr mit dem "==" Operator gemacht werden kann um herauszufinden ob es sich um das selbe Objekt handelt.

Eine andere Variante wäre einfach die While-Bedingung abzuändern:

Code:
while((current!=null)&&(current.Daten!=d)){...

Ich hoffe ich konnte dir helfen. Ein Link noch zum Thema "==" und der Methode equals aus der Klasse "java.lang.Object" http://www.galileocomputing.de/openbook/javainsel5/javainsel03_006.htm#Xxx999444

mfg qpid
 
ah, gut, bisschen zu schnell von mir gelesen

also den Knoten z erzeugst du ja neu (new Knoten(d))
damit kann dieser Knoten unmöglich gleich einem anderen auf der Welt sein,
kann unmöglich in der Liste sein da er ja eben erst erzeugt wurde,

was du suchst ist ein anderer Knoten mit gleichen Inhalt,
wäre die equals-Operation ordentlich implementiert könntest du

while((current!=null)&& !current.equals(z)){

nehmen,

so wirst du aber wahrscheinlich direkt auf den int zugreifen müssen:
while((current!=null)&&(current.Daten!=z.Daten)){

-----------

um nochmal auf das nachhaltige Lernen zurückzukommen 😉

dies wäre mit
System.out.println(" vergleiche current (Ausgabe current)+ z (Ausgabe z), Ergebnis = (true oder false)");

leicht zu finden gewesen, mit Debugger natürlich auch
 
Vielen Dank für die antworten, jetzt läufts. Hab mich dafür entschieden direkt auf den int zuzugreifen. Is ja auch eigentlich glasklar. Aber hinterher weiß man immer mehr. Noch mal danke
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben