Einzelnen Beitrag anzeigen

sarte

Registriert seit: 23. Mai 2008
Ort: Australien
66 Beiträge
 
Delphi 7 Enterprise
 
#1

Löschen eines Elementes in einer einfachen Liste

  Alt 26. Jan 2009, 16:31
Hallo Leute,
ich habe eine kleine Frage:
Wenn ein Element am Tailbereich einer einfach verketteten Liste steht und ich es löschen möchte, wie mache ich das am besten?
Die Liste ist im OOP-Stil programmiert, ohne Zeiger.

Delphi-Quellcode:
procedure TElist.delete;
var
  p: TLElement; // private rechts: TLElement; {Zeigt das nächste Element} Data : Integer; {Dort wird die Information gespeichert}
   
begin
  if aktuell = head then // Wenn der Zeiger aktuell sich bei Head befindet, dann ...
  begin
    head := aktuell.GetRechts; // erhält Head den nächsten Element durch die Methode GetRechts
    aktuell.Free; // Arbeitsspeicher wird freigegeben
    aktuell:= head; // Aktuell befindet sich wieder bei Head
  end else
  begin
    if aktuell= tail then // Wenn der Zeiger aktuell sich bei Tail befindet, dann ...
    begin
      p := head;
      while(p <> NIL) and (p.GetRechts <> aktuell) do //geht man mit Hilfe einer Variable durch die ganze Liste bis man vor Tail steht
        p := p.GetRechts;
      p.setRechts(aktuell.GetRechts); //Das Element vor Tail erhält den Wert GetRechts (In dem Fall = NIL)
      aktuell.Free; // Arbeitsspeicher wird freigegeben
      aktuell:= p; // Aktuell befindet sich wieder bei p (das vorletzte Element)
      tail:= p; // tail ist dann p
    end else
    begin // Wenn Aktuell zwischen Head und Tail sich befindet
      p := aktuell.GetRechts; // Wird einfach das Element, welches gelöscht werden soll, mit dem nächsten Element vertauscht
      aktuell.setData(p.GetData); // aktuell erhält den Wert des nächsten Elementes (vertauscht)
      aktuell.setRechts(p.GetRechts); // Der Zeiger zeigt auf das übernächste Element
      p.Free; // p wurde deleted ;D
    end;
  end;
  dec(count);
end;
Wie ihr sieht habe ich das Taillöschen programmiert, aber ich bin der Meinung, dass dies überhaupt nicht effizient ist, da man ja durch die Liste durchgehen muss (bis zum vorletzen Element). Bei 100000 Datensätzen kann dies einwenig länger dauern. Wie kann man dies lösen?
Eine Idee hätte ich, man erzeugt eine doppelverkettete Liste, also ein Zeiger der zum vorherigen Element zeigt. Leider darf ich das nicht machen. Es muss eine einfach verkettete Liste sein.
Wenn ihr fragen habt, fragt einfach. Es kann alles verwirrend sein
Sarte
  Mit Zitat antworten Zitat