RosettaCodeData/Task/Singly-linked-list-Element-.../Delphi/singly-linked-list-element-...

59 lines
1.9 KiB
Plaintext

// Using the same type defs from the one way list example.
Type
// The pointer to the list structure
pOneWayList = ^OneWayList;
// The list structure
OneWayList = record
pData : pointer ;
Next : pOneWayList ;
end;
// I will illustrate a simple function that will return a pointer to the
// new node or it will return NIL. In this example I will always insert
// right, to keep the code clear. Since I am using a function all operations
// for the new node will be conducted on the functions result. This seems
// somewhat counter intuitive, but it is the simplest way to accomplish this.
Function InsertNode(VAR CurrentNode:pOneWayList): pOneWayList
begin
// I try not to introduce different parts of the language, and keep each
// example to just the code required. in this case it is important to use
// a try/except block. In any OS that is multi-threaded and has many apps
// running at the same time, you cannot rely on a call to check memory available
// and then attempting to allocate. In the time between the two, another
// program may have grabbed the memory you were trying to get.
Try
// Try to allocate enough memory for a variable the size of OneWayList
GetMem(Result,SizeOf(OneWayList));
Except
On EOutOfMemoryError do
begin
Result := NIL
exit;
end;
end;
// Initialize the variable.
Result.Next := NIL ;
Reuslt.pdata := NIL ;
// Ok now we will insert to the right.
// Is the Next pointer of CurrentNode Nil? If it is we are just tacking
// on to the end of the list.
if CurrentNode.Next = NIL then
CurrentNode.Next := Result
else
// We are inserting into the middle of this list
Begin
Result.Next := CurrentNode.Next ;
CurrentNode.Next := result ;
end;
end;