Listen richtig doppelt verkettet?

Status
Nicht offen für weitere Antworten.

mobile

Bekanntes Mitglied
HI, ich habe nach 2 tagen arbeit nun eine Lösung gefunden. Funktioniert glaub ich alles. Hab jedenfalls alles positiv getestet, aber so ganz sicher bin ich nicht.
Wäre euch sehr dankbar, wenn ihr mal über mein Code schauen könntet und mir sagen könntet ob die Folgenden Anforderungen erfüllt sind. Ich weiß dauert vielleicht etwas länger, aber wäre echt wichtig für mich! Danke schon mal im Voraus!

1. doppelt verkettet
2. verweis auf das erste Element
3. verweis auf das letzte Element
4. Methode lastElement, die das letzte Element liefert.

Also, was mich so unsicher macht, wenn ich zB in der Methode firstElement zusärtlich noch ne Ausgabe mit System.out.println("Ab first: " + first.next); gibt er mir ja die ganze List aus, wenn ich jetzt aber bei lastElement das Gleiche machen will, also System.out.println("Vor last: " + last.prev); gibt er mir immer nur den letzten und den Vorgänger eben so wies da steht aus, aber nich die komplette Liste vor dem letzten Element. Liegt das vielleicht an der toString() Methode oder is das ein Zeichen das die doppelt Verkettung doch noch nich so ganz ok ist?

Hier mal der Code:

Code:
public class List implements ADTList {
	//Zeiger auf das erste Element
	private Listenelement first;
	private Listenelement last;
	
	//Speichert die laenge der Liste/Anzahl der Elemente
	private int length;
	
	/**
	 * Konstruktor
	 * erstellt eine neue Lise
	 * */
	public List() {
		first = null;
		last = null;
		length = 0;
	}
	
	/**
	 * Lokale Klasse Listenelemet erstellt neue Listenelemente
	 * */
	class Listenelement {
		Listenelement next;
		Element wert;
		Listenelement prev;
		
		//next ist vorhergegangenes / this.next wird das
		Listenelement(Listenelement next, Element x, Listenelement prev) {
			this.next = next;
			this.wert = x;		
			this.prev = prev;
		}
			
		public String toString() {
			return " -> " + wert + (next == null ? " |- " : next.toString());
		}
	}
	
	/**
	 * Fuegt ein neues Element am Anfang der Liste ein
	 * @param Element x
	 * */
	public void insert(Element x) {	
		first = new Listenelement(first, x, last);
		if(first.next == null) {
			last = first;
		}
		length++;
	}
	
	/**
	 * Fuegt ein neues Element am Ende der Liste ein
	 * @param Element x
	 * */
	public void append(Element x){
		if(isEmpty()) {
			insert(x);
		}
		else {
			Listenelement p = first;
			for(; p.next != null; p = p.next);
			p.next = new Listenelement(null, x , last);
			last = p.next;			
			length++;
		}
	}
	
	/**
	 * Liefert die Laenge der Liste
	 * @return int lenght
	 * */
	public int length() {
		return length;
	}
	
	/**
	 * Ist die Liste leer?
	 * @return boolean
	 * */
	public boolean isEmpty() {
		return first == null;
	}
	
	/**
	 * Liefert das erste Element in der Liste
	 *  * @return Element last
	 * */
	public Element firstElement() {
		if(isEmpty()) {
			return null;
		}
		else {
			return first.wert;
		}
	}
	
	/**
	 * Liefert das letzte Element in der Liste
	 * @return Element last
	 * */
	public Element lastElement() {
		if(isEmpty()) {
			return null;
		}
		else {
			return last.wert;
		}
	}
	
	/**
	 * Ist das Element in der Liste?
	 * @param Element x
	 * */
	public boolean isInList(Element x){
		Listenelement p = first;
		
		while(p != null) {
			if(p.wert.equals(x)) {
				return true;
			}
			p = p.next;
		}
		return false;
	}
	
