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 type

  • ListFree disposes entries but NOT the values (caller’s responsibility)

  • O(1) add/remove, O(n) search