PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit verketteter Liste



der2of6
20-04-2006, 14:16
Hi,
ich hab hier eine Aufgabe, bei der ich Einfach nicht weiterkomme.
Ist es ist eine kleine Studentenverwaltung, die in einer verketteten Liste gespeichert wird.
Der letze Teil der Aufgabe ist, die Liste zu durchsuchen und den ältesten Studenten auszugeben.
Ich bekomme zwar eine Ausgabe, aber die ist nicht der älteste:


Hier die Klassen: (teils um die unwichtigen Dinge gekützt)
Der Fette Teil ist mein Code.
Der Reste des Codes soll nicht verändert werden, das hinzufügen ist aber erlaubt.
In der ListElem geht er rekursiv durch die Liste durch und übergibt das alter auch immer richtig, das abschließende return am schluss jedoch gibt nicht den ältesten studenten zurück.
Hab ich da was übersehen? :confused:

Ich hoffe mir kann jemand helfen

Listenaufgabe.java


// Listenaufgabe.java
//
// Einstiegsaufgabe, zeigt Einsatz rekursiver Datenstrukturen (Liste)
//
// ...(name), ...(datum)
//

import java.io.*;

public class Listenaufgabe {
public static void main(String[] args) throws IOException {
Liste studlist;
BufferedReader stdin;
ListElem current_element;
...
//Eingabe
current_element = new ListElem(new Student(n, v, m, a, s));
studlist.insert(current_element);
}
// gib zur Kontrolle die Liste aller Datensaetze aus:
System.out.println();
System.out.println("Alle Studenten (Liste):");
studlist.print();

// gib aeltesten Student aus:
System.out.println();
System.out.println("Aeltester Student:");
#########################################

studlist.aeltester().print();


} // end main

} // end class Listenaufgabe


Student

public class Student {
...

public int getAlter() {
public String getName() {


public Student() {
this.name = null;
this.vorname = null;
this.martikelnr = null;
this.alter = 0;
this.semester = 0;
}
....

public void print() {
System.out.println("Name, Vorname: " + this.name + " " + this.vorname);
System.out.println("Martikelnummer: " + this.martikelnr + " Alter: "
+ this.alter);
System.out.println("Semester: " + this.semester);

}
}
// End Klasse Student


// Liste.java
// Definition einer Liste (gehoert zu Listenaufgabe.java)

public class Liste {
// Teil 1: Attribute (="Eigenschaften")
private ListElem head; // Anker (=Listenkopf) fuer das erste Listenelement

// Teil 2: Konstruktor(en) (=Vorbesetzung der Eigenschaften +
// "Geburtsverhalten")
public Liste() {
head = null; // Liste ist anfangs leer
}

// Teil 3: Methoden (="Verhalten")
public void insert(ListElem el)
// einfuegen des Elements el am Ende der Liste
{
if (head == null)
head = el;
else
head.insert(el);
}

public void print()
// ausgeben der Liste
{
if (head == null)
System.out.println("Liste ist leer!");
else
head.print(); // Aufgabe an Klasse Listelem weitergeben
}

public void setHead(ListElem h)
// Besetzung des von aussen nicht zugaenglichen Attributs
{
head = h;
}

public ListElem getHead()
// Lieferung des von aussen nicht zugaenglichen Attributs
{
return head;
}


// Hier ggf. zusaetzliche Methoden ergaenzen!

public Student aeltester() {
Student alt = null;
alt = head.aeltester(0, head.getElement());
return alt;
}

} // end class Liste



// ListElem.java

// Definition eines Listenelements (gehoert zu Listenaufgabe.java)
public class ListElem {
// Teil 1: Attribute (="Eigenschaften")
private Student element;

private ListElem next;

// Teil 2: Konstruktor(en) (=Vorbesetzung der Eigenschaften +
// "Geburtsverhalten")
public ListElem(Student e) {
element = e;
next = null;
}

// Teil 3: Methoden (="Verhalten")
public void insert(ListElem el)
// einfuegen eines Elements am Ende der Liste
{
if (next == null) {
// einfache Loesung im Trivialfall
next = el;
} else {
// ansonsten rekursive Weitergabe der Aufgabe
next.insert(el);
}
}

public void print()
// ausdrucken der kompletten Liste
{
element.print();// ausdrucken des (ersten) Elements (der Liste)
if (next != null)
next.print(); // rekursiver Aufruf mit Listenrest
}

public Student getElement()
// Lieferung des von aussen nicht zugaenglichen Attributs
{
return element;
}

public ListElem getNext()
// Lieferung des von aussen nicht zugaenglichen Attributs
{
return next;
}


// Hier ggf. zusaetzliche Methoden ergaenzen!

public Student aeltester(int a, Student b) {
Student tmp = b;
int i;
int alter = a;

if (this.element.getAlter() > alter) {
alter = this.element.getAlter();
tmp = this.getElement();
}

if (next != null) {

if (next.element.getAlter() > alter) {
alter = next.element.getAlter();
tmp = next.getElement();
next.aeltester(alter, tmp);
} else {
next.aeltester(alter, tmp);
}

}
return tmp;
}
} // end class ListElem

bischi
20-04-2006, 14:52
Naja - ich würds auf jeden Fall anders machen:

Beginne bei erstem Student.
Lese Alter in int ein.
gehe zum nächsten Student.
Lese sein Alter ein.
Vergleiche die beiden.
von nun an iterativ weiter.

MfG Bischi

PS: Andere Lösungsidee: Jedes mal beim Einfügen überprüfen, ob der neue Student der neue älteste ist. Falls ja, sein Alter in einem int speichern und sein Listenelement in nem Pointer, für den schnellen Zugriff.

der2of6
07-05-2006, 21:07
So, bissal spät, aber ich habs verpant ;)
Erst mal danke für den Vorschlag, aber ich habe den Fehler gefunden.

vor dem
next.aeltester(alter, tmp);
fehlt einfach ein return

Trotzdem danke!