``````{
³ I'm trying to understand the rudiments of linked lists

³ 4) What are common uses for linked lists?  Is any one particular form
³    (oneway, circular etc ) preferred or used over any other form?

One use is to maintain queues.  New people, requests, or jobs come in at
the end of the line (or break in with priority), but once the head of
the line has been serviced, there is no need to maintain its location in
the queue.  I wrote the following last semester:
---------------------------------------------------------------
Purpose:
Maintains a queue of jobs and priorities of those jobs in a linked list.
The user will be prompted for job number and priority and can list the
queue, remove a job from the front of the queue (as if it ran), and stop
the program.  A count of jobs outstanding at the end will be displayed. }

type
PriRange = 0 .. 9;
JobPnt   = ^JobNode;
Jobnode  = RECORD
Numb     : integer;
Priority : PriRange;
END;

procedure addrec(var Start : JobPnt; comprec : Jobnode);
var
curr,
next,
this  : JobPnt;
found : boolean;
begin
new(this);
this^.Numb := comprec.Numb;
this^.Priority := comprec.Priority;
if Start = NIL then
begin
Start := this;   {Points to node just built}
Start^.Link := NIL; {Is end of list}
end
else    {Chain exists, find a place to insert it}
if comprec.Priority > Start^.Priority then
begin
this^.Link := Start;     {Prep for a new beg of chain}
Start := this
end {Condition for insert at beg of chain}
else
begin {Begin loop to insert after beg of chain}
found := false;  {To initialize}
curr  := start;
begin
if (next = NIL) or (comprec.Priority > next^.Priority) then
found := true;
curr:= next  {another iteration needed}
end;
{Have found this^ goes after curr^ and before next^}
this^.Link := next; {Chain to end (even if NIL)}
end;
end;

procedure remove(Var Start : JobPnt);
var
hold : JobPnt;
begin
if Start = NIL then
Writeln('Cannot remove from empty queue', chr(7))
else
begin
hold := Start^.Link; {Save 1st node of new chain}
dispose(Start);     {Delete org from chain}
Start := hold;       {Reset to new next job}
end;
end;

procedure list(Start : JobPnt); {List all jobs in queue. "var" omitted}
begin
if Start = NIL then
Writeln('No jobs in queue')
else
begin
Writeln('Job No     Priority');
Writeln;
while Start <> NIL do
begin
Writeln('  ',Start^.Numb : 3, '          ', Start^.Priority);
end;
Writeln;
Writeln('End of List');
end;
end;

{Main Procedure starts here}
var
cntr  : integer;
build : JobNode;
work,
Start : JobPnt;
Achar : char;

begin
Start := NIL; {Empty at first}
cntr  := 0;
REPEAT
Write('Enter (S)top, (R)emove, (L)ist, or A jobnumb priority to');

CASE Achar of
'A', 'a' :
begin
REPEAT
if (build.Priority < 0) or (build.priority > 9) then
Write(chr(7), 'Priority between 0 and 9, try again ');
UNTIL (build.Priority >= 0) and (build.Priority <= 9);
end;

'R', 'r' :
begin
remove(Start);
end;

'L', 'l' :
begin
list(Start);
end;

'S', 's' : Readln; {Will wait until out of CASE loop}

else
begin
Writeln('Invalid option',chr(7))
end;
end;

UNTIL (Achar = 's') or (Achar = 'S');
work := start;
while work <> NIL do
begin
cntr := cntr + 1;