Hi!
Wir realisieren im Informatikunterricht z.Z. eine Liste mit Namen, die eingegeben und gelöscht werden können (alles mit Hilfe von Zeigern), folgendermaßen aufgebaut: Zwei Listboxes (eine für die Platzierung, da es sich bei der Liste um Skispringer handelt und für den Namen und eine für die zum Namen zugehörige Wertung) und zwei Buttons,
nächster Springer und
Springer löschen. Bei Klick auf
nächster Springer erscheinen zwei InputBoxes, zuerst eine für den Namen und danach eine für die zugehörige Wertung. Nach diesen Einträgen werden der Name und die Wertung gespeichert und sortiert nach Wertung in die jeweiligen Listboxes eingetragen. Die Procedure hierzu ist folgende (zu oberst die Deklaration der globalen Variablen):
Delphi-Quellcode:
type
TZeiger = ^TSpringer;
TSpringer = record
name : String;
wertung : Real;
vorher,
nachher : TZeiger
end;
var
Skispringen : TSkispringen;
oben : TZeiger;
platz : Integer;
Delphi-Quellcode:
procedure TSkispringen.bt_naechster_springerClick(Sender: TObject);
var aktuell, hilf, lauf : TZeiger;
begin
new(aktuell);
aktuell^.name := InputBox('Eingabe','Name','');
aktuell^.wertung := StrToFloat(InputBox('Eingabe','Wertung',''));
aktuell^.vorher := nil;
aktuell^.nachher := nil;
IF oben = nil THEN
oben := aktuell
ELSE
begin
IF aktuell^.wertung > oben^.wertung THEN
begin
oben^.vorher := aktuell;
aktuell^.nachher := oben;
oben := aktuell
end
ELSE
begin
lauf := oben;
WHILE (lauf^.wertung > aktuell^.wertung) AND (lauf^.nachher <> nil) DO
lauf := lauf^.nachher;
IF (aktuell^.wertung > lauf^.wertung) THEN
begin
aktuell^.vorher := lauf^.vorher;
aktuell^.nachher := lauf;
hilf := lauf^.vorher;
hilf^.nachher := aktuell;
lauf^.vorher := aktuell
end
ELSE
begin
lauf^.nachher := aktuell;
aktuell^.vorher := lauf
end
end
end;
ausgabe
end;
Und hier die Procedure zum ausgeben:
Delphi-Quellcode:
procedure TSkispringen.ausgabe;
var hilf : TZeiger;
begin
li_skispringer.Clear;
li_wertung.Clear;
hilf := oben;
platz := 0;
WHILE (hilf <> nil) DO
begin
inc(platz);
li_skispringer.Items.Add(IntToStr(platz) + '. ' + hilf^.name);
li_wertung.Items.Add(FloatToStr(hilf^.wertung));
hilf := hilf^.nachher;
end
end;
Soweit, so gut. Klappt auch alles ohne Probleme. Nun habe ich mich eben hingesetzt und den Algorithmus programmiert, um einen Springer anhand seines Namens zu löschen:
Delphi-Quellcode:
procedure TSkispringen.bt_springer_loeschenClick(Sender: TObject);
var lauf : TZeiger;
such : String;
begin
such := InputBox('Eingabe','Name','');
lauf := oben;
WHILE NOT (lauf^.nachher = nil) AND (such = lauf^.name) DO
lauf := lauf^.nachher;
IF (lauf^.name = such) AND (lauf^.nachher = nil) THEN
lauf^.vorher^.nachher := nil
ELSE IF such = lauf^.name THEN
begin
lauf^.vorher^.nachher := lauf^.nachher;
lauf^.nachher^.vorher := lauf^.vorher
end
ELSE IF such = oben^.name THEN
oben^.nachher^.vorher := nil;
// ELSE exit;
ausgabe
end;
Hier hört das Programm leider auf zu funktionieren. Ich kann zwar den zu löschenden Namen eingeben, aber leider wird dieser nicht aus der Listbox gelöscht und ich komme einfach nicht drauf, wieso nicht. Ich hoffe, ich hab das verständlich erklärt und es kann mir jemand helfen.
Gruß,
Olli
P.S.: Ich weiß, dass sowas auch einfacher zu realisieren ist, aber wir müssen halt mit Zeigern arbeiten ...