Lineare Listen Programm Verständnisproblem

Status
Nicht offen für weitere Antworten.

Chucky

Aktives Mitglied
Code:
import java.applet.*;
import java.awt.*;
public class Bank extends Applet{
    Spende Spende1, Spende2;
    Element Eins, Hilf;
    public Bank(){
        Spende1=new Spende("Hansi",13,80);
        Spende2=new Spende("Eva",29,50);
        Eins=new Element(Spende1);
        Eins.haengeAn(Spende2);
        Hilf=Eins;
        while(Hilf!=null){
            Hilf.Inhalt.gibAus();
            Hilf=Hilf.naechstes;
        }
    }
public class Element {
    Spende Inhalt;
    Element naechstes;
    public Element(Spende n){
        Inhalt=n;
        naechstes=null;
        }
    public void haengeAn(Spende m){
        if (naechstes!=null)
            naechstes.haengeAn(m);
            else naechstes=new Element(m);
    }
}
 public class Spende {
    String Name;
    int DM, PF;
    public Spende(String Name, int DM, int PF){
        this.Name=Name;
        this.DM=DM;
        this.PF=PF;
    }
    public void gibAus(){
        Label L;
        L=new Label(Name);
        add(L);
        L=new Label(" "+DM);
        add(L);
        L=new Label(" "+PF);
        add(L);
    }
}}

Diesen Code gab uns unser Infolehrer heute.
Würde nur gerne wissen ob ich alles richtig verstanden hab:
Die class Element ist rekursiv da sie beim Konstruktoraufruf ein Objekt von sich selbst deklariert?
Also verweist das AnfagnsElement immer auf ein naechstes und so weiter?
Wofür wird das Hilfselement genau benötigt? Warum kann ich nich einfach mit Element Eins die Liste durchgehen?
Warum können hier mehrere public class in einem File stehen? (geht das bei inneren Klassen? Welchen Sinn macht das public dann?)


Code:
public Bank(){
        Spende1=new Spende("Hansi",13,80);
        Spende2=new Spende("Eva",29,50);
        Eins=new Element(Spende1);
        Eins.haengeAn(Spende2);
        Hilf=Eins;
        while(Hilf!=null){
            Hilf.Inhalt.gibAus();
            Hilf=Hilf.naechstes;
        }
Ist das nicht ein Konstruktor? Warum wird der ohne Aufruf ausgeführt?

Hoffe auf eure Hilfe
Schreib in 2 Wochen Klausur über den ganzen Kram

Mfg BobMarley
 

mic_checker

Top Contributor
BobMarley hat gesagt.:
Code:
public class Element {
    Spende Inhalt;
    Element naechstes;
    public Element(Spende n){
        Inhalt=n;
        naechstes=null;
        }
    public void haengeAn(Spende m){
        if (naechstes!=null)
            naechstes.haengeAn(m);
            else naechstes=new Element(m);
    }
}

Die class Element ist rekursiv da sie beim Konstruktoraufruf ein Objekt von sich selbst deklariert?

Die Klasse ist nicht rekursiv - es gibt rekursive Methoden. Rekursive Methoden sind solche die sich selber wieder aufrufen (bis ein best. Abbruchkriterium erfüllt ist). Dazu gabs in letzter Zeit einige Threads , benutz doch mal die Suchfunktion.

Vielleicht komm ich noch dazu den Rest von deinem Code etc. zu lesen...
 

mic_checker

Top Contributor
Diesen Code gab uns unser Infolehrer heute.
Das ist hoffentlich nicht dein Ernst (?)

Dann sag deinem Info-Lehrer mal das du keine Codes bearbeitest die deutlich von gewissen Konventionen abweichen ;)

Spaß bei Seite, ich finde der Code ist kein gutes Beispiel für guten Programmierstil (zumal er von einem Infolehrer kommt). Z.B. schreibt man die Variablennamen nicht groß.

Zu deinem Problem:

Wo genau hapert es?

Du erzeugst zwei Objekte vom Typ "Spende":
- Spende1
- Spende2.

Dann erzeugst du ein Objekt vom Typ "Element":
- Eins

Dem Konstruktor übergibst du dabei das Objekt vom Typ Spende (Spende1). Was passiert im Konstruktor?

Inhalt wird auf die übergebene Spende gesetzt und naechstes zeigt auf null.

Code:
Eins.haengeAn(Spende2);

Nun will er noch eine weitere Spende anhängen.

Code:
        if (naechstes!=null)
            naechstes.haengeAn(m);
       else 
            naechstes=new Element(m);

naechstes ist noch null, wie eben im Konstruktor zugewiesen, demnach zeigt nun naechstes auf das Element welches
du anhängen willst.

Demnach hast du momentan folgende "Struktur":

Spende 1 -> Spende 2 -> null

Die Hilfsvariable wird benutzt um diese "Liste" durchzugehen.

Code:
        while(Hilf!=null){
            Hilf.Inhalt.gibAus();
            Hilf=Hilf.naechstes;
        }
Anfangs gibt Hilf den Inhalt der Spende von Spende1 aus. Hilf.naechstes "zeigt auf" Spende2.
Somit gibt Hilf beim nächsten Durchlauf den Inhalt von Spende2 aus. Doch jetzt ist naechstes = null, somit ist Hilf == null und die Schleife bricht ab.

Hoffe konnte dir soweit bissl weiterhelfen, das ein oder andere ist (absichtlich) etwas vereinfacht ausgedrückt.

PS. Damit du es besser verstehst solltest du vielleicht weitere Spenden erzeugen und bisschen rumprobieren.
 

Chucky

Aktives Mitglied
Hi,
dank dir hab das Programm jetzt eigentlich soweit verstanden (was wirklich von meinem Infolehrer stammt^^)
Naja desweiteren will er jetzt von mir dass ich spenden selbst eingeben anhaengen und die ganze Liste ausgeben kann...
 

mic_checker

Top Contributor
Hmm...ok...hast du denn damit Probleme?

Wie du Spenden selbst anhängen kannst ist ja mit dem vorgegebenen Code nicht mehr schwer nachzuvollziehen. Einfach neue Objekte vom Typ Spende erzeugen und mit haengeAn(..) aufrufen.

Ansonsten kannst du ja posten wenn du damit Probleme hast.
 

Chucky

Aktives Mitglied
Mein bearbeiteter Code:
Code:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Bank extends Applet implements ActionListener{ 
    TextField eingabefeld = new TextField ("", 8);
    Button fuegen = new Button ("Anhaengen");
    Button zeigen = new Button ("Anzeigen");
    Spende Spendenanfang;
    String namenseingabe;
    Element Eins, Hilf;
    public class Spende{
    	String name;
    	int euro,cent;
    	public Spende(String name, int euro, int cent){
    		this.name=name;
            this.euro=euro;
            this.cent=cent;
            }
        public void gibaus(){
        	Label l;
        	l=new Label(name);
        	add (l);
        	l=new Label(" "+euro);
        	add (l);
        	l=new Label(" "+cent);
        	add (l);
            } 
         }
    public class Element{
        Spende Inhalt;
        Element naechstes;
        public Element(Spende Inhalt){
            this.Inhalt=Inhalt;
            this.naechstes=null;
        	}
        public void haengeAn(Spende m){
            if (naechstes != null){
            	naechstes.haengeAn(m);
            	}
            else{
            	naechstes=new Element(m);
            	}
        	}
    	}
    public Bank(){
        add(eingabefeld);
        add(fuegen);
        add(zeigen);
        fuegen.addActionListener(this);
        zeigen.addActionListener(this);
        Spendenanfang = new Spende ("Nobody", 70, 50);
        Eins = new Element(Spendenanfang);
        Hilf = Eins;
    	}
     public void actionPerformed(ActionEvent e){
        if (e.getSource()==fuegen){
        	namenseingabe=eingabefeld.getText();
            Spende Spendenext = new Spende(namenseingabe,80,60);
            Hilf.haengeAn(Spendenext);
            }
        if (e.getSource()==zeigen){
        	while(Hilf != null){
        		Hilf.Inhalt.gibaus();
        		Hilf=Hilf.naechstes;
        		}
        	}
        }
 	}
