AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Löschen eines Elementes in einer einfachen Liste

Löschen eines Elementes in einer einfachen Liste

Ein Thema von sarte · begonnen am 26. Jan 2009 · letzter Beitrag vom 26. Jan 2009
Antwort Antwort
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
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.623 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Löschen eines Elementes in einer einfachen Liste

  Alt 26. Jan 2009, 16:36
Hallo,

wie ich gesehen habe, führst Du eine Variable count mit.
Dann müßte das Ende doch:

ende = head + count * sizeOf(pointer) sein.

Wenn ich mich nicht ganz irre.
[edit] wenn denn keine Lücken in der Liste sind [/edit]

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.287 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Löschen eines Elementes in einer einfachen Liste

  Alt 26. Jan 2009, 16:36
Dieses Problem hast Du bei einer einfach verketteten Liste aber immer. Ich wüsste jetzt auch nicht, wie man das anders machen könnte.

[edit] @Klaus: Ich kann mich irren, aber IIRC müssen verkettete Listen nicht unbedingt in einem zusammenhängenden Block im Speicher stehen. [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.731 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Löschen eines Elementes in einer einfachen Liste

  Alt 26. Jan 2009, 16:38
wie ist TElement definiert?

und wie ohne Zeiger? (bin ich blind, oder denk ich nur welche zu sehn)
[add] OK, sind wohl Objekte, aber kommt auf's Selbe raus


und kannst du die Struktur nicht doch noch etwas ändern?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
sarte

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

Re: Löschen eines Elementes in einer einfachen Liste

  Alt 26. Jan 2009, 16:42
Zitat von Klaus01:
Hallo,

wie ich gesehen habe, führst Du eine Variable count mit.
Dann müßte das Ende doch:

ende = head + count * sizeOf(pointer) sein.

Wenn ich mich nicht ganz irre.
[edit] wenn denn keine Lücken in der Liste sind [/edit]

Grüße
Klaus
kann ich sizeOf überhaupt benutzen? Ich mache das ja ohne Pointer. Mit Create Anweisungen erhalte ich die Adresse (ohne new(pointer).

Ein Beispiel:

Liste: 3 | 4 | 5 | 6 | 9 |

Wenn aktuell sich bei 4 befindet, dann vertausche ich die 4 mit der 5:

3 | 5 | 4 | 6 | 9 |
Und kann dann das Element mit der 4 Löschen, sonst müsste ich zur 3 gehen und dort seinen Zeiger zum nächsten Element ändern.

Wenn aber aktuell bei Tail steht, also die 9

3 | 4 | 5 | 6 | 9 | -> NIL

dann kann ich das nicht so einfach machen, weil da ja NIL steht.
  Mit Zitat antworten Zitat
sarte

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

Re: Löschen eines Elementes in einer einfachen Liste

  Alt 26. Jan 2009, 16:42
Zitat von himitsu:
wie ist TElement definiert?

und wie ohne Zeiger? (bin ich blind, oder denk ich nur welche zu sehn)
[add] OK, sind wohl Objekte, aber kommt auf's Selbe raus


und kannst du die Struktur nicht doch noch etwas ändern?
Delphi-Quellcode:
type
  TLElement = class
  private
    rechts: TLElement;
    Data : Integer;
  public
    procedure setData(Daten: Integer);
    procedure setRechts(next: TLElement);
    function GetRechts:TLElement;
    function GetData:Integer;
  end;
Ja ich soll das ohne Zeiger machen -.-

Die Struktur soll leider so bleiben.
  Mit Zitat antworten Zitat
sarte

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

Re: Löschen eines Elementes in einer einfachen Liste

  Alt 26. Jan 2009, 16:47
Zitat von DeddyH:
Dieses Problem hast Du bei einer einfach verketteten Liste aber immer. Ich wüsste jetzt auch nicht, wie man das anders machen könnte.
Wenn das so ist, dann belasse ich das.

Trotzdem danke an euch , wenn jemand aber eine Idee hat, bitte melden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.731 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Löschen eines Elementes in einer einfachen Liste

  Alt 26. Jan 2009, 16:47
Wie gesagt, ob Record/Pointer oder Object, ist doch eigentlich egal,

aber wenn du z.B. noch "links" einführst, dann kannst da ganz schnell arbeiten, da von dem Object auf alle nötigen Elemente direkt zugegriffen werden kann.


ansonsten bleibt dir wohl nix anderes übrig, außer (im Notfall) die ganze Liste durchzugehn

Delphi-Quellcode:
TComp = Record/Object
  ...
  Owner: ...;
  Prev, Next: PComp;
End;

If Comp.Owner.FirstComp = Comp Then Comp.Owner.FirstComp := Comp.Next;
If Assigned(Comp.Prev) Then Comp.Prev.Next := Comp.Next;
If Assigned(Comp.Next) Then Comp.Next.Prev := Comp.Prev;
Comp.Free;
head entspricht hier wohl dem Owner
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.287 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Löschen eines Elementes in einer einfachen Liste

  Alt 26. Jan 2009, 16:49
head entspricht wahrscheinlich dem ersten Listenelement (irgendwo muss man ja anfangen, sich durchzuhangeln).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf