Linked List
Generic doubly-linked list for pointer values.
Types
type
PListValue = Pointer;
TListEntry = record
Next, Prev: PListEntry;
Value: PListValue;
end;
PListEntry = ^TListEntry;
TLinkedList = record
First, Last: PListEntry;
Count: Word;
end;
Functions
procedure ListInit(var List: TLinkedList);
function ListAdd(var List: TLinkedList; Value: PListValue): PListEntry;
procedure ListRemove(var List: TLinkedList; Entry: PListEntry);
function ListRemoveByValue(var List: TLinkedList; Value: PListValue): Boolean;
function ListContains(var List: TLinkedList; Value: PListValue): Boolean;
procedure ListFree(var List: TLinkedList);
Example
uses LinkList;
var
List: TLinkedList;
Item: PListEntry;
MyData: Pointer;
begin
ListInit(List);
ListAdd(List, Ptr($1234));
ListAdd(List, Ptr($5678));
Item := List.First;
while Item <> nil do
begin
MyData := Item^.Value;
{ Process MyData... }
Item := Item^.Next;
end;
ListRemoveByValue(List, Ptr($1234));
ListFree(List);
end;
Notes
Stores generic pointers (
Pointer), cast to your typeListFreedisposes entries but NOT the values (caller’s responsibility)O(1) add/remove, O(n) search