Aber klappen tut der Leider überhaupt nich :(

Bitte helfen was ich falsch gemacht habe *gg*

Mfg Bob
 

Chucky

Aktives Mitglied
Ist doch oben auch so... nennt sich das dann nich innere Klasse? Man kann doch keine 2 public classes in einem file speichern oder?

Mfg Bob (aber sagt mir lieber mal warums nicht funzt^^)
 

Chucky

Aktives Mitglied
naja ich kann das programm zwar ausführen aber ich glaube weder spenden
anhängen noch ausgeben klappen... das Textfield und die Buttons werden angezeigt

Mfg Bob
 

Wildcard

Top Contributor
Also ganz ehrlich! Der Quellcode ist furchtbar! Ich schau mal woran's liegt, aber so würd ich das niemandem zeigen :wink:
[edit]du sagst der Code ganz oben ist von euerm Infolehrer??? Nicht nur hässlich! nicht mal korrekt! :autsch: [/edit]
 

Chucky

Aktives Mitglied
ganz ehrlich? der stammt auch von meinem lehrer halt nurn bissl von mir verändert^^
könntes du ihn mal versuchen zu verändern oder mir tipps zu geben wie ich das prob lösen kann....
Weil mein infolehrer kanns auchnet wirklich^^

Mfg Bob

[edit]Ja dann sag mir mal bitte bei deinem nächsten Post wie ich den umschreiben muss und was falsch ist ich lerne ja noch... nur leider mit einem schlechten Lehrer[/edit]
 

Wildcard

Top Contributor
BobaMarley hat gesagt.:
Ja dann sag mir mal bitte bei deinem nächsten Post wie ich den umschreiben muss und was falsch ist ich lerne ja noch... nur leider mit einem schlechten Lehrer
Naja, es ist ja nicht so das es nicht funktioniert. Er hält sich einfach nicht an die gängigen Konventionen und ich hab echt meine Probleme damit überhaupt zu verstehen was das ist :D
Das soll also ein Beispiel für eine 'lineare Liste' sein? Ich schließe mal daraus das es nicht Sinn der Übung ist jetzt mit einer ArrayList oder einem Vector zu kommen?
Ich denke mal ihr werdet das System so in etwa beibehalten müssen, aber es ist sehr ungewöhnlich das irgendwelche
inneren Klassen ungefragt komponenten auf ein Applet legen :?
 

Wildcard

Top Contributor
Code:
        public void gibaus(){ 
           Label l; 
           l=new Label(name); 
           add (l); 
           l=new Label(" "+euro); 
           add (l); 
           l=new Label(" "+cent); 
           add (l); 
           validate();
            }
Wenn du das so wolltest hat dir nur das validate() gefehlt. Aber wolltest du das so... ???:L
 

mic_checker

Top Contributor
Jo, ich find der Code ist ein Witz, zumal er von nem Info-Lehrer kommt, aber das hab ich ja oben schon geschrieben.

BobMarley: Wo ist das Problem . Siehe Code oben:

Code:
    public Bank(){
        Spende1=new Spende("Hansi",13,80);
        Spende2=new Spende("Eva",29,50);
        Eins=new Element(Spende1);
        Eins.haengeAn(Spende2);
        Hilf=Eins;
        while(Hilf!=null){
            Hilf.Inhalt.gibAus();
            Hilf=Hilf.naechstes;
        }
    }

Wenn du neue Spenden anhängen willst, so musst du neue Objekte vom Typ Spende erzeugen und anschließend haengeAn aufrufen....

Code:
....
spende3=new Spende("Dieter",24,50);
spende4=new Spende("Hans",22,50);
....
Eins.haengeAn(spende3);
Eins.haengeAn(spende4);
...

So gehts prinzipiell.....
 

Chucky

Aktives Mitglied
Ja hab ich doch gemacht sieh dir doch den Code mit dem ActionListener an
Nur es funktioniert leider nicht!^^ was stimmt denn da nich?
Sobald ich den Namen ins Textfeld eingegeben habe und auf Anhaengen klicke hängt das Programm

Mfg Bob
 

Wildcard

Top Contributor
BobMarley hat gesagt.:
Ja hab ich doch gemacht sieh dir doch den Code mit dem ActionListener an
Nur es funktioniert leider nicht!^^ was stimmt denn da nich?

Mfg Bob
Siehe Post weiter oben:
wenn du validate dazu machst funktioniert das 'theoretisch' :D
 

Chucky

Aktives Mitglied
aber warum habe ich das nicht vorher gebraucht als ich die spenden direkt in den code geschrieben habe
da stands doch auch ohne validate....?

Mfg Bob
 

Chucky

Aktives Mitglied
Ok hab ich also auch alles verstanden

Mein Hauptproblem ist dass ich darüber morgen Klausur schreibe.
Und mein Lehrer hat schon Andeutungen gemacht dass ich Methoden zum löschen und alphabetischen einfügen
schreiben muss(ich denke für letzteres muss ich einfach die haengean-methode umschreiben?)
alleine krieg ich das nich hin... Könnt ihr mir nochmal helfen? Wäre echt wichtig sons versemmel ich das morgen :(

Also bisher siehst ja so aus(sry ich weiss dasses schlimm is^^):

Code:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Bank extends Applet implements ActionListener{
    TextField einfgabefeldname = new TextField ("", 8);
    TextField einfgabefeldeuro = new TextField ("", 4);
    TextField einfgabefeldcent = new TextField ("", 4);
    Button fuegen = new Button ("Anhaengen");
    Button zeigen = new Button ("Anzeigen");
    Spende Spendenanfang;
    String namenseingabe;
    int euroeingabe, centeingabe;
    static int x;
    Element Eins, Hilf;
    public class Spende{
    	String name;
    	int euro,cent;
    	public Spende(String name, int euro, int cent){
    		this.name=name;
            this.euro=euro;
            this.cent=cent;
            }
        public void gibaus(){
        	Bank.x+=50;
        	setLayout(null);
        	Label l;
        	l=new Label(name);
        	l.setBounds(50,Bank.x,50,50);
        	add (l);
        	l=new Label(" "+euro);
        	l.setBounds(200,Bank.x,50,50);
        	add (l);
        	l=new Label(" "+cent);
        	l.setBounds(250,Bank.x,50,50);
        	add (l);
        	validate();
            } 
         }
    public class Element{
        Spende Inhalt;
        Element naechstes;
        public Element(Spende Inhalt){
            this.Inhalt=Inhalt;
            this.naechstes=null;
        	}
        public void haengeAn(Spende m){
            if (naechstes != null){
            	naechstes.haengeAn(m);
            	}
            else{
            	naechstes=new Element(m);
            	}
        	}
    	}
    public Bank(){
        add(einfgabefeldname);
        add(einfgabefeldeuro);
        add(einfgabefeldcent);
        add(fuegen);
        add(zeigen);
        fuegen.addActionListener(this);
        zeigen.addActionListener(this);
        Spendenanfang = new Spende ("Nobody", 0, 0);
        Eins = new Element(Spendenanfang);
        Hilf = Eins;
    	}
     public void actionPerformed(ActionEvent e){
        if (e.getSource()==fuegen){
        	namenseingabe=einfgabefeldname.getText();
        	euroeingabe=Integer.parseInt(einfgabefeldeuro.getText());
        	centeingabe=Integer.parseInt(einfgabefeldcent.getText());
            Spende Spendenext = new Spende(namenseingabe,euroeingabe,centeingabe);
            Eins.haengeAn(Spendenext);
            }
        if (e.getSource()==zeigen){
        	while(Hilf != null){
        		Hilf.Inhalt.gibaus();
        		Hilf=Hilf.naechstes;
        		}
        	}
        }
 	}
 

mic_checker

Top Contributor
BobMarley hat gesagt.:
Und mein Lehrer hat schon Andeutungen gemacht dass ich Methoden zum löschen und alphabetischen einfügen
schreiben muss(ich denke für letzteres muss ich einfach die haengean-methode umschreiben?)
alleine krieg ich das nich hin... Könnt ihr mir nochmal helfen? Wäre echt wichtig sons versemmel ich das morgen :(

Wie genau soll das Löschen von statten gehen? Du übergibst einer Löschen Methode ein Objekt vom Typ Spende und dieses soll aus der "Liste" gelöscht werden ? Würde zumindest am ehesten Sinn machen.
Dafür könntest du u.a. die equals Methode überschreiben, die Liste von Anfang durchgehen und so lang weiter machen bis du das entsprechende Element gefunden hast. Sagen wir du willst "Spende3" löschen:

Spende1 -> Spende2 -> Spende3 -> Spende4

Du fängst von vorne an: Spende1 ist ungleich Spende3, Spende2 ist ungleich Spende3 , beim nächsten Durchlauf findest du raus:

Spende3 gefunden. Nun musst du noch den "Zeiger" von Spende2 auf den von Spende3 setzen, so dass Spende2 auf Spende4 "zeigt".

Beim alphabetischen Einfügen kannst du prinzipiell fast genauso vorgehen, du vergleichst die Namen der Spender und fügst an gegebener Stelle die neue Spende ein. Dafür wieder einfach die "Zeiger" anpassen.

Kann momentan leider keinen Code posten, da ich hier nichts testen kann, werd aber gleich ma gucken ob ich was machen kann...
 

Chucky

Aktives Mitglied
wenn du nacher noch die zeit findest wäre das nett:)
ich versteh zwar wie du es meinst aber kann es irgendwie nich umsetzen :cry:
 

mic_checker

Top Contributor
Ich habe hier mal ne Methode geschrieben....Ausnahmsweise poste ich den ganzen Code der Methode.

Code:
   public int insert(Element start,Spende m) {
	   int pos;
	   String listname;
	   
		Element help = start;

		/*
		* Der Name des übergebenen Spenders.
		*/
		String mname = m.name;
	
		Spende temp = null;
		Element temp_element = null;
		Element neu = null;
		
		/*
		* Gehe die Liste von Anfang bis Ende durch.
		*/
		while(help != null) {
			/*
			* Der Name des aktuellen Spenders
			*/
		  	listname = help.Inhalt.name;
	      
	      pos = mname.compareTo(listname);
	      
	      /*
	      * Wenn der übergebene Spendername lexikografisch kleiner ist als der aktuelle
	      * Spendername, wird der Spender hier eingefügt.
	      */
			if(pos < 0) {
				/*
				* In temp wird die aktuelle Spende gespeichert.
				*/
				temp = help.Inhalt;
				
				/*
				* In temp_element wird das nächste Element gespeichert.
				*/
				temp_element = help.naechstes;
			
				/*
				* Der übergebene Spender wird an der aktuellen Position eingefügt.
				*/
				help.Inhalt = m;			
				
				/*
				* Ein Element wird erzeugt, dass den bisherigen Spender enthält.
				*/
				neu = new Element(temp);
				
				/*
				* Dieses Element zeigt auf das oben gespeicherte Element, hiermit wird sichergestellt,
				* das die Liste korrekt weitergeht und keine Elemente "wegfallen".
				*/
				neu.naechstes = temp_element;
				
				/*
				* Der bisher aktuelle Spender rückt um eins weiter in der Liste.
				*/
				help.naechstes = neu;	
							
				return 0;
			} else        
				help = help.naechstes; 
      }      
      
      /*
      * Wenn der User an diese Stelle kommt, dann muss das Element an das Ende
      * eingefügt werden, somit kann unsere andere Methode haengeAn(..) aufgerufen werden.
      */
      start.haengeAn(m);
      
      return 0;
	}

Es sollte eigentlich funktionieren, ansonsten sag bescheid.

Was ganz wichtig ist :
- Geh das ganze an Beispielen durch, wenn du es nicht verstehst mach ein weiteres Beispiel etc.
Wenns dir hilft zeichne den Zustand einer Liste vor Aufruf auf, dann geh alles Schritt für Schritt durch. Wenn du dadrüber morgen schreibst musst du es selber verstehen.
 

Chucky

Aktives Mitglied
Ich weiss garnicht in welcher klasse diese methode stehen muss und ich muss sie doch zusammen
mit einer Integervariableninitialisierung aufrufen oder??? hat doch einen Rückgabewert?
 

mic_checker

Top Contributor
Die steht in Element.

Aufruf z.B. so:

Code:
        Spende Spendenext = new Spende("drei",80,60);
        Eins.insert(Eins,Spendenext);

Btw. sollst du eine best. Spende löschen können oder nur eine best. Position?
 

Chucky

Aktives Mitglied
also mal ganz einfach wegen löschen (der infolehrer hats nich drauf im studium werd ich mehr lernen)
dem reicht sowas:

1.Klaus
2.Dagmar
3.Dieter
4.BobMarleyIsDerKing
5.Andre

wird zur Ausgabe:

1.Klaus
2.Dagmar
3.Dieter
4.Andre

das geht doch dann irgendwie mit equals oder?

also sollte noch ein button kommen mit Löschen und das Namenseingabefeld kann ich ja weiterverwenden
wäre schön wenn du mir da auch noch helfen könntes sieh mir derweil gerad den andern code an^^

Mfg Bob
 

mic_checker

Top Contributor
Hi,
also so ungefähr hab ich mir das auch gedacht.

Hier mal eine Möglichkeit für equals (in Spende):

Code:
   public boolean equals(Object obj) {
		if(this == obj)
			return true;
		
		if(obj == null)   
			return false;
			
		if(getClass() != obj.getClass())
			return false;
			
		Spende other = (Spende)obj;
		
		return name.equals(other.name) && euro == other.euro && cent == other.cent;
	}

Den Rest werd ich gleich ma probieren...Hast du keinen Ansatz?
 

Chucky

Aktives Mitglied
naja ich dachte es gibt schon eine methode zum vergleichen ob strings gleich sind
Code:
String1.equals(String2)
Dann hätte ich Hilf benutzt um durchzulaufen und immer geguckt ob irgendwann der eingegebene String
mit einem String in der Liste übereinstimmt. Nur wenn ich den dann gefunden hab weiss ich nimmer weiter.
Dann muss ich den ja praktisch löschen indem ich alle darauffolgenden eins nach Links(zum Anfang hin)
verschiebe. Verstehse mich?^^ weiss nich ob ich das so treffend formuliere

Mfg Bob
 

mic_checker

Top Contributor
Ja, equals musst du in Spende überschreiben, da du keinen reinen Referenzvergleich willst, sondern Spenden-Objekte vergleichen willst.

Mein aktueller Ansatz beim Löschen hat einen Haken: Das Prog löscht das gesuchte Element nicht wenn die Liste nur ein Element hat. Das erste Element kann das gesuchte sein - es wird nicht gelöscht.
Das müsstest du evtl. anders abfangen, zumindest funzt es so recht einfach.

Idee:

Spende1 -> Spende2 -> Spende3 -> Spende4

Wir wollen Spende3 löschen.

Speicher das Element mit Spende3, speichere ebenfalls das Element auf das Spende3 "zeigt", nun lenk den "Zeiger" von Spende2 um auf die Spende4.

Im Prinzip musst du den "Zeiger" an einer Stelle "umlenken"...

Code:
	public int removeElement(Element start,Spende m) {
		Element help = start;
		Element temp_element = null;
		
		/*
		* Gehe Liste von Anfang an durch...
		*/
		while(help != null) {
			/*
			* Im Folgenden wird das nächste Element mit dem zu löschenden Element verglichen,
			* vorher vergleichen wir ob wir nicht schon am Ende der Liste sind.
			*/			
			if(help.naechstes != null) {
				/*
				* Handelt es sich bei dem nächsten Element um das Element welches wir löschen wollen?
				* Falls ja dann speicher das nächste Element in temp_element und leg den "Zeiger"
				* des aktuellen Elements auf das Element auf das temp_element "zeigt".
				*/
				if(help.naechstes.Inhalt.equals(m)) {	
					temp_element = help.naechstes;
					help.naechstes = temp_element.naechstes;
					return 0;
				}				
			}	
			help = help.naechstes;		
		}
		
		/*
		* Spende nicht gefunden.
		*/
		return -1;	
	}

Wie immer ohne Gewähr.

Beachte die Einschränkung von oben (mehr als ein Element damit es funzt) - für die andern Fälle sollte es so klappen.

Aufruf z.B. so:

Code:
Spende sp2 = new Spende("eins",80,60);
....
Eins.removeElement(Eins,sp2);

Ansonsten - Wichtig:
Mach einige Beispiele an denen du das ganze Schritt für Schritt nachgehst und notfalls alles aufzeichnest....Üben Üben Üben! ;)
 

Chucky

Aktives Mitglied
Code:
if (e.getSource()==del){
        	namenseingabe=einfgabefeldname.getText();
        	euroeingabe=Integer.parseInt(einfgabefeldeuro.getText());
        	centeingabe=Integer.parseInt(einfgabefeldcent.getText());
            Spende Spendenext = new Spende(namenseingabe,euroeingabe,centeingabe);
            Eins.removeElement(Eins,Spendenext);
        	}

Also hab den Button del gemacht aber wenn ich die spendendaten eingeb auf Del klicke und dann auf Anzeigen
bleibt die Liste unverändert
 

mic_checker

Top Contributor
Lass dir die Liste vor dem Drücken auf del ausgeben, dann überprüf ob die übergebene Spende tatsächlich gleich ist und gelöscht werden müsste.
Ansonsten geh ich davon aus das die Liste mehr als ein Element enthält (?).

Evtl. gehts auch mit folgendem Code, bin mir aber nicht sicher ob es immer richtig funzt - dieser Code sollte auch für die Fälle das die Liste nur ein Element hat funktionieren:

Code:
	public int removeElement(Element start,Spende m) {
		Element help = start;
		Element temp_element = null;
		
		/*
		* Gehe Liste von Anfang an durch...
		*/
		while(help != null) {
			/*
			* Im Folgenden wird das nächste Element mit dem zu löschenden Element verglichen,
			* vorher vergleichen wir ob wir nicht schon am Ende der Liste sind.
			*/			
			if(help.naechstes != null) {
				/*
				* Handelt es sich bei dem nächsten Element um das Element welches wir löschen wollen?
				* Falls ja dann speicher das nächste Element in temp_element und leg den "Zeiger"
				* des aktuellen Elements auf das Element auf das temp_element "zeigt".
				*/
				if(help.naechstes.Inhalt.equals(m)) {	
					temp_element = help.naechstes;
					help.naechstes = temp_element.naechstes;
					return 0;
				}				
			} else {
				/*
				* Liste hat nur ein Element -> schauen ob das einzige Element das gesuchte ist 
				*/
				if(help.Inhalt.equals(m)) {
					return 1;
				}
			}
			
			help = help.naechstes;		
		}
		
		/*
		* Spende nicht gefunden.
		*/
		return -1;	
	}

Beim Aufruf noch Rückgabewert beachten:

Code:
      int ret = Eins.removeElement(Eins,Spendenanfang);
      
      if (ret == 1)
      	System.out.println("Keine Elemente in Liste mehr vorhanden !");
	   else if (ret == -1)
	   	System.out.println("Konnte Spende nicht in Liste finden !"); 
      else {
	   	Hilf = Eins;
	      while (Hilf != null) {
	      	Hilf.Inhalt.gibaus();
	         System.out.println("----");
	         Hilf=Hilf.naechstes;  
	      }
	 	}

Also die Testläufe bei mir funzten....
 

mic_checker

Top Contributor
Hab das ganze GUI und Applet Zeug rausgeholt - somit hatte ich nachher den folgenden Code:

Code:
public class Bank {   
   String namenseingabe;
   Element eins, hilf;
    
	public static void main(String[] args) {
		 Bank b = new Bank();
	}

	public Bank(){
		Spende spendenext;
		Spende spendenanfang;
		  
      spendenanfang = new Spende ("zweu", 70, 50);
      eins = new Element(spendenanfang);
      hilf = eins;        
        
      spendenext = new Spende ("zwew", 70, 50);
      eins.insert(eins,spendenext);      
        
      spendenext = new Spende("eins",80,60);
      eins.insert(eins,spendenext);
        
      spendenext = new Spende("zwei",90,50);
      eins.insert(eins,spendenext);
        
      spendenext = new Spende("drei",85,62);
      eins.insert(eins,spendenext); 
        
      while(hilf != null){
      	System.out.println(hilf.inhalt+"\n-----");        
         hilf=hilf.naechstes;  
      }
        
		System.out.println("\n\nNach Löschen:");
       
      int ret = eins.removeElement(eins,new Spende ("zweu", 70, 50));
      
      if (ret == 1)
      	System.out.println("Keine Elemente in Liste mehr vorhanden !");
	   else if (ret == -1)
	   	System.out.println("Konnte Spende nicht in Liste finden !"); 
      else {
	   	hilf = eins;
	      while (hilf != null) {
	      	System.out.println(hilf.inhalt+"\n-----");
	         hilf=hilf.naechstes;  
	      }
	 	}
	}
}

class Element {
	Spende inhalt;
   Element naechstes;
   
   public Element(Spende inhalt){
   	this.inhalt=inhalt;
      this.naechstes=null;
   }
  
   public void haengeAn(Spende m){
   	if (naechstes != null){
      	naechstes.haengeAn(m);
      } else {
	   	naechstes=new Element(m);
      }
   }
   
   public int insert(Element start,Spende m) {
	   int pos;
	   String listname;
	   
		Element help = start;

		/*
		* Der Name des übergebenen Spenders.
		*/
		String mname = m.name;
	
		Spende temp = null;
		Element temp_element = null;
		Element neu = null;
		
		/*
		* Gehe die Liste von Anfang bis Ende durch.
		*/
		while(help != null) {
			/*
			* Der Name des aktuellen Spenders
			*/
		  	listname = help.inhalt.name;
	      
	      pos = mname.compareTo(listname);
	      
	      /*
	      * Wenn der übergebene Spendername lexikografisch kleiner ist als der aktuelle
	      * Spendername, wird der Spender hier eingefügt.
	      */
			if(pos < 0) {
				/*
				* In temp wird die aktuelle Spende gespeichert.
				*/
				temp = help.inhalt;
				
				/*
				* In temp_element wird das nächste Element gespeichert.
				*/
				temp_element = help.naechstes;
			
				/*
				* Der übergebene Spender wird an der aktuellen Position eingefügt.
				*/
				help.inhalt = m;			
				
				/*
				* Ein Element wird erzeugt, dass den bisherigen Spender enthält.
				*/
				neu = new Element(temp);
				
				/*
				* Dieses Element zeigt auf das oben gespeicherte Element, hiermit wird sichergestellt,
				* das die Liste korrekt weitergeht und keine Elemente "wegfallen".
				*/
				neu.naechstes = temp_element;
				
				/*
				* Der bisher aktuelle Spender rückt um eins weiter in der Liste.
				*/
				help.naechstes = neu;	
							
				return 0;
			} else        
				help = help.naechstes; 
      }      
      
      /*
      * Wenn der User an diese Stelle kommt, dann muss das Element an das Ende
      * eingefügt werden, somit kann unsere andere Methode haengeAn(..) aufgerufen werden.
      */
      start.haengeAn(m);
      
      return 0;
	}
	
	public int removeElement(Element start,Spende m) {
		Element help = start;
		Element temp_element = null;
		
		/*
		* Gehe Liste von Anfang an durch...
		*/
		while(help != null) {
			/*
			* Im Folgenden wird das nächste Element mit dem zu löschenden Element verglichen,
			* vorher vergleichen wir ob wir nicht schon am Ende der Liste sind.
			*/			
			if(help.naechstes != null) {
				/*
				* Handelt es sich bei dem nächsten Element um das Element welches wir löschen wollen?
				* Falls ja dann speicher das nächste Element in temp_element und leg den "Zeiger"
				* des aktuellen Elements auf das Element auf das temp_element "zeigt".
				*/
				if(help.naechstes.inhalt.equals(m)) {	
					temp_element = help.naechstes;
					help.naechstes = temp_element.naechstes;
					return 0;
				}				
			} else {
				/*
				* Liste hat nur ein Element -> schauen ob das einzige Element das gesuchte ist 
				*/
				if(help.inhalt.equals(m)) {
					return 1;
				}
			}
			
			help = help.naechstes;		
		}
		
		/*
		* Spende nicht gefunden.
		*/
		return -1;	
	}
}
       
class Spende {
	String name;
   int euro,cent;
   
   public Spende(String name, int euro, int cent) {
   	this.name=name;
      this.euro=euro;
      this.cent=cent;
	}
	
	public String toString() {
		return "Name = "+name+"\nEuro = "+euro+"\nCent = "+cent+"\n";
	}
   
   public boolean equals(Object obj) {
		if(this == obj)
			return true;
		
		if(obj == null)   
			return false;
			
		if(getClass() != obj.getClass())
			return false;
			
		Spende other = (Spende)obj;
		
		return name.equals(other.name) && euro == other.euro && cent == other.cent;
	}
}

Btw. hab deine Struktur größtenteils beibehalten, lediglich die Variablennamen klein geschrieben. Hab jetzt keine weiteren Zugriffsmethoden (für die Variablen) etc. geschrieben um dich nicht weiter zu verwirren.
Ansonsten säh das Prog etwas anders aus ;)
 

Chucky

Aktives Mitglied
hmm naja das mit dem löschen klappt bei mir leider immer nochnich aber ich werd jetz ersma schlafen und morgen
sehen was draus wird

VIELEN VIELEN DANK!

Bob
 

mic_checker

Top Contributor
Also wenn es "textbasiert" funktioniert sollte es ja auch mit GUI funzen. Hast du überprüft ob der Code richtig ausgeführt wird (werden der Methode die korrenten Daten übergeben etc. pp.) ?

Wie gesagt, du solltest dir zuvor auch die Liste ausgeben lassen und überprüfen ob sich was ändert.

Der Code müsste nämlich eigentlich soweit stimmen....

Btw. das ganze erinnert mich an C, wo man auch recht viel Spaß dabei hatte Verkettete Listen zu programmieren... ;)

Wenn du noch Fragen hast, dann poste es.
 

Chucky

Aktives Mitglied
wenn ich nich zurecht komm poste ich um ca 9:50 meine aufgabe und frag euch^^
Schreibe nähmlich am PC

Mfg Bob
 
Status
Nicht offen für weitere Antworten.
Ä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
T Lineare Listen: sortiertes Einfügen Java Basics - Anfänger-Themen 6
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