# Verkettete Liste - Element löschen



## DasDogma (14. Jan 2009)

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)»):


```
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.


----------



## Landei (14. Jan 2009)

aus'm Kopp - ohne Gewähr

```
void entferneElement(int i) {
      if (anker != null) {
         if (anker.k == i) {
            anker = anker.next;
         } else {  
            Knoten p = anker;
            while(p.next != null && p.next.k != i) {
              p = p.next;
            }
            if (p.next != null) {
               p.next = p.next.next;
            }
         } 
      }
   }
```


----------



## DasDogma (14. Jan 2009)

Funktioniert prima!

Ich danke Dir!


----------

