Lineare Listen: sortiertes Einfügen

tar

Mitglied
Hallo Freunde,

bin neu hier - und habe ein kleines Problemchen beim sortierten Einfügen mit linearen Listen.

Es liegt bspw. folgende Quellliste vor, die sortiert eingelesen werden soll:

3; susanne
5; bernd
1; hermann
4; klaus
2; fritz

Beim Einlesen prüft er nach Schlüssel (ob schon vorhanden) und an welcher Stelle er einfügen soll (Sortierung nach Schlüssel).

Ergebnis soll wie folgt aussehen:

1; hermann
2; fritz
3; susanne
4; klaus
5; bernd

Ergebnis sieht aber nach 1. Sortierung folgendermaßen aus:

1; hermann
3; susanne
4; klaus
5; bernd
2; fritz

Nach 2. Sortierung:

1; hermann
2; fritz
4; klaus
5; bernd
3; susanne

Nach 3. Sortierung wieder wie bei 1. Sortierung, usw.

Selbst eine Methode, die das letzte Element nach dem Kopfelement (head, also 1. Element) einfügen soll, funktioniert nicht. Ich weiß echt keinen Rat mehr.

Hier mal der Einfüge-Code, an dem es hängt (sonst funktioniert eigentlich alles)
Aufruf mit insert(lev);
lev = der Datentyp mit int key und String titel (Getter & Setter vorhanden):

Java:
	public void insert(LV lev) {
		ListEntry e = new ListEntry(lev);
		if (e == null) {
			return;
		}
		if (head == null) {
	        head = e;
	    }
	    else if (head.getLV().getKey()==e.getLV().getKey()) {
			System.out.println("Schlüssel existiert bereits.");
			System.out.println(" => Einfügen fehlgeschlagen!");
			return;
	    }
	    else if (head.getLV().getKey()>e.getLV().getKey()) {
	    	e.setNext(head);
	    	head = e;
	    }
	    else
	        insertRec(head, e);
	}

	public void insertRec(ListEntry head, ListEntry e) {
		ListEntry b = head.getNext();
		if (b == null) {
			head.setNext(e);
		}
		else if (b.getLV().getKey()==e.getLV().getKey()) {
			System.out.println("Schlüssel existiert bereits.");
			System.out.println(" => Einfügen fehlgeschlagen!");
		}
		else if (b.getLV().getKey()<e.getLV().getKey() && b.getNext()!=null) {
			insertRec(head.getNext(), e);
		}
		else {
			e.setNext(b);
			head.setNext(e);
		}
	}

Hier noch der Code, womit ich das nachträglich reparieren wollte (funktioniert nicht, Aufruf mit trick17(head); ):

Java:
	public void trick17(ListEntry e) {
		if (e==null || head.getNext().getNext()==e || head.getNext()==null || head.getNext().getNext()==null) {
			return;
		}
		else if (e.getNext()==null) {
			e.setNext(head.getNext().getNext());
			head.getNext().setNext(e);
		}
		else
			trick17(e.getNext());
	}

Danke und Gruß!
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
wieso hat die insert()-Methode etwas mit fehlerhafter Sortierung zu tun,
oder sortierst du gar nicht extra sondern alles soll gleich richtig eingefügt werden?

verstehst du denn was deine insert-Methode macht, hast du das auch alles im laufenden Programm überprüft?
es ist doch sehr leicht, Ausgaben einzubauen a la
'starte Insert für Element .., vorheriger Stand der Liste: .................'
'vergleiche mit Head ..'
'bin nun bei Listenelement .., vergleiche wieder, Ergebnis des Tests = ..'
'Endergebnis: Element wurde eingefügt zwischen .. und .., eben weil ..'
'neue Liste = ...........................'

das Programm kann dir genau sagen was es tut und auf jedes Fehlverhalten kannst du die Regeln ändern
 

tar

Mitglied
oder sortierst du gar nicht extra sondern alles soll gleich richtig eingefügt werden?
exakt!

Ich habe auch noch eine Extra-Sortiermethode, die die vorhandene Liste in ein Array knallt, dort das kleinste Element (nach Sortierkriterium) rausholt, den bisherigen head = null setzt und dann das kleinste Element zuerst sortiert einfügt und die restlichen Elemente in dem Array danach sortiert einfügt (hier eben insert nach key, habe auch noch insert nach title - dabei genau das identische Problem wie beim Einfügen nach Key).

Hier nochmal der komplette Aufbau, wenn es was nützt:

Java:
import java.io.*;
import java.util.StringTokenizer;

public class Ha2LinList {
	private Ha2ListEntry head;
	static final String file = "ha2.txt";
	int ha2anz;
	Ha2ListEntry[] feld;

	public Ha2LinList() {
		head = null;
		ha2anz = 0;
	}

//... load()
//... save()

	public void insert(Ha2LV lv) {
		Ha2ListEntry e = new Ha2ListEntry(lv);
		if (e == null) {
			return;
		}
		if (head == null) {
	        head = e;
	        ha2anz++;
	    }
	    else if (head.getLV().getKey()==e.getLV().getKey()) {
			System.out.println("Schlüssel existiert bereits.");
			System.out.println(" => Einfügen fehlgeschlagen!");
			return;
	    }
	    else if (head.getLV().getKey()>e.getLV().getKey()) {
	    	e.setNext(head);
	    	head = e;
	    	ha2anz++;
	    }
	    else
	        insertRec(head, e);
	}

	public void insertRec(Ha2ListEntry head, Ha2ListEntry e) {
		Ha2ListEntry b = head.getNext();
		if (b == null) {
			head.setNext(e);
			ha2anz++;
		}
		else if (b.getLV().getKey()==e.getLV().getKey()) {
			System.out.println("Schlüssel existiert bereits.");
			System.out.println(" => Einfügen fehlgeschlagen!");
		}
		else if (b.getLV().getKey()<e.getLV().getKey() && b.getNext()!=null) {
			insertRec(head.getNext(), e);
		}
		else {
			e.setNext(b);
			head.setNext(e);
			ha2anz++;
		}
	}

	public void insertTitle(Ha2LV lv) {
		Ha2ListEntry e = new Ha2ListEntry(lv);
	    if (head == null) {
	        head = e;
	        ha2anz++;
	    }
	    else if (head.getLV().getTitel().compareTo(e.getLV().getTitel())>0) {
	    	e.setNext(head);
	    	head = e;
	    	ha2anz++;
	    }
	    else
	        insertTitleRec(head, e);
	}

	public void insertTitleRec(Ha2ListEntry head, Ha2ListEntry e) {
		Ha2ListEntry b = head.getNext();
		if (b == null) {
			head.setNext(e);
			ha2anz++;
		}
		else if (b.getLV().getTitel().compareTo(e.getLV().getTitel())<0 && b.getNext()!=null) {
			insertTitleRec(head.getNext(), e);
		}
		else {
			e.setNext(b);
			head.setNext(e);
			ha2anz++;
		}
	}

	public void trick17(Ha2ListEntry e) {
		if (e==null || head.getNext().getNext()==e || head.getNext()==null || head.getNext().getNext()==null) {
			return;
		}
		else if (e.getNext()==null) {
			e.setNext(head.getNext().getNext());
			head.getNext().setNext(e);
		}
		else
			trick17(e.getNext());
	}
// ...
  	public void fillFeld(Ha2ListEntry[] feld) {
		int i;
		Ha2ListEntry tmp = head;
		for (i=0; i<ha2anz; i++) {
			feld[i] = tmp;
			tmp = tmp.getNext();
		}
	}

	public void sortKey() {
		if (ha2anz<=1) {
			return;
		}
		else {
			feld = new Ha2ListEntry[ha2anz];
			fillFeld(feld);
			sortFeldKey(feld);
			trick17(head);
		}
	}

	public void sortFeldKey(Ha2ListEntry[] feld) {
		// finde kleinstes Element und lösche es aus dem feld
		Ha2ListEntry k = feld[0];
		int cnt = ha2anz;
		int pos = 0;
		int i;
		for (i=1;i<cnt;i++) {
			if (k.getLV().getKey()>feld[i].getLV().getKey()) {
				k=feld[i];
				pos=i;
			}
		}
		head = null;
        ha2anz = 0;
		insert(feld[pos].lv);
		head.setNext(null);
		feld[pos]=null;
		// erzeuge neue sortierte liste
		for (i=0;i<cnt;i++) {
			if (feld[i]!=null) {
				insert(feld[i].lv);
			}
		}
	}

	public void sortTitle() {
		if (ha2anz<=1) {
			return;
		}
		else {
			feld = new Ha2ListEntry[ha2anz];
			fillFeld(feld);
			sortFeldTitle(feld);
		}
	}

	public void sortFeldTitle(Ha2ListEntry[] feld) {
		// finde kleinstes Element und lösche es aus dem feld
		Ha2ListEntry k = feld[0];
		int cnt = ha2anz;
		int pos = 0;
		int i;
		for (i=1;i<cnt;i++) {
			if (k.getLV().getTitel().compareTo(feld[i].getLV().getTitel())>0) {
				k=feld[i];
				pos=i;
			}
		}
		head = null;
        ha2anz = 0;
		insertTitle(feld[pos].lv);
		head.setNext(null);
		feld[pos]=null;
		// erzeuge neue sortierte liste
		for (i=0;i<cnt;i++) {
			if (feld[i]!=null) {
				insertTitle(feld[i].lv);
			}
		}
	}
// ...

verstehst du denn was deine insert-Methode macht, hast du das auch alles im laufenden Programm überprüft?

Ja, habe sie ja selbst geschrieben. Ich verstehe nur nicht, wieso sie nicht das macht, was ich will, wenn alles nach Schema-F drin steht.

Ich habe absolut keine Ahnung, wie ich hier den Fehler selbst aufspüren soll.

Einzelne Befehle überprüfen kann ich bei rekursiven Methoden wohl schlecht und die IF-Anfragen sind mMn absolut logisch.

Das ganze Ding verwirrt mich einfach nur noch. :roll:

Gruß!
 

tar

Mitglied
Die Idee ist eigentlich folgende:

Ich lese Datensätze über eine Datei ein (oder einzeln per Eingabe) - beides funktioniert.

Dann sollte er sie eigentlich schon gleich nach Key sortiert in die Liste knallen - funktioniert nicht.

Also füge ich diese Datensätze erstmal stupide nacheinander ein (append) - funktioniert.

Um eine Sortierung hinzukriegen, kopiere ich die vorhandene Reihenfolge in ein Array (sort...feld), suche dort nach Kriterium (key oder titel) das kleinste Element (k). Ich setze den bisherigen head = null (zerstöre also damit die vorhandene Liste) und füge dann einfach alle Elemente mit insert-Methode (key oder titel) ein, beginnend mit k (kleinstem element).

Das Suchen nach kleinstem könnte man sich evtl sogar sparen, ist aber nun drin...

Und genau das geht halt nicht perfekt.

Gruß!
 
S

SlaterB

Gast
> Einzelne Befehle überprüfen kann ich bei rekursiven Methoden wohl schlecht

klar, das log wird dann 100 Zeilen lang, aber das macht nix,
je kürzer die verwendeten Beispiele, desto übersichtlicher, deins ist schon gut wenn da bereits der Fehler auftritt
(und nicht erst beim 400. Insert ;) )

> Das ganze Ding verwirrt mich einfach nur noch.

eben, dem abhelfen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Lineare listen verkettung Java Basics - Anfänger-Themen 7
A Was könnten typische Prüfungsaufgaben zum Thema lineare, verkettete Listen sein? Java Basics - Anfänger-Themen 5
L Lineare Listen Java Basics - Anfänger-Themen 2
Chucky Lineare Listen Programm Verständnisproblem Java Basics - Anfänger-Themen 38
NoP-ay Lineare Rekurison gibAnzahl Java Basics - Anfänger-Themen 6
amelie123456 Lineare Suche / Binäre Suche Java Basics - Anfänger-Themen 2
V_Fynn03 Beliebiges Element in einer Liste löschen (Java)(Lineare Datenstrukturen) Java Basics - Anfänger-Themen 9
V_Fynn03 Lineare Datenstrukturen Element löschen? Java Basics - Anfänger-Themen 2
S Java Lineare-Suche Zeitmessung Java Basics - Anfänger-Themen 5
S Java Lineare Suche Java Basics - Anfänger-Themen 1
B lineare und schlichte Rekursion Java Basics - Anfänger-Themen 1
A Lineare Rekursion Java Basics - Anfänger-Themen 6
R Klassen Die lineare Datenstruktur Queue Java Basics - Anfänger-Themen 3
N Array, lineare Suche, binäre Suche, Programm bleibt unerwartet stehen... Java Basics - Anfänger-Themen 6
L Einfache Lineare Suche Java Basics - Anfänger-Themen 7
S Lineare Gleichung lösen Java Basics - Anfänger-Themen 1
S Datentypen nicht lineare STATISCHE Datenstruktur? Java Basics - Anfänger-Themen 10
B lineare Gleichung programmieren Java Basics - Anfänger-Themen 2
P Lineare Suche im Array Java Basics - Anfänger-Themen 5
C Lineare Rekursion -> iterative Schleife Java Basics - Anfänger-Themen 3
B Lineare Suche Java Basics - Anfänger-Themen 5
B endrekursion und lineare rekursion Java Basics - Anfänger-Themen 4
U Lineare Suche in einem Array Java Basics - Anfänger-Themen 3
I Lineare Gleichungssysteme lösen -> Problem Java Basics - Anfänger-Themen 3
M lineare Suche Java Basics - Anfänger-Themen 12
G verkettete lineare Liste Java Basics - Anfänger-Themen 2
D Lineare Kongruenz Java Basics - Anfänger-Themen 4
B Warum hat dieser einfache Algorithmus lineare Laufzeit? Java Basics - Anfänger-Themen 3
G Array - lineare Liste Java Basics - Anfänger-Themen 2
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 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
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
R Listen richtig implementieren Java Basics - Anfänger-Themen 3
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
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

Ähnliche Java Themen

Neue Themen


Oben