Hallo zusammen!
Ich stehe hier gerade vor einem Problem und sitze schon mindestens 5 Stunden daran, komme einfach nicht auf die Lösung. Folgende Aufgabenstellung:
Es muss eine doppelt verkettete Liste implementiert werden, die Knoten speichert. Diese Knoten besitzen ein Datenfeld mit Bestellung und zwei Referenzen. Eine Referenz zeigt auf den vorherigen Knoten, die andere Referenz auf den nächsten Knoten.
Hier dazu die Bestellung-Klasse:
Und die Knoten-Klasse:
Und die implementierung der doppelt verketteten Liste:
Wenn ich nun versuche die Methode add() zu verwenden, bekomme ich folgene Fehlermeldung:
Dazu die Zeile 120:
Mir ist bewusst, dass die Referenz auf den vorherigen Knoten irgendwie nicht stimmt. Blos weiß ich nicht wie ich das lösen kann.
Hoffe das macht nicht zu große Arbeit
MfG ahretour
Ich stehe hier gerade vor einem Problem und sitze schon mindestens 5 Stunden daran, komme einfach nicht auf die Lösung. Folgende Aufgabenstellung:
Es muss eine doppelt verkettete Liste implementiert werden, die Knoten speichert. Diese Knoten besitzen ein Datenfeld mit Bestellung und zwei Referenzen. Eine Referenz zeigt auf den vorherigen Knoten, die andere Referenz auf den nächsten Knoten.
Hier dazu die Bestellung-Klasse:
Java:
public class Bestellung {
private int id = 0;
private static int counter=0;
private String bez;
private int prio;
public Bestellung(String bez, int prio){
counter++;
this.id=counter;
setBez(bez);
setPrio(prio);
}
public void setBez(String bez){
if(bez==null || (bez.length()<3)) throw new RuntimeException("Die Bezeichnung muss mindestens 3 Zeichen enthalten!");
this.bez=bez;
}
public void setPrio(int prio){
if(prio!=0 && prio!=1 && prio!=2) throw new RuntimeException("Die Priorität darf nur 0, 1 und 2 sein!");
this.prio=prio;
}
public String getBez(){
return bez;
}
public int getId(){
return id;
}
public int getPrio(){
return prio;
}
@Override
public String toString(){
return "Bestellung-ID: " + getId() +
"\nBezeichnung: " +getBez() +
"\nPriorität: " +getPrio();
}
@Override
public boolean equals(Object o){
if(o instanceof Bestellung){
Bestellung b = (Bestellung) o;
return (this.getId() == b.getId());
}
else return false;
}
}
Und die Knoten-Klasse:
Java:
public class Knoten {
private Bestellung b;
private Knoten vorheriger;
private Knoten naechster;
private Knoten(){
}
public Knoten(Bestellung best, Knoten next, Knoten prev){
DoppeltVerketteteListe.anzKnoten++;
this.setBestellung(best);
this.setNaechster(next);
this.setVorheriger(prev);
}
public void setBestellung(Bestellung best){
b=best;
}
public Bestellung getBestellung(){
return b;
}
public void setVorheriger(Knoten v){
vorheriger=v;
}
public void setNaechster(Knoten n){
naechster=n;
}
public Knoten getVorheriger(){
return vorheriger;
}
public Knoten getNaechster(){
return naechster;
}
@Override
public String toString(){
if (this.getBestellung()==null) return null;
return this.getBestellung().toString();
}
}
Und die implementierung der doppelt verketteten Liste:
Java:
public class DoppeltVerketteteListe {
private Knoten wurzel;
private Knoten ende;
public static int anzKnoten;
public DoppeltVerketteteListe(Bestellung b){
wurzel=new Knoten(b, ende, null);
ende=new Knoten(b, null, wurzel);
anzKnoten--;
}
public Bestellung getFirst(){
if(wurzel==null) return null;
return wurzel.getBestellung();
}
public Bestellung getLast(){
if(wurzel==null) return null;
Knoten k=wurzel;
for(int i=1; i<=anzKnoten; i++){
if(k.getNaechster()!=null)
k=k.getNaechster();
}
return k.getBestellung();
}
public Bestellung get(int pos){
if((pos<1) || (pos>anzKnoten)) throw new RuntimeException("Die Position ist inkorrekt!");
Knoten k=wurzel;
for(int i=1; i<pos; i++){
k=k.getNaechster();
}
return k.getBestellung();
}
public String getAllData(){
String ausgabe;
if(anzKnoten==0) return "Es sind keine Knoten erstellt worden!";
Knoten k=wurzel;
ausgabe=k.getBestellung().toString();
ausgabe+="\n-----------------------\n";
while(k.getNaechster()!=null){
k=k.getNaechster();
ausgabe+=k.getBestellung().toString();
ausgabe+="\n-----------------------\n";
}
return ausgabe;
}
public void removeFirst(){
if(wurzel!=null) wurzel=wurzel.getNaechster();
anzKnoten--;
}
public void removeLast(){
if(wurzel==null) return;
if(wurzel.getNaechster()==null){
wurzel=null;
}
else{
Knoten k=wurzel;
Knoten naechster=null;
Knoten vorheriger=null;
do{
naechster=k.getNaechster();
if(naechster!=null){
vorheriger=k;
k=naechster;
}
}while(naechster!=null);
vorheriger.setNaechster(null);
}
anzKnoten--;
}
public void remove(int pos){
int anz=anzKnoten;
if((pos<1) || (pos>anz)) throw new RuntimeException("Die Position ist inkorrekt!");
if(pos==1){
this.removeFirst(); return;
}
if(pos==anz){
this.removeLast(); return;
}
Knoten k=wurzel;
Knoten naechster=null;
Knoten vorheriger=null;
for (int i=1; i<pos; i++){
vorheriger=k;
k=k.getNaechster();
}
naechster=k.getNaechster();
vorheriger.setNaechster(naechster);
}
public void add(int pos, Bestellung best){
if((pos<1) || (pos>anzKnoten)) throw new RuntimeException("Die Position ist inkorrekt!");
if(pos==1){
this.addFirst(best); return;
}
if(pos==anzKnoten){
this.addLast(best); return;
}
Knoten k=wurzel;
for(int i=1; i<pos; i++){
if(k.getNaechster()!=null) k=k.getNaechster();
}
Knoten neu=new Knoten(best, k, k.getVorheriger());
k.getVorheriger().setNaechster(neu);
k.setVorheriger(neu);
}
public void addFirst(Bestellung best){
Knoten k = new Knoten(best, wurzel, null);
wurzel=k;
}
public void addLast(Bestellung best){
Knoten k=wurzel;
Knoten vorheriger;
Knoten naechster;
do{
naechster=k.getNaechster();
vorheriger=k.getVorheriger();
if(naechster!=null) k=k.getNaechster();
}while(naechster!=null);
naechster=new Knoten(best, k.getNaechster(), k.getVorheriger());
k.setNaechster(naechster);
k.setVorheriger(vorheriger);
}
}
Wenn ich nun versuche die Methode add() zu verwenden, bekomme ich folgene Fehlermeldung:
Java:
Exception in thread "main" java.lang.NullPointerException
at listen.DoppeltVerketteteListe.add(DoppeltVerketteteListe.java:120)
at listen.TestListe.main(TestListe.java:18)
Dazu die Zeile 120:
Java:
k.getVorheriger().setNaechster(neu);
Mir ist bewusst, dass die Referenz auf den vorherigen Knoten irgendwie nicht stimmt. Blos weiß ich nicht wie ich das lösen kann.
Hoffe das macht nicht zu große Arbeit
MfG ahretour