	/**
	 * Entfernt ausgewähltes Element
	 * @param Element x
	 * */
	public void delete(Element x){
		if(isInList(x)){
			length--;
			if(first.wert.equals(x)) {
				first = first.next;
			}
			else {
				Listenelement p = first, q = first.next;
				while(!q.wert.equals(x)) {
					p = q;
					q = q.next;
				}
				p.next = q.next;
			}
			if(last.wert.equals(x)) {
				last = last.prev;
			}
			
		}
	}
	
	/**
	 * Entfernt das erste Element aus der Liste
	 * */
	public void delete() {
		if(!isEmpty()) {
			delete(firstElement());
		}
	}
		
	public String toString() {
		return(isEmpty() ? " Liste isEmpty " : first.toString());
	}
}

Danke euch für eure Mühen!

Gruß!
 

Leroy42

Top Contributor
Sieht gut aus!

Aber ich würde
Code:
class Listenelement {
static machen, da dessen Instanzen ja keine
Instanz der Klasse List benötigen

Code:
static class Listenelement {
 
S

SlaterB

Gast
> Liegt das vielleicht an der toString() Methode oder is das ein Zeichen das die doppelt Verkettung doch noch nich so ganz ok ist?

liegt an toString, denn darin werden nur die Nachfolger ausgegeben, nicht die Vorgänger

liegt das bei nur einer einfachen Zeile Code nicht auf der Hand?
 
G

Guest

Gast
Danke für eure Hilfe!

Wie könnte denn eine toString aussehen, die mir die ganzen Vorgänger ausgibt?
 

mobile

Bekanntes Mitglied
Habe mir jetzt mal diese Methode geschrieben. Gibt Daten, Vorgänger und Nachfolger aus. Funktioniert auch alles richtig.

Code:
/**
	 * Gibt ein bestimmtes Object mit Zusatz aus
	 * @param Element x
	 * */
	public void directElement(Element x){
		Listenelement p = first;
		
		while(p != null) {
			if(p.wert.equals(x)) {
				System.out.println("Daten: " + p.wert);
				System.out.println("Vorgaenger: " + p.prev.wert);
				System.out.println("Nachfolger: " + p.next.wert);
				break;
			}
			p = p.next;
		}
	}

Aber ich glaube mit der Verkettung stimmt doch noch was nicht, und zwar dann nicht, wenn ich delete nutze. DIe Methode macht folgendes. Ich habe füge von e1 - e6 ein. ALso eine lIste mit 6 Elemente. Wenn ich jetzt aber das e2 in die Methode gebe, müsste ich ja e1 als Vorgänger und e3 als Nachfolger bekommen. Aber ich habe e3 vorher gelöscht, also müsste der Verweis von e2 jetzt auf e4 zeigen, dass tut er aber nicht.
 
S

SlaterB

Gast
zum toString:
schreibe dir Operationen
getDescriptionBack (Ausgabe sich selbst + getDescriptionBack Vorgänger, falls vorhanden)
+
getDescriptionForward (Ausgabe sich selbst + getDescriptionForward Nachfolger, falls vorhanden)

toString ist dann:
getDescriptionBack + getDescriptionForward

--------

Code:
public void delete(Element x){ 
      if(isInList(x)){ 
         length--; 
         if(first.wert.equals(x)) { 
            first = first.next; 
           // prev vom neuen first setzen!
           // last aktualisieren falls Liste nur 1 Element hatte
         } 
         else { 
            Listenelement p = first, q = first.next; 
            while(!q.wert.equals(x)) { 
               p = q; 
               q = q.next; 
            } 
            p.next = q.next; 
            // prev vom neuen first setzen!
            // last aktualisieren falls q last war
         } 
         if(last.wert.equals(x)) { 
            last = last.prev; 
            // ach hier aktualisiert du last, könnte hinhauen ;)
         } 
          
      } 
   }
 

Leroy42

Top Contributor
SlaterB hat gesagt.:
zum toString:
schreibe dir Operationen
getDescriptionBack (Ausgabe sich selbst + getDescriptionBack Vorgänger, falls vorhanden)
+
getDescriptionForward (Ausgabe sich selbst + getDescriptionForward Nachfolger, falls vorhanden)

SlaterB hat gesagt.:
toString ist dann:
getDescriptionBack + getDescriptionForward

Das wird dann aber mal 'ne hübsche Endlos-Rekursion! :D

Edit: Gnu ==> Gnu is not unix.
 
S

SlaterB

Gast
nun ja, das wollte ich ja gerade vermeiden, deswegen ja so kompliziert..

'Ausgabe sich selbst' ist natürlich gerade nicht toString sondern 'Knoten: Wert'
 

mobile

Bekanntes Mitglied
also die beiden Methoden zum Löschen mit den Verweisen sehen jetzt so aus, funktioniert auch alles korrekt glaub ich.

Code:
/**
	 * Entfernt ausgewähltes Element
	 * @param Element x
	 * */
	public void delete(Element x){
		if(isInList(x)){
			length--;
			if(first.wert.equals(x)) {
				first = first.next;
			}
			else {
				Listenelement p = first;
				
				while(p != null) {
					if(p.wert.equals(x)) {
						if(p.next == null) {
							p = p.prev;
							last = p;
							p.next = null;
							break;
						}	
						else {
							p.prev.next = p.next;
							p = p.prev;
							break;
						}
					}
					p = p.next;
				}
			}
			if(last.wert.equals(x)) {
				last = last.prev;
			}
			
		}
	}
und
Code:
/**
	 * Entfernt das erste Element aus der Liste
	 * */
	public void delete() {
		if(!isEmpty()) {
			Listenelement p = first;
			p.next = p.next.next;
			p.prev = p;
		}
	}

aber das problem von vorhin habe ich immer noch. zeige auf ein Element e2 was beim einfügen aus der Test klasse zwar e2 heißt, aber wenn ich in der Liste lösche verschieben sich die Elemente doch oder?
 

mobile

Bekanntes Mitglied
genauer gesagt in dieser Methode hie geht noch was nich, obwohl sie richtig arbeitet.

Code:
/**
	 * Gibt ein bestimmtes Object mit Zusatz aus
	 * @param Element x
	 * */
	public void directElement(Element x){
		Listenelement p = first;
		
		while(p != null) {
			if(p.wert.equals(x)) {
				System.out.println("Daten: " + p.wert);
				System.out.println("Vorgaenger: " + p.prev.wert);
				System.out.println("Nachfolger: " + p.next.wert);
				break;
			}
			p = p.next;
		}
	}

Wie schon gesagt, angenommen ich habe das element e3 , also wäre vorgänger ja e2 nachfolger e4. was ist jetz aber wenn e2 schon gelöscht ist. dann muss ja der vorgänger e1 sein.

Einfügen tue ich aus der Test Klasse zwar so:

Code:
Element e1 = new Element("Herr"),
				e2 = new Element("Max"),
				e3 = new Element("Mustermann"),
				e4 = new Element("Musterweg 45"),
				e5 = new Element("45632 Musterstadt"),
				e6 = new Element("06589/34567");


l1.append(e2);
l1.append(e3);	
l1.insert(e1);
l1.append(e4);	
l1.append(e5);	
l1.append(e6);

oder liegt das einfach nur daran das die delete methoden nicht richtig löschen sondern nur die Verweise ändern?
 
S

SlaterB

Gast
glauben ist gut, testen ist besser,
bist du langsam nicht mal in der Lage selber Daten auszugeben?
prev und next von bestimmten Elementen vor dem Löschen/ während des Löschens und nach dem Löschen genau zu beobachten und daraus Schlüsse zu ziehen?

das ist eine wesentliche Fähigkeit zum Programmieren,
du kannst doch nicht bei jedem Fehler zu einem Forum rennen

'ich weiß nicht' ist keine zielführende Einstellung,
das ganze Programm liegt vor dir, du kannst jeden einzelnen Schritt beliebig genau beobachten, eine reine Fleißarbeit..

-----

Code:
while(p != null) { 
               if(p.wert.equals(x)) { 
                  if(p.next == null) { 
                     p = p.prev; 
                     last = p; 
                     p.next = null; 
                     break; 
                     // p.prev.next aktualisieren!! 
                     // bzw. p.next vom neuen p
                  }    
                  else { 
                     p.prev.next = p.next; 
                     p = p.prev; 
                     break; 
                     // p.next.prev aktualisieren!! 
                     // bzw. p.prev vom neuen p

                  } 
               } 
               p = p.next; 
            }
 

mobile

Bekanntes Mitglied
ja was meinst du was ic die ganze Zeit gemacht habe bis ich hier die nächste Antwort erstellt habe. Deswegen sage ich ja, das die Lösch Methoden richtig laufen, weil die Ausgabe so war/ist wie sie sein soll. Aber in der been genannten Methode geht es eben noch nicht und ich weiß nicht warum...
 
S

SlaterB

Gast
siehe mein Post (Kommentare im Code), löschen geht noch NICHT richtig

meine alten Kommentare a la
// prev vom neuen first setzen!
hast du wohl auch noch nicht umgesetzt?

oder auch:
wenn first = first.next wird,
dann muss first.next.next.prev auf das neue first zeigen

usw.
 
G

Guest

Gast
also ich hatte das schon alles gemacht, aber eben falsch :)

Jetzt geht es aufjeden Fall. Danke für eure Hilfe!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Listen richtig implementieren Java Basics - Anfänger-Themen 3
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
J Implementierung Listen-ADT Java Basics - Anfänger-Themen 131
I Alle Elemente von zwei Listen vergleichen Java Basics - Anfänger-Themen 1
L Skip Listen Java Basics - Anfänger-Themen 5
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
L Wie testet man (selbstgeschriebene) Listen sinnvoll? Java Basics - Anfänger-Themen 2
F Problem mit Listen Java Basics - Anfänger-Themen 5
J Listen Operationen Java Basics - Anfänger-Themen 4
O Unterschied Arrays, Listen, Mengen Java Basics - Anfänger-Themen 24
J Eine Liste von Listen erstellen Java Basics - Anfänger-Themen 11
A Sortierte Listen Java Basics - Anfänger-Themen 4
L Datenstrukturen/ Listen Java Basics - Anfänger-Themen 17
A Was könnten typische Prüfungsaufgaben zum Thema lineare, verkettete Listen sein? Java Basics - Anfänger-Themen 5
L Listen und Felder Java Basics - Anfänger-Themen 2
M Fragen zum Anlegen und Benutzen von Listen Java Basics - Anfänger-Themen 9
R Arrays und Listen Java Basics - Anfänger-Themen 1
F Multidimensionale Listen Java Basics - Anfänger-Themen 3
F Wie String in unterschiedliche Listen teilen Java Basics - Anfänger-Themen 7
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
T Objekte in Listen vererben Java Basics - Anfänger-Themen 3
A Klassen Klassen und Listen... Java Basics - Anfänger-Themen 5
Hacer Operationen einfach verketteter Listen Java Basics - Anfänger-Themen 22
S Methoden Vergleichen von zwei Listen in der Geschwindigkeit von O(n+m) Java Basics - Anfänger-Themen 32
P Listen sortieren mit Binärbaum gibt keine Ausgabe ab 10000 Integern Java Basics - Anfänger-Themen 14
C Listen Java Basics - Anfänger-Themen 3
C Zwei Listen verbinden Java Basics - Anfänger-Themen 1
C Zahlen merken mit Hilfe von Arrays/Listen Java Basics - Anfänger-Themen 2
E Feld von verketteten Listen Java Basics - Anfänger-Themen 11
T Überprüfung einer Aufgabe zu verketteten Listen Java Basics - Anfänger-Themen 5
S Liste mit Objekten und Listen Java Basics - Anfänger-Themen 9
JarJarBigs Frage zu Listen Java Basics - Anfänger-Themen 2
N verkettete Listen Java Basics - Anfänger-Themen 4
O Listen sort-Methode Java Basics - Anfänger-Themen 1
I Listen sortieren bei mehreren Listen zu einer Java Basics - Anfänger-Themen 2
L Lineare Listen Java Basics - Anfänger-Themen 2
S Listen Objekte nach LocalDateTime sortieren Java Basics - Anfänger-Themen 2
D Methoden Listen generieren Java Basics - Anfänger-Themen 4
A Sichtbarkeit in Methoden/Listen Java Basics - Anfänger-Themen 3
M verkettete Listen Java Basics - Anfänger-Themen 1
D Klausur Vorbereitung: Listen, Rekursion, Bäume & Vererbung Java Basics - Anfänger-Themen 3
S Vergleich von Listen Java Basics - Anfänger-Themen 6
I Zwei Listen vergleichen Java Basics - Anfänger-Themen 2
M Listen erstellen mit unterschiedlichen Reihenfolgen Java Basics - Anfänger-Themen 3
I Zwei Listen vergleichen bei n:m Beziehung Java Basics - Anfänger-Themen 2
I Zwei Listen: Wenn nicht vorhanden löschen Java Basics - Anfänger-Themen 4
I Prüfen von zwei Listen Java Basics - Anfänger-Themen 1
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
L Best Practice Alle Kombinationen aus Listenelementen, Anzahl Listen unterschiedlich Java Basics - Anfänger-Themen 6
llabusch Verkette Listen - Einfach und Doppelt Java Basics - Anfänger-Themen 3
S Unsortierte Listen - Frage zur "Verkettung" Java Basics - Anfänger-Themen 1
I Zwei Listen vergleichen Java Basics - Anfänger-Themen 7
I Listen, for - Schleifen Java Basics - Anfänger-Themen 8
P Listen Size stimmt nicht Java Basics - Anfänger-Themen 5
O Objekt Listen serialisierung und deserialisieren Java Basics - Anfänger-Themen 5
L Collections Objekte in Listen speichern Java Basics - Anfänger-Themen 3
G 2 Listen kombinieren und nach abc sortieren Java Basics - Anfänger-Themen 9
D Annonyme Innere Klasse: Listen mit geradem Index ausgeben Java Basics - Anfänger-Themen 6
G Listen sortieren Java Basics - Anfänger-Themen 3
G Generic und Listen Java Basics - Anfänger-Themen 8
R SQL ähnlicher Filter für Java Listen Java Basics - Anfänger-Themen 2
Y Collections 4 Listen Java Basics - Anfänger-Themen 14
S OOP/ Listen...etc... Java Basics - Anfänger-Themen 14
E Listen Java Basics - Anfänger-Themen 2
V Methoden Verkettete Listen Index eines Elementes ausgeben Java Basics - Anfänger-Themen 10
B Listen Java Basics - Anfänger-Themen 3
B eigene klasse in listen eintragen Java Basics - Anfänger-Themen 6
B Map per Listen Java Basics - Anfänger-Themen 2
S Erfahrungswerte von schnelles durchlaufen von Listen mit 2 Werten Java Basics - Anfänger-Themen 10
Joew0815 Problem mit Listen: add() Java Basics - Anfänger-Themen 11
P Zeichenorientierte & Serialisierte Datenverarbeitung Listen Java Basics - Anfänger-Themen 8
E Listen und Generics Java Basics - Anfänger-Themen 9
L dynamisches erzeugen von array Listen Java Basics - Anfänger-Themen 7
E Listen und Duplikate Java Basics - Anfänger-Themen 2
R Hilfe bei Listen Java Basics - Anfänger-Themen 10
F Collections Liste von Listen Java Basics - Anfänger-Themen 21
A Methoden Anfängerfrage: 2 Listen Vergleichen Java Basics - Anfänger-Themen 7
walker23m C++ Listen iteratoren in Java umwandeln Java Basics - Anfänger-Themen 3
X Listen und verschiedene Methoden Java Basics - Anfänger-Themen 6
N Listen Java Basics - Anfänger-Themen 5
S Listen Klasse selbst schreiben Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben