Einzelnen Beitrag anzeigen

tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#19

Re: doppelt verkettete listen

  Alt 14. Dez 2005, 22:26
Zitat:
Buuuuh! Zwinkern Das ist aber eine Ausrede, denn die paar Zeilen solltest Du in 2 Minuten heruntergetippt haben: Es ist ja einfacher, als meine 5 Zeilen, oder?
Na gut, aber wenn ich Freitag durchfalle mach ich dich verantwortlich (juhu...endlich einen Schuldigen gefunden!)
Delphi-Quellcode:
type PListElement = ^TListElement;
     TListElement = record
       Next: PListElement;
       Data: pointer; // Beispielsweise
     end;
type TVList = class
     private
       FCount: integer;
       FWurzel: PListElement;
       function IsEmpty: boolean; inline;
       property RawItems[Index: integer]: PListElement read... // Den Code zum durchiterieren lass ich jetzt mal weg, ja?
     public
       property Count: integer read FCount;
       procedure Add(Element: pointer);
     end;

...
function EmptyList: TVList;
begin
  Result := TVList.Create;
end;

constructor TVList.Create;
begin
  FWurzel := nil;
  FCount := 0;
end;

function TVList.Empty: boolean;
begin
  Result := FWurzel = nil;
end;

procedure TVList.Add(Element: pointer);
var InsIndex: integer;
    NewEl: PListElement;
begin
  if Empty then
    InsIndex := 0 else
    InsIndex := GetInsIndex(Element);

  New(NewEl);
  if InsIndex <= Count - 1 then
    NewEl^.Next := RawItems[InsIndex];
  if InsIndex = 0 then
    Wurzel := NewEl else
    RawItems[InsIndex - 1].Next := NewEl;
end;
Das ist zwar natürlich nicht besonders sauber und beileibe nicht vollständig (außerdem ungetested), aber zumindest das Einfügen müsste so funktionieren. Dass die Funktion zum Einfüge-Index finden gegeben ist habe ich einfach mal angenommen. Das ließe sich zwar auch mit einem Methodenzeiger-Feld erledigen, aber so viel Arbeit wollte ich jetzt eigentlich nicht investieren.

//edit:
Okay, das
Zitat:
Eine leere Liste ist doch nicht Nichts, oder? Sondern eine 'leere Liste'.
ist natürlich ein Argument. Fragt sich nur, ob das programmiertechnisch irgendeinen Unterschied machen wird. Denn Konkatenation, Schnitt etc. musst du ja sowieso selbst implementieren.
Letztendlich handelt es sich also um verschiedene "Darstellungen" ein und desselben: Deine leere Liste wird charakterisiert durch "nur der Grundknoten vorhanden", meine durch "Wurzel = nil"

Ich sehe zwar mittlerweile, dass du namhafte Verstärkung auf deiner Seite hast, aber so ganz überzeug bin ich immer noch nicht.

PS: Wenn du mir jetzt sagst, dass mein Code länger ist, dann halte ich dem entgegen, dass da ja auch der ganze Klassenoverhead mit drinhängt (bis auf das was ich mir mal geschenkt habe...). Meine Add-Methode ist auch nicht viel länger als deine, und EmptyList sogar noch kürzer

//edit2:
Ooh, so ein Quark. EmptyList geändert.
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat