59 lines
1.9 KiB
Plaintext
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;
|