Something like this:
type
TOccurencyNodePtr = ^TOccurencyNode;
TOccurencyNode = record
Occurency: integer;
Next: TOccurencyNodePtr;
end;
TIdentifierFoundNodePtr = ^TIdentifierFoundNode;
TIdentifierFoundNode = record
Identifier: string;
Next: TIdentifierFoundNodePtr;
end;
var
Occurencies: TOccurencyNodePtr = nil;
Identifiers: TIdentifierFoundNodePtr = nil;
procedure AddIdentifierOccurency(const Identifier: string; const Occurrency: Integer);
var
IdentifierNode, LastIdentifierNode: TIdentifierFoundNodePtr;
OccurencyNode, LastOccurencyNode: TOccurencyNodePtr;
begin
IdentifierNode := Identifiers;
LastIdentifierNode := nil;
while (IdentifierNode <> nil) and (IdentifierNode.Identifier <> Identifier) do
begin
LastIdentifierNode := IdentifierNode;
IdentifierNode := IdentifierNode.Next;
end;
if IdentiferNode = nil then
begin
New(IdentifierNode);
IdentifierNode.Identifier := Identifier;
IdentifierNode.Next := nil;
if Identifiers = nil then
Identifiers := IdentifierNode
else
LastIdentifierNode.Next := IdentifierNode;
end;
OccurencyNode := Occurencies;
LastOccurencyNode := nil;
while (OccurencyNode <> nil) and (OccurencyNode.Occurency <> Occurency) do
begin
LastOccurencyNode := OccurencyNode;
OccurencyNode := OccurencyNode.Next;
end;
if OccurencyNode = nil then
begin
New(OccurencyNode);
OccurencyNode.Occurency := Occurency;
OccurencyNode.Next := nil;
if Occurencies = nil then
Occurencies := OccurencyNode
else
LastOccurencyNode.Next := OccurencyNode;
end;
end;