Hallo.
Ich schreibe derzeit ein Programm, das mit Hilfe einer verketteten Liste Integer-Werte speichert.
Dazu habe ich schon verschiedene Methoden geschrieben, die Elemente (am Anfang, am Ende und mittendrin) erzeugen, prüfen ob die Liste sortiert ist usw. Nun bin ich aber beim Problem Löschen angekommen. Dazu will ich eine Methode schreiben, die ein Listenelement an einer beliebigen Stelle löscht. Dazu wird in der Konsole dann der gewünschte Wert eines der Listenelemente eingegeben. Bisher habe ich es geschafft, dass das erste und letzte Element gelöscht werden kann. Nun stehe ich aber vor dem Problem, dass ich kein Element aus der Mitte löschen kann.
Ich habe zu diesem Problem natürlich schon google befragt und hier die Suchfunktion genutzt. Entweder fand ich nichts oder es war sehr unverständlich für mich.
Hier der gesamte Code (Die Problematische Stelle befindet sich in der Methode «entfernteElement(int i)»):
Mit der while-Schleife soll das wünschte Element gefunden werden und der Code darunter soll es letztlich löschen. Nur tut er es leider nicht. Ich persönlich glaube, dass es an der while-Schleife, also am Finden des Elements scheitert.
Bei weiteren Fragen, fragt. Ich hoffe ihr könnt mir helfen.
Gruss,
Stefan.
Ich schreibe derzeit ein Programm, das mit Hilfe einer verketteten Liste Integer-Werte speichert.
Dazu habe ich schon verschiedene Methoden geschrieben, die Elemente (am Anfang, am Ende und mittendrin) erzeugen, prüfen ob die Liste sortiert ist usw. Nun bin ich aber beim Problem Löschen angekommen. Dazu will ich eine Methode schreiben, die ein Listenelement an einer beliebigen Stelle löscht. Dazu wird in der Konsole dann der gewünschte Wert eines der Listenelemente eingegeben. Bisher habe ich es geschafft, dass das erste und letzte Element gelöscht werden kann. Nun stehe ich aber vor dem Problem, dass ich kein Element aus der Mitte löschen kann.
Ich habe zu diesem Problem natürlich schon google befragt und hier die Suchfunktion genutzt. Entweder fand ich nichts oder es war sehr unverständlich für mich.
Hier der gesamte Code (Die Problematische Stelle befindet sich in der Methode «entfernteElement(int i)»):
Code:
import java.util.Scanner;
public class ListenTest {
static Scanner in = new Scanner(System.in);
public static void main(String[] arg) {
IntListe p = new IntListe();
int op, val_in;
System.out.println("1 - Anfügen am Anfang" +
"\n2 - Anzeigen der Elemente" +
"\n3 - Einfügen eines Elements" +
"\n4 - Entferne letztes Element" +
"\n5 - Prüfe ob sortiert\n");
System.out.print("Auswahl: ");
op = in.nextInt();
System.out.println();
while(op >= 0 && op < 8) {
switch(op) {
case 1:
System.out.print("Wert: ");
val_in = in.nextInt();
p.anfuegenAmAnfang(val_in);
break;
case 2:
p.ListeAnzeigen();
break;
case 3:
System.out.print("Wert: ");
val_in = in.nextInt();
p.einsortieren(val_in);
break;
case 4:
p.entferneLetztes();
break;
case 5:
System.out.println(p.sortiert());
break;
case 6:
System.out.print("Wert: ");
val_in = in.nextInt();
p.anfuegenAmEnde(val_in);
break;
case 7:
System.out.print("Wert: ");
val_in = in.nextInt();
p.entferneElement(val_in);
break;
case 0:
System.exit(0);
} //switch
System.out.print("Auswahl: ");
op = in.nextInt();
System.out.println();
} //while
} //main
} //class ListenTest
class Knoten {
int k; // Wert im Knoten (Informationsteil)
Knoten next; // Adresse des nächsten Knoten in der Liste (Organisationsteil)
Knoten(int i, Knoten nex) { // Konstruktor
k = i;
next = nex;
}
}
//-----------------------------------------------------------------
class IntListe {
Knoten anker; // erster Knoten in der Liste
IntListe() { // Konstruktor
anker = null;
} //IntListe
/** Methode fügt an den Anfang der Liste ein neues Element ein */
void anfuegenAmAnfang(int zahl) {
Knoten p = new Knoten(zahl, anker);
anker = p;
} // anfuegenAmAnfang
/** Methode zeigt alle Elemente der Liste im DOS-Fenster an */
void ListeAnzeigen() {
if(isEmpty()) {
System.out.println("Liste ist leer");
return;
} //if
Knoten p;
p = anker;
while (p != null) {
System.out.println(p.k);
p = p.next;
}//while
System.out.println();
} //ListeAnzeigen
/** Methode fügt in eine aufsteigend sortierte Liste die Zahl i an der richtigen Stelle ein,
sodass die neue Liste wieder sortiert ist */
void einsortieren(int zahl) {
Knoten p;
if(isEmpty() ) // Liste war leer
anker = new Knoten(zahl, null);
else {
if(zahl < anker.k) { // neues erstes Element
anker = new Knoten(zahl, anker);
}
else {
p = anker;
while(p.next != null) {
if(zahl < p.next.k) { // einfuegen
p.next = new Knoten(zahl, p.next);
return;
}
p = p.next; // Zeiger auf's nähste Element setzen
} // while
p.next = new Knoten(zahl, null); // anfuegen
} // else
} // else
} // einsortieren
void entferneLetztes() {
if( ! isEmpty() ) {
if(anker.next == null) // Liste hatte nur ein Element
anker = null;
else {
Knoten p;
p = anker;
while(p.next.next != null) p = p.next;
p.next = null;
} // else
} // if
} // entferneLetztes
boolean isEmpty() {
boolean empty_out;
if(anker == null) {
empty_out = true;
} else {
empty_out = false;
} //end if
return empty_out;
} // isEmpty
boolean sortiert() {
boolean sort_out = true;
if(isEmpty()) {
System.out.println("Liste ist leer!");
}//if
Knoten p;
p = anker;
while(p.next != null) {
if(p.k > p.next.k) {
sort_out = false;
}
p = p.next;
} //while
return sort_out;
} //sortiert
void anfuegenAmEnde(int zahl) {
Knoten p;
p = anker;
while(p.next.next != null) {
p = p.next;
} //while
p.next.next = new Knoten(zahl, null);
} //anfuegenAmEnde
void entferneElement(int i) {
Knoten p;
p = anker;
if(i == anker.k) {
p = p.next;
anker = p;
} else if(i != anker.k) {
while(i == p.k) {
p = p.next;
}
Knoten del_node = p.next;
p.next = del_node.next;
del_node.next = null;
}
} //entferneElement
} // class Liste
Mit der while-Schleife soll das wünschte Element gefunden werden und der Code darunter soll es letztlich löschen. Nur tut er es leider nicht. Ich persönlich glaube, dass es an der while-Schleife, also am Finden des Elements scheitert.
Bei weiteren Fragen, fragt. Ich hoffe ihr könnt mir helfen.
Gruss,
Stefan.